blob: e4825f0489a9feec4ae4a986c21c4a052830508c [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).
84 x16 ip scratch reg
85 x17 ip2 scratch reg (used by macros)
86
87Macros are provided for common operations. They MUST NOT alter unspecified registers or condition
88codes.
89*/
90
91/*
92 * This is a #include, not a %include, because we want the C pre-processor
93 * to expand the macros into assembler assignment statements.
94 */
95#include "asm_support.h"
96
Bill Buzbeefd522f92016-02-11 22:37:42 +000097#define MTERP_PROFILE_BRANCHES 1
98#define MTERP_LOGGING 0
99
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000100/* During bringup, we'll use the shadow frame model instead of xFP */
101/* single-purpose registers, given names for clarity */
102#define xPC x20
103#define xFP x21
104#define xSELF x22
105#define xINST x23
106#define wINST w23
107#define xIBASE x24
108#define xREFS x25
109#define ip x16
110#define ip2 x17
111
112/*
113 * Instead of holding a pointer to the shadow frame, we keep xFP at the base of the vregs. So,
114 * to access other shadow frame fields, we need to use a backwards offset. Define those here.
115 */
116#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET)
117#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET)
118#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET)
119#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET)
120#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET)
121#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET)
122#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET)
123#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET)
124#define OFF_FP_SHADOWFRAME (-SHADOWFRAME_VREGS_OFFSET)
125
126/*
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000127 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects. Must
128 * be done *before* something throws.
129 *
130 * It's okay to do this more than once.
131 *
132 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped
133 * dex byte codes. However, the rest of the runtime expects dex pc to be an instruction
134 * offset into the code_items_[] array. For effiency, we will "export" the
135 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC
136 * to convert to a dex pc when needed.
137 */
138.macro EXPORT_PC
139 str xPC, [xFP, #OFF_FP_DEX_PC_PTR]
140.endm
141
142/*
143 * Fetch the next instruction from xPC into wINST. Does not advance xPC.
144 */
145.macro FETCH_INST
146 ldrh wINST, [xPC]
147.endm
148
149/*
150 * Fetch the next instruction from the specified offset. Advances xPC
151 * to point to the next instruction. "_count" is in 16-bit code units.
152 *
153 * Because of the limited size of immediate constants on ARM, this is only
154 * suitable for small forward movements (i.e. don't try to implement "goto"
155 * with this).
156 *
157 * This must come AFTER anything that can throw an exception, or the
158 * exception catch may miss. (This also implies that it must come after
159 * EXPORT_PC.)
160 */
161.macro FETCH_ADVANCE_INST count
162 ldrh wINST, [xPC, #((\count)*2)]!
163.endm
164
165/*
166 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
167 * src and dest registers are parameterized (not hard-wired to xPC and xINST).
168 */
169.macro PREFETCH_ADVANCE_INST dreg, sreg, count
170 ldrh \dreg, [\sreg, #((\count)*2)]!
171.endm
172
173/*
174 * Similar to FETCH_ADVANCE_INST, but does not update xPC. Used to load
175 * xINST ahead of possible exception point. Be sure to manually advance xPC
176 * later.
177 */
178.macro PREFETCH_INST count
179 ldrh wINST, [xPC, #((\count)*2)]
180.endm
181
182/* Advance xPC by some number of code units. */
183.macro ADVANCE count
184 add xPC, xPC, #((\count)*2)
185.endm
186
187/*
188 * Fetch the next instruction from an offset specified by _reg and advance xPC.
189 * xPC to point to the next instruction. "_reg" must specify the distance
190 * in bytes, *not* 16-bit code units, and may be a signed value. Must not set flags.
191 *
192 */
193.macro FETCH_ADVANCE_INST_RB reg
194 add xPC, xPC, \reg, sxtw
195 ldrh wINST, [xPC]
196.endm
197
198/*
199 * Fetch a half-word code unit from an offset past the current PC. The
200 * "_count" value is in 16-bit code units. Does not advance xPC.
201 *
202 * The "_S" variant works the same but treats the value as signed.
203 */
204.macro FETCH reg, count
205 ldrh \reg, [xPC, #((\count)*2)]
206.endm
207
208.macro FETCH_S reg, count
209 ldrsh \reg, [xPC, #((\count)*2)]
210.endm
211
212/*
213 * Fetch one byte from an offset past the current PC. Pass in the same
214 * "_count" as you would for FETCH, and an additional 0/1 indicating which
215 * byte of the halfword you want (lo/hi).
216 */
217.macro FETCH_B reg, count, byte
218 ldrb \reg, [xPC, #((\count)*2+(\byte))]
219.endm
220
221/*
222 * Put the instruction's opcode field into the specified register.
223 */
224.macro GET_INST_OPCODE reg
225 and \reg, xINST, #255
226.endm
227
228/*
229 * Put the prefetched instruction's opcode field into the specified register.
230 */
231.macro GET_PREFETCHED_OPCODE oreg, ireg
232 and \oreg, \ireg, #255
233.endm
234
235/*
236 * Begin executing the opcode in _reg. Clobbers reg
237 */
238
239.macro GOTO_OPCODE reg
240 add \reg, xIBASE, \reg, lsl #7
241 br \reg
242.endm
243.macro GOTO_OPCODE_BASE base,reg
244 add \reg, \base, \reg, lsl #7
245 br \reg
246.endm
247
248/*
249 * Get/set the 32-bit value from a Dalvik register.
250 */
251.macro GET_VREG reg, vreg
252 ldr \reg, [xFP, \vreg, uxtw #2]
253.endm
254.macro SET_VREG reg, vreg
255 str \reg, [xFP, \vreg, uxtw #2]
256 str wzr, [xREFS, \vreg, uxtw #2]
257.endm
258.macro SET_VREG_OBJECT reg, vreg, tmpreg
259 str \reg, [xFP, \vreg, uxtw #2]
260 str \reg, [xREFS, \vreg, uxtw #2]
261.endm
262
263/*
264 * Get/set the 64-bit value from a Dalvik register.
265 * TUNING: can we do better here?
266 */
267.macro GET_VREG_WIDE reg, vreg
268 add ip2, xFP, \vreg, lsl #2
269 ldr \reg, [ip2]
270.endm
271.macro SET_VREG_WIDE reg, vreg
272 add ip2, xFP, \vreg, lsl #2
273 str \reg, [ip2]
274 add ip2, xREFS, \vreg, lsl #2
275 str xzr, [ip2]
276.endm
277
278/*
279 * Convert a virtual register index into an address.
280 */
281.macro VREG_INDEX_TO_ADDR reg, vreg
282 add \reg, xFP, \vreg, lsl #2 /* WARNING/FIXME: handle shadow frame vreg zero if store */
283.endm
284
285/*
286 * Refresh handler table.
287 */
288.macro REFRESH_IBASE
289 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
290.endm
291
292/* File: arm64/entry.S */
293/*
294 * Copyright (C) 2016 The Android Open Source Project
295 *
296 * Licensed under the Apache License, Version 2.0 (the "License");
297 * you may not use this file except in compliance with the License.
298 * You may obtain a copy of the License at
299 *
300 * http://www.apache.org/licenses/LICENSE-2.0
301 *
302 * Unless required by applicable law or agreed to in writing, software
303 * distributed under the License is distributed on an "AS IS" BASIS,
304 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
305 * See the License for the specific language governing permissions and
306 * limitations under the License.
307 */
308
309 .text
310
311/*
312 * Interpreter entry point.
313 * On entry:
314 * x0 Thread* self/
315 * x1 code_item
316 * x2 ShadowFrame
317 * x3 JValue* result_register
318 *
319 */
320 .global ExecuteMterpImpl
321 .type ExecuteMterpImpl, %function
322 .balign 16
323
324ExecuteMterpImpl:
325 .cfi_startproc
326 stp xIBASE, xREFS, [sp, #-64]!
327 stp xSELF, xINST, [sp, #16]
328 stp xPC, xFP, [sp, #32]
329 stp fp, lr, [sp, #48]
330 add fp, sp, #48
331
332 /* Remember the return register */
333 str x3, [x2, #SHADOWFRAME_RESULT_REGISTER_OFFSET]
334
335 /* Remember the code_item */
336 str x1, [x2, #SHADOWFRAME_CODE_ITEM_OFFSET]
337
338 /* set up "named" registers */
339 mov xSELF, x0
340 ldr w0, [x2, #SHADOWFRAME_NUMBER_OF_VREGS_OFFSET]
341 add xFP, x2, #SHADOWFRAME_VREGS_OFFSET // point to insns[] (i.e. - the dalivk byte code).
342 add xREFS, xFP, w0, lsl #2 // point to reference array in shadow frame
343 ldr w0, [x2, #SHADOWFRAME_DEX_PC_OFFSET] // Get starting dex_pc.
344 add xPC, x1, #CODEITEM_INSNS_OFFSET // Point to base of insns[]
345 add xPC, xPC, w0, lsl #1 // Create direct pointer to 1st dex opcode
346 EXPORT_PC
347
348 /* Starting ibase */
349 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
350
351 /* start executing the instruction at rPC */
352 FETCH_INST // load wINST from rPC
353 GET_INST_OPCODE ip // extract opcode from wINST
354 GOTO_OPCODE ip // jump to next instruction
355 /* NOTE: no fallthrough */
356
357
358 .global artMterpAsmInstructionStart
359 .type artMterpAsmInstructionStart, %function
360artMterpAsmInstructionStart = .L_op_nop
361 .text
362
363/* ------------------------------ */
364 .balign 128
365.L_op_nop: /* 0x00 */
366/* File: arm64/op_nop.S */
367 FETCH_ADVANCE_INST 1 // advance to next instr, load rINST
368 GET_INST_OPCODE ip // ip<- opcode from rINST
369 GOTO_OPCODE ip // execute it
370
371/* ------------------------------ */
372 .balign 128
373.L_op_move: /* 0x01 */
374/* File: arm64/op_move.S */
375 /* for move, move-object, long-to-int */
376 /* op vA, vB */
377 lsr w1, wINST, #12 // x1<- B from 15:12
378 ubfx w0, wINST, #8, #4 // x0<- A from 11:8
379 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
380 GET_VREG w2, w1 // x2<- fp[B]
381 GET_INST_OPCODE ip // ip<- opcode from wINST
382 .if 0
383 SET_VREG_OBJECT w2, w0 // fp[A]<- x2
384 .else
385 SET_VREG w2, w0 // fp[A]<- x2
386 .endif
387 GOTO_OPCODE ip // execute next instruction
388
389/* ------------------------------ */
390 .balign 128
391.L_op_move_from16: /* 0x02 */
392/* File: arm64/op_move_from16.S */
393 /* for: move/from16, move-object/from16 */
394 /* op vAA, vBBBB */
395 FETCH w1, 1 // r1<- BBBB
396 lsr w0, wINST, #8 // r0<- AA
397 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
398 GET_VREG w2, w1 // r2<- fp[BBBB]
399 GET_INST_OPCODE ip // extract opcode from wINST
400 .if 0
401 SET_VREG_OBJECT w2, w0 // fp[AA]<- r2
402 .else
403 SET_VREG w2, w0 // fp[AA]<- r2
404 .endif
405 GOTO_OPCODE ip // jump to next instruction
406
407/* ------------------------------ */
408 .balign 128
409.L_op_move_16: /* 0x03 */
410/* File: arm64/op_move_16.S */
411 /* for: move/16, move-object/16 */
412 /* op vAAAA, vBBBB */
413 FETCH w1, 2 // w1<- BBBB
414 FETCH w0, 1 // w0<- AAAA
415 FETCH_ADVANCE_INST 3 // advance xPC, load xINST
416 GET_VREG w2, w1 // w2<- fp[BBBB]
417 GET_INST_OPCODE ip // extract opcode from xINST
418 .if 0
419 SET_VREG_OBJECT w2, w0 // fp[AAAA]<- w2
420 .else
421 SET_VREG w2, w0 // fp[AAAA]<- w2
422 .endif
423 GOTO_OPCODE ip // jump to next instruction
424
425/* ------------------------------ */
426 .balign 128
427.L_op_move_wide: /* 0x04 */
428/* File: arm64/op_move_wide.S */
429 /* move-wide vA, vB */
430 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
431 lsr w3, wINST, #12 // w3<- B
432 ubfx w2, wINST, #8, #4 // w2<- A
433 GET_VREG_WIDE x3, w3
434 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
435 GET_INST_OPCODE ip // extract opcode from wINST
436 SET_VREG_WIDE x3, w2
437 GOTO_OPCODE ip // jump to next instruction
438
439/* ------------------------------ */
440 .balign 128
441.L_op_move_wide_from16: /* 0x05 */
442/* File: arm64/op_move_wide_from16.S */
443 /* move-wide/from16 vAA, vBBBB */
444 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
445 FETCH w3, 1 // w3<- BBBB
446 lsr w2, wINST, #8 // w2<- AA
447 GET_VREG_WIDE x3, w3
448 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
449 GET_INST_OPCODE ip // extract opcode from wINST
450 SET_VREG_WIDE x3, w2
451 GOTO_OPCODE ip // jump to next instruction
452
453/* ------------------------------ */
454 .balign 128
455.L_op_move_wide_16: /* 0x06 */
456/* File: arm64/op_move_wide_16.S */
457 /* move-wide/16 vAAAA, vBBBB */
458 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
459 FETCH w3, 2 // w3<- BBBB
460 FETCH w2, 1 // w2<- AAAA
461 GET_VREG_WIDE x3, w3
462 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
463 SET_VREG_WIDE x3, w2
464 GET_INST_OPCODE ip // extract opcode from rINST
465 GOTO_OPCODE ip // jump to next instruction
466
467/* ------------------------------ */
468 .balign 128
469.L_op_move_object: /* 0x07 */
470/* File: arm64/op_move_object.S */
471/* File: arm64/op_move.S */
472 /* for move, move-object, long-to-int */
473 /* op vA, vB */
474 lsr w1, wINST, #12 // x1<- B from 15:12
475 ubfx w0, wINST, #8, #4 // x0<- A from 11:8
476 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
477 GET_VREG w2, w1 // x2<- fp[B]
478 GET_INST_OPCODE ip // ip<- opcode from wINST
479 .if 1
480 SET_VREG_OBJECT w2, w0 // fp[A]<- x2
481 .else
482 SET_VREG w2, w0 // fp[A]<- x2
483 .endif
484 GOTO_OPCODE ip // execute next instruction
485
486
487/* ------------------------------ */
488 .balign 128
489.L_op_move_object_from16: /* 0x08 */
490/* File: arm64/op_move_object_from16.S */
491/* File: arm64/op_move_from16.S */
492 /* for: move/from16, move-object/from16 */
493 /* op vAA, vBBBB */
494 FETCH w1, 1 // r1<- BBBB
495 lsr w0, wINST, #8 // r0<- AA
496 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
497 GET_VREG w2, w1 // r2<- fp[BBBB]
498 GET_INST_OPCODE ip // extract opcode from wINST
499 .if 1
500 SET_VREG_OBJECT w2, w0 // fp[AA]<- r2
501 .else
502 SET_VREG w2, w0 // fp[AA]<- r2
503 .endif
504 GOTO_OPCODE ip // jump to next instruction
505
506
507/* ------------------------------ */
508 .balign 128
509.L_op_move_object_16: /* 0x09 */
510/* File: arm64/op_move_object_16.S */
511/* File: arm64/op_move_16.S */
512 /* for: move/16, move-object/16 */
513 /* op vAAAA, vBBBB */
514 FETCH w1, 2 // w1<- BBBB
515 FETCH w0, 1 // w0<- AAAA
516 FETCH_ADVANCE_INST 3 // advance xPC, load xINST
517 GET_VREG w2, w1 // w2<- fp[BBBB]
518 GET_INST_OPCODE ip // extract opcode from xINST
519 .if 1
520 SET_VREG_OBJECT w2, w0 // fp[AAAA]<- w2
521 .else
522 SET_VREG w2, w0 // fp[AAAA]<- w2
523 .endif
524 GOTO_OPCODE ip // jump to next instruction
525
526
527/* ------------------------------ */
528 .balign 128
529.L_op_move_result: /* 0x0a */
530/* File: arm64/op_move_result.S */
531 /* for: move-result, move-result-object */
532 /* op vAA */
533 lsr w2, wINST, #8 // r2<- AA
534 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
535 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType.
536 ldr w0, [x0] // r0 <- result.i.
537 GET_INST_OPCODE ip // extract opcode from wINST
538 .if 0
539 SET_VREG_OBJECT w0, w2, w1 // fp[AA]<- r0
540 .else
541 SET_VREG w0, w2 // fp[AA]<- r0
542 .endif
543 GOTO_OPCODE ip // jump to next instruction
544
545/* ------------------------------ */
546 .balign 128
547.L_op_move_result_wide: /* 0x0b */
548/* File: arm64/op_move_result_wide.S */
549 /* for: move-result-wide */
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 x0, [x0] // r0 <- result.i.
555 GET_INST_OPCODE ip // extract opcode from wINST
556 SET_VREG_WIDE x0, x2 // fp[AA]<- r0
557 GOTO_OPCODE ip // jump to next instruction
558
559/* ------------------------------ */
560 .balign 128
561.L_op_move_result_object: /* 0x0c */
562/* File: arm64/op_move_result_object.S */
563/* File: arm64/op_move_result.S */
564 /* for: move-result, move-result-object */
565 /* op vAA */
566 lsr w2, wINST, #8 // r2<- AA
567 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
568 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType.
569 ldr w0, [x0] // r0 <- result.i.
570 GET_INST_OPCODE ip // extract opcode from wINST
571 .if 1
572 SET_VREG_OBJECT w0, w2, w1 // fp[AA]<- r0
573 .else
574 SET_VREG w0, w2 // fp[AA]<- r0
575 .endif
576 GOTO_OPCODE ip // jump to next instruction
577
578
579/* ------------------------------ */
580 .balign 128
581.L_op_move_exception: /* 0x0d */
582/* File: arm64/op_move_exception.S */
583 /* move-exception vAA */
584 lsr w2, wINST, #8 // w2<- AA
585 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
586 mov x1, #0 // w1<- 0
587 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
588 SET_VREG_OBJECT w3, w2 // fp[AA]<- exception obj
589 GET_INST_OPCODE ip // extract opcode from rINST
590 str x1, [xSELF, #THREAD_EXCEPTION_OFFSET] // clear exception
591 GOTO_OPCODE ip // jump to next instruction
592
593/* ------------------------------ */
594 .balign 128
595.L_op_return_void: /* 0x0e */
596/* File: arm64/op_return_void.S */
597 .extern MterpThreadFenceForConstructor
598 bl MterpThreadFenceForConstructor
599 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
600 mov x0, xSELF
601 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
602 b.ne .Lop_return_void_check
603.Lop_return_void_return:
604 mov x0, #0
605 b MterpReturn
606.Lop_return_void_check:
607 bl MterpSuspendCheck // (self)
608 b .Lop_return_void_return
609
610/* ------------------------------ */
611 .balign 128
612.L_op_return: /* 0x0f */
613/* File: arm64/op_return.S */
614 /*
615 * Return a 32-bit value.
616 *
617 * for: return, return-object
618 */
619 /* op vAA */
620 .extern MterpThreadFenceForConstructor
621 bl MterpThreadFenceForConstructor
622 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
623 mov x0, xSELF
624 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
625 b.ne .Lop_return_check
626.Lop_return_return:
627 lsr w2, wINST, #8 // r2<- AA
628 GET_VREG w0, w2 // r0<- vAA
629 b MterpReturn
630.Lop_return_check:
631 bl MterpSuspendCheck // (self)
632 b .Lop_return_return
633
634/* ------------------------------ */
635 .balign 128
636.L_op_return_wide: /* 0x10 */
637/* File: arm64/op_return_wide.S */
638 /*
639 * Return a 64-bit value.
640 */
641 /* return-wide vAA */
642 /* op vAA */
643 .extern MterpThreadFenceForConstructor
644 bl MterpThreadFenceForConstructor
645 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
646 mov x0, xSELF
647 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
648 b.ne .Lop_return_wide_check
649.Lop_return_wide_return:
650 lsr w2, wINST, #8 // w2<- AA
651 GET_VREG_WIDE x0, w2 // x0<- vAA
652 b MterpReturn
653.Lop_return_wide_check:
654 bl MterpSuspendCheck // (self)
655 b .Lop_return_wide_return
656
657/* ------------------------------ */
658 .balign 128
659.L_op_return_object: /* 0x11 */
660/* File: arm64/op_return_object.S */
661/* File: arm64/op_return.S */
662 /*
663 * Return a 32-bit value.
664 *
665 * for: return, return-object
666 */
667 /* op vAA */
668 .extern MterpThreadFenceForConstructor
669 bl MterpThreadFenceForConstructor
670 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
671 mov x0, xSELF
672 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
673 b.ne .Lop_return_object_check
674.Lop_return_object_return:
675 lsr w2, wINST, #8 // r2<- AA
676 GET_VREG w0, w2 // r0<- vAA
677 b MterpReturn
678.Lop_return_object_check:
679 bl MterpSuspendCheck // (self)
680 b .Lop_return_object_return
681
682
683/* ------------------------------ */
684 .balign 128
685.L_op_const_4: /* 0x12 */
686/* File: arm64/op_const_4.S */
687 /* const/4 vA, #+B */
688 lsl w1, wINST, #16 // w1<- Bxxx0000
689 ubfx w0, wINST, #8, #4 // w0<- A
690 FETCH_ADVANCE_INST 1 // advance xPC, load wINST
691 asr w1, w1, #28 // w1<- sssssssB (sign-extended)
692 GET_INST_OPCODE ip // ip<- opcode from xINST
693 SET_VREG w1, w0 // fp[A]<- w1
694 GOTO_OPCODE ip // execute next instruction
695
696/* ------------------------------ */
697 .balign 128
698.L_op_const_16: /* 0x13 */
699/* File: arm64/op_const_16.S */
700 /* const/16 vAA, #+BBBB */
701 FETCH_S w0, 1 // w0<- ssssBBBB (sign-extended
702 lsr w3, wINST, #8 // w3<- AA
703 FETCH_ADVANCE_INST 2 // advance xPC, load wINST
704 SET_VREG w0, w3 // vAA<- w0
705 GET_INST_OPCODE ip // extract opcode from wINST
706 GOTO_OPCODE ip // jump to next instruction
707
708/* ------------------------------ */
709 .balign 128
710.L_op_const: /* 0x14 */
711/* File: arm64/op_const.S */
712 /* const vAA, #+BBBBbbbb */
713 lsr w3, wINST, #8 // w3<- AA
714 FETCH w0, 1 // w0<- bbbb (low
715 FETCH w1, 2 // w1<- BBBB (high
716 FETCH_ADVANCE_INST 3 // advance rPC, load wINST
717 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb
718 GET_INST_OPCODE ip // extract opcode from wINST
719 SET_VREG w0, w3 // vAA<- w0
720 GOTO_OPCODE ip // jump to next instruction
721
722/* ------------------------------ */
723 .balign 128
724.L_op_const_high16: /* 0x15 */
725/* File: arm64/op_const_high16.S */
726 /* const/high16 vAA, #+BBBB0000 */
727 FETCH w0, 1 // r0<- 0000BBBB (zero-extended
728 lsr w3, wINST, #8 // r3<- AA
729 lsl w0, w0, #16 // r0<- BBBB0000
730 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
731 SET_VREG w0, w3 // vAA<- r0
732 GET_INST_OPCODE ip // extract opcode from rINST
733 GOTO_OPCODE ip // jump to next instruction
734
735/* ------------------------------ */
736 .balign 128
737.L_op_const_wide_16: /* 0x16 */
738/* File: arm64/op_const_wide_16.S */
739 /* const-wide/16 vAA, #+BBBB */
740 FETCH_S w0, 1 // w0<- ssssBBBB (sign-extended
741 lsr w3, wINST, #8 // w3<- AA
742 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
743 sbfm x0, x0, 0, 31
744 GET_INST_OPCODE ip // extract opcode from rINST
745 SET_VREG_WIDE x0, w3
746 GOTO_OPCODE ip // jump to next instruction
747
748/* ------------------------------ */
749 .balign 128
750.L_op_const_wide_32: /* 0x17 */
751/* File: arm64/op_const_wide_32.S */
752 /* const-wide/32 vAA, #+BBBBbbbb */
753 FETCH w0, 1 // w0<- 0000bbbb (low)
754 lsr w3, wINST, #8 // w3<- AA
755 FETCH_S w2, 2 // w2<- ssssBBBB (high)
756 FETCH_ADVANCE_INST 3 // advance rPC, load wINST
757 GET_INST_OPCODE ip // extract opcode from wINST
758 orr w0, w0, w2, lsl #16 // w0<- BBBBbbbb
759 sbfm x0, x0, 0, 31
760 SET_VREG_WIDE x0, w3
761 GOTO_OPCODE ip // jump to next instruction
762
763/* ------------------------------ */
764 .balign 128
765.L_op_const_wide: /* 0x18 */
766/* File: arm64/op_const_wide.S */
767 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
768 FETCH w0, 1 // w0<- bbbb (low)
769 FETCH w1, 2 // w1<- BBBB (low middle)
770 FETCH w2, 3 // w2<- hhhh (high middle)
771 FETCH w3, 4 // w3<- HHHH (high)
772 lsr w4, wINST, #8 // r4<- AA
773 FETCH_ADVANCE_INST 5 // advance rPC, load wINST
774 GET_INST_OPCODE ip // extract opcode from wINST
775 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb
776 orr x0, x0, x2, lsl #32 // w0<- hhhhBBBBbbbb
777 orr x0, x0, x3, lsl #48 // w0<- HHHHhhhhBBBBbbbb
778 SET_VREG_WIDE x0, w4
779 GOTO_OPCODE ip // jump to next instruction
780
781/* ------------------------------ */
782 .balign 128
783.L_op_const_wide_high16: /* 0x19 */
784/* File: arm64/op_const_wide_high16.S */
785 /* const-wide/high16 vAA, #+BBBB000000000000 */
786 FETCH w0, 1 // w0<- 0000BBBB (zero-extended)
787 lsr w1, wINST, #8 // w1<- AA
788 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
789 lsl x0, x0, #48
790 SET_VREG_WIDE x0, w1
791 GET_INST_OPCODE ip // extract opcode from wINST
792 GOTO_OPCODE ip // jump to next instruction
793
794/* ------------------------------ */
795 .balign 128
796.L_op_const_string: /* 0x1a */
797/* File: arm64/op_const_string.S */
798 /* const/string vAA, String//BBBB */
799 EXPORT_PC
800 FETCH w0, 1 // w0<- BBBB
801 lsr w1, wINST, #8 // w1<- AA
802 add x2, xFP, #OFF_FP_SHADOWFRAME
803 mov x3, xSELF
804 bl MterpConstString // (index, tgt_reg, shadow_frame, self)
805 PREFETCH_INST 2 // load rINST
806 cbnz w0, MterpPossibleException // let reference interpreter deal with it.
807 ADVANCE 2 // advance rPC
808 GET_INST_OPCODE ip // extract opcode from rINST
809 GOTO_OPCODE ip // jump to next instruction
810
811/* ------------------------------ */
812 .balign 128
813.L_op_const_string_jumbo: /* 0x1b */
814/* File: arm64/op_const_string_jumbo.S */
815 /* const/string vAA, String//BBBBBBBB */
816 EXPORT_PC
817 FETCH w0, 1 // w0<- bbbb (low
818 FETCH w2, 2 // w2<- BBBB (high
819 lsr w1, wINST, #8 // w1<- AA
820 orr w0, w0, w2, lsl #16 // w1<- BBBBbbbb
821 add x2, xFP, #OFF_FP_SHADOWFRAME
822 mov x3, xSELF
823 bl MterpConstString // (index, tgt_reg, shadow_frame, self)
824 PREFETCH_INST 3 // advance rPC
825 cbnz w0, MterpPossibleException // let reference interpreter deal with it.
826 ADVANCE 3 // advance rPC
827 GET_INST_OPCODE ip // extract opcode from rINST
828 GOTO_OPCODE ip // jump to next instruction
829
830/* ------------------------------ */
831 .balign 128
832.L_op_const_class: /* 0x1c */
833/* File: arm64/op_const_class.S */
834 /* const/class vAA, Class//BBBB */
835 EXPORT_PC
836 FETCH w0, 1 // w0<- BBBB
837 lsr w1, wINST, #8 // w1<- AA
838 add x2, xFP, #OFF_FP_SHADOWFRAME
839 mov x3, xSELF
840 bl MterpConstClass // (index, tgt_reg, shadow_frame, self)
841 PREFETCH_INST 2
842 cbnz w0, MterpPossibleException
843 ADVANCE 2
844 GET_INST_OPCODE ip // extract opcode from rINST
845 GOTO_OPCODE ip // jump to next instruction
846
847/* ------------------------------ */
848 .balign 128
849.L_op_monitor_enter: /* 0x1d */
850/* File: arm64/op_monitor_enter.S */
851 /*
852 * Synchronize on an object.
853 */
854 /* monitor-enter vAA */
855 EXPORT_PC
856 lsr w2, wINST, #8 // w2<- AA
857 GET_VREG w0, w2 // w0<- vAA (object)
858 mov x1, xSELF // w1<- self
859 bl artLockObjectFromCode
860 cbnz w0, MterpException
861 FETCH_ADVANCE_INST 1
862 GET_INST_OPCODE ip // extract opcode from rINST
863 GOTO_OPCODE ip // jump to next instruction
864
865/* ------------------------------ */
866 .balign 128
867.L_op_monitor_exit: /* 0x1e */
868/* File: arm64/op_monitor_exit.S */
869 /*
870 * Unlock an object.
871 *
872 * Exceptions that occur when unlocking a monitor need to appear as
873 * if they happened at the following instruction. See the Dalvik
874 * instruction spec.
875 */
876 /* monitor-exit vAA */
877 EXPORT_PC
878 lsr w2, wINST, #8 // w2<- AA
879 GET_VREG w0, w2 // w0<- vAA (object)
880 mov x1, xSELF // w0<- self
881 bl artUnlockObjectFromCode // w0<- success for unlock(self, obj)
882 cbnz w0, MterpException
883 FETCH_ADVANCE_INST 1 // before throw: advance rPC, load rINST
884 GET_INST_OPCODE ip // extract opcode from rINST
885 GOTO_OPCODE ip // jump to next instruction
886
887/* ------------------------------ */
888 .balign 128
889.L_op_check_cast: /* 0x1f */
890/* File: arm64/op_check_cast.S */
891 /*
892 * Check to see if a cast from one class to another is allowed.
893 */
894 /* check-cast vAA, class//BBBB */
895 EXPORT_PC
896 FETCH w0, 1 // w0<- BBBB
897 lsr w1, wINST, #8 // w1<- AA
898 VREG_INDEX_TO_ADDR x1, w1 // w1<- &object
899 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- method
900 mov x3, xSELF // w3<- self
901 bl MterpCheckCast // (index, &obj, method, self)
902 PREFETCH_INST 2
903 cbnz w0, MterpPossibleException
904 ADVANCE 2
905 GET_INST_OPCODE ip // extract opcode from rINST
906 GOTO_OPCODE ip // jump to next instruction
907
908/* ------------------------------ */
909 .balign 128
910.L_op_instance_of: /* 0x20 */
911/* File: arm64/op_instance_of.S */
912 /*
913 * Check to see if an object reference is an instance of a class.
914 *
915 * Most common situation is a non-null object, being compared against
916 * an already-resolved class.
917 */
918 /* instance-of vA, vB, class//CCCC */
919 EXPORT_PC
920 FETCH w0, 1 // w0<- CCCC
921 lsr w1, wINST, #12 // w1<- B
922 VREG_INDEX_TO_ADDR x1, w1 // w1<- &object
923 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- method
924 mov x3, xSELF // w3<- self
925 bl MterpInstanceOf // (index, &obj, method, self)
926 ldr x1, [xSELF, #THREAD_EXCEPTION_OFFSET]
927 lsr w2, wINST, #8 // w2<- A+
928 and w2, w2, #15 // w2<- A
929 PREFETCH_INST 2
930 cbnz x1, MterpException
931 ADVANCE 2 // advance rPC
932 SET_VREG w0, w2 // vA<- w0
933 GET_INST_OPCODE ip // extract opcode from rINST
934 GOTO_OPCODE ip // jump to next instruction
935
936/* ------------------------------ */
937 .balign 128
938.L_op_array_length: /* 0x21 */
939/* File: arm64/op_array_length.S */
940 /*
941 * Return the length of an array.
942 */
943 lsr w1, wINST, #12 // w1<- B
944 ubfx w2, wINST, #8, #4 // w2<- A
945 GET_VREG w0, w1 // w0<- vB (object ref)
946 cbz w0, common_errNullObject // yup, fail
947 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
948 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- array length
949 GET_INST_OPCODE ip // extract opcode from rINST
950 SET_VREG w3, w2 // vB<- length
951 GOTO_OPCODE ip // jump to next instruction
952
953/* ------------------------------ */
954 .balign 128
955.L_op_new_instance: /* 0x22 */
956/* File: arm64/op_new_instance.S */
957 /*
958 * Create a new instance of a class.
959 */
960 /* new-instance vAA, class//BBBB */
961 EXPORT_PC
962 add x0, xFP, #OFF_FP_SHADOWFRAME
963 mov x1, xSELF
964 mov w2, wINST
965 bl MterpNewInstance // (shadow_frame, self, inst_data)
966 cbz w0, MterpPossibleException
967 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
968 GET_INST_OPCODE ip // extract opcode from rINST
969 GOTO_OPCODE ip // jump to next instruction
970
971/* ------------------------------ */
972 .balign 128
973.L_op_new_array: /* 0x23 */
974/* File: arm64/op_new_array.S */
975 /*
976 * Allocate an array of objects, specified with the array class
977 * and a count.
978 *
979 * The verifier guarantees that this is an array class, so we don't
980 * check for it here.
981 */
982 /* new-array vA, vB, class//CCCC */
983 EXPORT_PC
984 add x0, xFP, #OFF_FP_SHADOWFRAME
985 mov x1, xPC
986 mov w2, wINST
987 mov x3, xSELF
988 bl MterpNewArray
989 cbz w0, MterpPossibleException
990 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
991 GET_INST_OPCODE ip // extract opcode from rINST
992 GOTO_OPCODE ip // jump to next instruction
993
994/* ------------------------------ */
995 .balign 128
996.L_op_filled_new_array: /* 0x24 */
997/* File: arm64/op_filled_new_array.S */
998 /*
999 * Create a new array with elements filled from registers.
1000 *
1001 * for: filled-new-array, filled-new-array/range
1002 */
1003 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1004 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1005 .extern MterpFilledNewArray
1006 EXPORT_PC
1007 add x0, xFP, #OFF_FP_SHADOWFRAME
1008 mov x1, xPC
1009 mov x2, xSELF
1010 bl MterpFilledNewArray
1011 cbz w0, MterpPossibleException
1012 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1013 GET_INST_OPCODE ip // extract opcode from rINST
1014 GOTO_OPCODE ip // jump to next instruction
1015
1016/* ------------------------------ */
1017 .balign 128
1018.L_op_filled_new_array_range: /* 0x25 */
1019/* File: arm64/op_filled_new_array_range.S */
1020/* File: arm64/op_filled_new_array.S */
1021 /*
1022 * Create a new array with elements filled from registers.
1023 *
1024 * for: filled-new-array, filled-new-array/range
1025 */
1026 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1027 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1028 .extern MterpFilledNewArrayRange
1029 EXPORT_PC
1030 add x0, xFP, #OFF_FP_SHADOWFRAME
1031 mov x1, xPC
1032 mov x2, xSELF
1033 bl MterpFilledNewArrayRange
1034 cbz w0, MterpPossibleException
1035 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1036 GET_INST_OPCODE ip // extract opcode from rINST
1037 GOTO_OPCODE ip // jump to next instruction
1038
1039
1040/* ------------------------------ */
1041 .balign 128
1042.L_op_fill_array_data: /* 0x26 */
1043/* File: arm64/op_fill_array_data.S */
1044 /* fill-array-data vAA, +BBBBBBBB */
1045 EXPORT_PC
1046 FETCH w0, 1 // w0<- bbbb (lo)
1047 FETCH w1, 2 // w1<- BBBB (hi)
1048 lsr w3, wINST, #8 // w3<- AA
1049 orr w1, w0, w1, lsl #16 // w1<- BBBBbbbb
1050 GET_VREG w0, w3 // w0<- vAA (array object)
1051 add x1, xPC, w1, lsl #1 // w1<- PC + BBBBbbbb*2 (array data off.)
1052 bl MterpFillArrayData // (obj, payload)
1053 cbz w0, MterpPossibleException // exception?
1054 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1055 GET_INST_OPCODE ip // extract opcode from rINST
1056 GOTO_OPCODE ip // jump to next instruction
1057
1058/* ------------------------------ */
1059 .balign 128
1060.L_op_throw: /* 0x27 */
1061/* File: arm64/op_throw.S */
1062 /*
1063 * Throw an exception object in the current thread.
1064 */
1065 /* throw vAA */
1066 EXPORT_PC
1067 lsr w2, wINST, #8 // r2<- AA
1068 GET_VREG w1, w2 // r1<- vAA (exception object)
1069 cbz w1, common_errNullObject
1070 str x1, [xSELF, #THREAD_EXCEPTION_OFFSET] // thread->exception<- obj
1071 b MterpException
1072
1073/* ------------------------------ */
1074 .balign 128
1075.L_op_goto: /* 0x28 */
1076/* File: arm64/op_goto.S */
1077 /*
1078 * Unconditional branch, 8-bit offset.
1079 *
1080 * The branch distance is a signed code-unit offset, which we need to
1081 * double to get a byte offset.
1082 */
1083 /* goto +AA */
1084 /* tuning: use sbfx for 6t2+ targets */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001085 lsl w0, wINST, #16 // w0<- AAxx0000
Bill Buzbeefd522f92016-02-11 22:37:42 +00001086 asr wINST, w0, #24 // wINST<- ssssssAA (sign-extended)
1087#if MTERP_PROFILE_BRANCHES
1088 EXPORT_PC
1089 mov x0, xSELF
1090 add x1, xFP, #OFF_FP_SHADOWFRAME
1091 sbfm x2, xINST, 0, 31
1092 bl MterpProfileBranch // (self, shadow_frame, offset)
1093 cbnz w0, MterpOnStackReplacement // Note: offset must be in wINST
1094#endif
1095 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET] // Preload flags for MterpCheckSuspendAndContinue
1096 adds w1, wINST, wINST // Convert dalvik offset to byte offset, setting flags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001097 FETCH_ADVANCE_INST_RB w1 // load wINST and advance xPC
1098 // If backwards branch refresh rIBASE
1099 b.mi MterpCheckSuspendAndContinue
1100 GET_INST_OPCODE ip // extract opcode from wINST
1101 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001102
1103/* ------------------------------ */
1104 .balign 128
1105.L_op_goto_16: /* 0x29 */
1106/* File: arm64/op_goto_16.S */
1107 /*
1108 * Unconditional branch, 16-bit offset.
1109 *
1110 * The branch distance is a signed code-unit offset, which we need to
1111 * double to get a byte offset.
1112 */
1113 /* goto/16 +AAAA */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001114 FETCH_S wINST, 1 // wINST<- ssssAAAA (sign-extended)
1115#if MTERP_PROFILE_BRANCHES
1116 EXPORT_PC
1117 mov x0, xSELF
1118 add x1, xFP, #OFF_FP_SHADOWFRAME
1119 sbfm x2, xINST, 0, 31
1120 bl MterpProfileBranch // (self, shadow_frame, offset)
1121 cbnz w0, MterpOnStackReplacement // Note: offset must be in xINST
1122#endif
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001123 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001124 adds w1, wINST, wINST // w1<- byte offset, flags set
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001125 FETCH_ADVANCE_INST_RB w1 // update rPC, load rINST
1126 b.mi MterpCheckSuspendAndContinue
1127 GET_INST_OPCODE ip // extract opcode from rINST
1128 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001129
1130/* ------------------------------ */
1131 .balign 128
1132.L_op_goto_32: /* 0x2a */
1133/* File: arm64/op_goto_32.S */
1134 /*
1135 * Unconditional branch, 32-bit offset.
1136 *
1137 * The branch distance is a signed code-unit offset, which we need to
1138 * double to get a byte offset.
1139 *
1140 * Unlike most opcodes, this one is allowed to branch to itself, so
1141 * our "backward branch" test must be "<=0" instead of "<0". Because
1142 * we need the V bit set, we'll use an adds to convert from Dalvik
1143 * offset to byte offset.
1144 */
1145 /* goto/32 +AAAAAAAA */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001146 FETCH w0, 1 // w0<- aaaa (lo)
1147 FETCH w1, 2 // w1<- AAAA (hi)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001148 orr wINST, w0, w1, lsl #16 // wINST<- AAAAaaaa
1149#if MTERP_PROFILE_BRANCHES
1150 EXPORT_PC
1151 mov x0, xSELF
1152 add x1, xFP, #OFF_FP_SHADOWFRAME
1153 sbfm x2, xINST, 0, 31
1154 bl MterpProfileBranch // (self, shadow_frame, offset)
1155 cbnz w0, MterpOnStackReplacement // Note: offset must be in xINST
1156#endif
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001157 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001158 adds w1, wINST, wINST // w1<- byte offset
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001159 FETCH_ADVANCE_INST_RB w1 // update rPC, load xINST
1160 b.le MterpCheckSuspendAndContinue
1161 GET_INST_OPCODE ip // extract opcode from xINST
1162 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001163
1164/* ------------------------------ */
1165 .balign 128
1166.L_op_packed_switch: /* 0x2b */
1167/* File: arm64/op_packed_switch.S */
1168 /*
1169 * Handle a packed-switch or sparse-switch instruction. In both cases
1170 * we decode it and hand it off to a helper function.
1171 *
1172 * We don't really expect backward branches in a switch statement, but
1173 * they're perfectly legal, so we check for them here.
1174 *
1175 * for: packed-switch, sparse-switch
1176 */
1177 /* op vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001178 FETCH w0, 1 // w0<- bbbb (lo)
1179 FETCH w1, 2 // w1<- BBBB (hi)
1180 lsr w3, wINST, #8 // w3<- AA
1181 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb
1182 GET_VREG w1, w3 // w1<- vAA
1183 add x0, xPC, w0, lsl #1 // w0<- PC + BBBBbbbb*2
1184 bl MterpDoPackedSwitch // w0<- code-unit branch offset
Bill Buzbeefd522f92016-02-11 22:37:42 +00001185 sbfm xINST, x0, 0, 31
1186#if MTERP_PROFILE_BRANCHES
1187 EXPORT_PC
1188 mov x0, xSELF
1189 add x1, xFP, #OFF_FP_SHADOWFRAME
1190 mov x2, xINST
1191 bl MterpProfileBranch // (self, shadow_frame, offset)
1192 cbnz w0, MterpOnStackReplacement
1193#endif
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001194 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001195 adds w1, wINST, wINST // w1<- byte offset; clear V
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001196 FETCH_ADVANCE_INST_RB w1 // update rPC, load wINST
1197 b.le MterpCheckSuspendAndContinue
1198 GET_INST_OPCODE ip // extract opcode from wINST
1199 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001200
1201/* ------------------------------ */
1202 .balign 128
1203.L_op_sparse_switch: /* 0x2c */
1204/* File: arm64/op_sparse_switch.S */
1205/* File: arm64/op_packed_switch.S */
1206 /*
1207 * Handle a packed-switch or sparse-switch instruction. In both cases
1208 * we decode it and hand it off to a helper function.
1209 *
1210 * We don't really expect backward branches in a switch statement, but
1211 * they're perfectly legal, so we check for them here.
1212 *
1213 * for: packed-switch, sparse-switch
1214 */
1215 /* op vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001216 FETCH w0, 1 // w0<- bbbb (lo)
1217 FETCH w1, 2 // w1<- BBBB (hi)
1218 lsr w3, wINST, #8 // w3<- AA
1219 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb
1220 GET_VREG w1, w3 // w1<- vAA
1221 add x0, xPC, w0, lsl #1 // w0<- PC + BBBBbbbb*2
1222 bl MterpDoSparseSwitch // w0<- code-unit branch offset
Bill Buzbeefd522f92016-02-11 22:37:42 +00001223 sbfm xINST, x0, 0, 31
1224#if MTERP_PROFILE_BRANCHES
1225 EXPORT_PC
1226 mov x0, xSELF
1227 add x1, xFP, #OFF_FP_SHADOWFRAME
1228 mov x2, xINST
1229 bl MterpProfileBranch // (self, shadow_frame, offset)
1230 cbnz w0, MterpOnStackReplacement
1231#endif
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001232 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001233 adds w1, wINST, wINST // w1<- byte offset; clear V
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001234 FETCH_ADVANCE_INST_RB w1 // update rPC, load wINST
1235 b.le MterpCheckSuspendAndContinue
1236 GET_INST_OPCODE ip // extract opcode from wINST
1237 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001238
1239
1240/* ------------------------------ */
1241 .balign 128
1242.L_op_cmpl_float: /* 0x2d */
1243/* File: arm64/op_cmpl_float.S */
1244/* File: arm64/fcmp.S */
1245 /*
1246 * Compare two floating-point values. Puts 0, 1, or -1 into the
1247 * destination register based on the results of the comparison.
1248 */
1249 /* op vAA, vBB, vCC */
1250 FETCH w0, 1 // w0<- CCBB
1251 lsr w4, wINST, #8 // w4<- AA
1252 and w2, w0, #255 // w2<- BB
1253 lsr w3, w0, #8 // w3<- CC
1254 GET_VREG s1, w2
1255 GET_VREG s2, w3
1256 mov w0, #-1
1257 fcmp s1, s2
1258 csneg w0, w0, w0, le
1259 csel w0, wzr, w0, eq
1260 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1261 GET_INST_OPCODE ip // extract opcode from rINST
1262 SET_VREG w0, w4 // vAA<- w0
1263 GOTO_OPCODE ip // jump to next instruction
1264
1265
1266/* ------------------------------ */
1267 .balign 128
1268.L_op_cmpg_float: /* 0x2e */
1269/* File: arm64/op_cmpg_float.S */
1270/* File: arm64/fcmp.S */
1271 /*
1272 * Compare two floating-point values. Puts 0, 1, or -1 into the
1273 * destination register based on the results of the comparison.
1274 */
1275 /* op vAA, vBB, vCC */
1276 FETCH w0, 1 // w0<- CCBB
1277 lsr w4, wINST, #8 // w4<- AA
1278 and w2, w0, #255 // w2<- BB
1279 lsr w3, w0, #8 // w3<- CC
1280 GET_VREG s1, w2
1281 GET_VREG s2, w3
1282 mov w0, #1
1283 fcmp s1, s2
1284 csneg w0, w0, w0, pl
1285 csel w0, wzr, w0, eq
1286 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1287 GET_INST_OPCODE ip // extract opcode from rINST
1288 SET_VREG w0, w4 // vAA<- w0
1289 GOTO_OPCODE ip // jump to next instruction
1290
1291
1292/* ------------------------------ */
1293 .balign 128
1294.L_op_cmpl_double: /* 0x2f */
1295/* File: arm64/op_cmpl_double.S */
1296/* File: arm64/fcmp.S */
1297 /*
1298 * Compare two floating-point values. Puts 0, 1, or -1 into the
1299 * destination register based on the results of the comparison.
1300 */
1301 /* op vAA, vBB, vCC */
1302 FETCH w0, 1 // w0<- CCBB
1303 lsr w4, wINST, #8 // w4<- AA
1304 and w2, w0, #255 // w2<- BB
1305 lsr w3, w0, #8 // w3<- CC
1306 GET_VREG_WIDE d1, w2
1307 GET_VREG_WIDE d2, w3
1308 mov w0, #-1
1309 fcmp d1, d2
1310 csneg w0, w0, w0, le
1311 csel w0, wzr, w0, eq
1312 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1313 GET_INST_OPCODE ip // extract opcode from rINST
1314 SET_VREG w0, w4 // vAA<- w0
1315 GOTO_OPCODE ip // jump to next instruction
1316
1317
1318/* ------------------------------ */
1319 .balign 128
1320.L_op_cmpg_double: /* 0x30 */
1321/* File: arm64/op_cmpg_double.S */
1322/* File: arm64/fcmp.S */
1323 /*
1324 * Compare two floating-point values. Puts 0, 1, or -1 into the
1325 * destination register based on the results of the comparison.
1326 */
1327 /* op vAA, vBB, vCC */
1328 FETCH w0, 1 // w0<- CCBB
1329 lsr w4, wINST, #8 // w4<- AA
1330 and w2, w0, #255 // w2<- BB
1331 lsr w3, w0, #8 // w3<- CC
1332 GET_VREG_WIDE d1, w2
1333 GET_VREG_WIDE d2, w3
1334 mov w0, #1
1335 fcmp d1, d2
1336 csneg w0, w0, w0, pl
1337 csel w0, wzr, w0, eq
1338 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1339 GET_INST_OPCODE ip // extract opcode from rINST
1340 SET_VREG w0, w4 // vAA<- w0
1341 GOTO_OPCODE ip // jump to next instruction
1342
1343
1344/* ------------------------------ */
1345 .balign 128
1346.L_op_cmp_long: /* 0x31 */
1347/* File: arm64/op_cmp_long.S */
1348 FETCH w0, 1 // w0<- CCBB
1349 lsr w4, wINST, #8 // w4<- AA
1350 and w2, w0, #255 // w2<- BB
1351 lsr w3, w0, #8 // w3<- CC
1352 GET_VREG_WIDE x1, w2
1353 GET_VREG_WIDE x2, w3
1354 cmp x1, x2
1355 csinc w0, wzr, wzr, eq
1356 csneg w0, w0, w0, ge
1357 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1358 SET_VREG w0, w4
1359 GET_INST_OPCODE ip // extract opcode from wINST
1360 GOTO_OPCODE ip // jump to next instruction
1361
1362/* ------------------------------ */
1363 .balign 128
1364.L_op_if_eq: /* 0x32 */
1365/* File: arm64/op_if_eq.S */
1366/* File: arm64/bincmp.S */
1367 /*
1368 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1369 * fragment that specifies the *reverse* comparison to perform, e.g.
1370 * for "if-le" you would use "gt".
1371 *
1372 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1373 */
1374 /* if-cmp vA, vB, +CCCC */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001375#if MTERP_PROFILE_BRANCHES
1376 lsr w1, wINST, #12 // w1<- B
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001377 ubfx w0, wINST, #8, #4 // w0<- A
1378 GET_VREG w3, w1 // w3<- vB
1379 GET_VREG w2, w0 // w2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001380 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001381 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001382 b.eq .L_op_if_eq_taken
1383 FETCH_ADVANCE_INST 2 // update rPC, load wINST
1384 GET_INST_OPCODE ip // extract opcode from wINST
1385 GOTO_OPCODE ip // jump to next instruction
1386.L_op_if_eq_taken:
1387 EXPORT_PC
1388 mov x0, xSELF
1389 add x1, xFP, #OFF_FP_SHADOWFRAME
1390 sbfm x2, xINST, 0, 31 // Sign extend branch offset
1391 bl MterpProfileBranch // (self, shadow_frame, offset)
1392 cbnz w0, MterpOnStackReplacement // Note: offset must be in xINST
1393 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1394 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001395 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001396 b.mi MterpCheckSuspendAndContinue
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001397 GET_INST_OPCODE ip // extract opcode from wINST
1398 GOTO_OPCODE ip // jump to next instruction
1399#else
1400 lsr w1, wINST, #12 // w1<- B
1401 ubfx w0, wINST, #8, #4 // w0<- A
1402 GET_VREG w3, w1 // w3<- vB
1403 GET_VREG w2, w0 // w2<- vA
1404 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001405 mov w0, #2 // Offset if branch not taken
1406 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001407 csel wINST, w1, w0, eq // Branch if true, stashing result in callee save reg.
1408 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1409 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001410 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1411 b.mi MterpCheckSuspendAndContinue
1412 GET_INST_OPCODE ip // extract opcode from wINST
1413 GOTO_OPCODE ip // jump to next instruction
1414#endif
1415
1416
1417/* ------------------------------ */
1418 .balign 128
1419.L_op_if_ne: /* 0x33 */
1420/* File: arm64/op_if_ne.S */
1421/* File: arm64/bincmp.S */
1422 /*
1423 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1424 * fragment that specifies the *reverse* comparison to perform, e.g.
1425 * for "if-le" you would use "gt".
1426 *
1427 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1428 */
1429 /* if-cmp vA, vB, +CCCC */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001430#if MTERP_PROFILE_BRANCHES
1431 lsr w1, wINST, #12 // w1<- B
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001432 ubfx w0, wINST, #8, #4 // w0<- A
1433 GET_VREG w3, w1 // w3<- vB
1434 GET_VREG w2, w0 // w2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001435 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001436 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001437 b.ne .L_op_if_ne_taken
1438 FETCH_ADVANCE_INST 2 // update rPC, load wINST
1439 GET_INST_OPCODE ip // extract opcode from wINST
1440 GOTO_OPCODE ip // jump to next instruction
1441.L_op_if_ne_taken:
1442 EXPORT_PC
1443 mov x0, xSELF
1444 add x1, xFP, #OFF_FP_SHADOWFRAME
1445 sbfm x2, xINST, 0, 31 // Sign extend branch offset
1446 bl MterpProfileBranch // (self, shadow_frame, offset)
1447 cbnz w0, MterpOnStackReplacement // Note: offset must be in xINST
1448 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1449 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001450 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001451 b.mi MterpCheckSuspendAndContinue
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001452 GET_INST_OPCODE ip // extract opcode from wINST
1453 GOTO_OPCODE ip // jump to next instruction
1454#else
1455 lsr w1, wINST, #12 // w1<- B
1456 ubfx w0, wINST, #8, #4 // w0<- A
1457 GET_VREG w3, w1 // w3<- vB
1458 GET_VREG w2, w0 // w2<- vA
1459 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001460 mov w0, #2 // Offset if branch not taken
1461 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001462 csel wINST, w1, w0, ne // Branch if true, stashing result in callee save reg.
1463 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1464 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001465 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1466 b.mi MterpCheckSuspendAndContinue
1467 GET_INST_OPCODE ip // extract opcode from wINST
1468 GOTO_OPCODE ip // jump to next instruction
1469#endif
1470
1471
1472/* ------------------------------ */
1473 .balign 128
1474.L_op_if_lt: /* 0x34 */
1475/* File: arm64/op_if_lt.S */
1476/* File: arm64/bincmp.S */
1477 /*
1478 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1479 * fragment that specifies the *reverse* comparison to perform, e.g.
1480 * for "if-le" you would use "gt".
1481 *
1482 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1483 */
1484 /* if-cmp vA, vB, +CCCC */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001485#if MTERP_PROFILE_BRANCHES
1486 lsr w1, wINST, #12 // w1<- B
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001487 ubfx w0, wINST, #8, #4 // w0<- A
1488 GET_VREG w3, w1 // w3<- vB
1489 GET_VREG w2, w0 // w2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001490 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001491 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001492 b.lt .L_op_if_lt_taken
1493 FETCH_ADVANCE_INST 2 // update rPC, load wINST
1494 GET_INST_OPCODE ip // extract opcode from wINST
1495 GOTO_OPCODE ip // jump to next instruction
1496.L_op_if_lt_taken:
1497 EXPORT_PC
1498 mov x0, xSELF
1499 add x1, xFP, #OFF_FP_SHADOWFRAME
1500 sbfm x2, xINST, 0, 31 // Sign extend branch offset
1501 bl MterpProfileBranch // (self, shadow_frame, offset)
1502 cbnz w0, MterpOnStackReplacement // Note: offset must be in xINST
1503 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1504 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001505 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001506 b.mi MterpCheckSuspendAndContinue
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001507 GET_INST_OPCODE ip // extract opcode from wINST
1508 GOTO_OPCODE ip // jump to next instruction
1509#else
1510 lsr w1, wINST, #12 // w1<- B
1511 ubfx w0, wINST, #8, #4 // w0<- A
1512 GET_VREG w3, w1 // w3<- vB
1513 GET_VREG w2, w0 // w2<- vA
1514 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001515 mov w0, #2 // Offset if branch not taken
1516 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001517 csel wINST, w1, w0, lt // Branch if true, stashing result in callee save reg.
1518 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1519 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001520 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1521 b.mi MterpCheckSuspendAndContinue
1522 GET_INST_OPCODE ip // extract opcode from wINST
1523 GOTO_OPCODE ip // jump to next instruction
1524#endif
1525
1526
1527/* ------------------------------ */
1528 .balign 128
1529.L_op_if_ge: /* 0x35 */
1530/* File: arm64/op_if_ge.S */
1531/* File: arm64/bincmp.S */
1532 /*
1533 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1534 * fragment that specifies the *reverse* comparison to perform, e.g.
1535 * for "if-le" you would use "gt".
1536 *
1537 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1538 */
1539 /* if-cmp vA, vB, +CCCC */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001540#if MTERP_PROFILE_BRANCHES
1541 lsr w1, wINST, #12 // w1<- B
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001542 ubfx w0, wINST, #8, #4 // w0<- A
1543 GET_VREG w3, w1 // w3<- vB
1544 GET_VREG w2, w0 // w2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001545 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001546 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001547 b.ge .L_op_if_ge_taken
1548 FETCH_ADVANCE_INST 2 // update rPC, load wINST
1549 GET_INST_OPCODE ip // extract opcode from wINST
1550 GOTO_OPCODE ip // jump to next instruction
1551.L_op_if_ge_taken:
1552 EXPORT_PC
1553 mov x0, xSELF
1554 add x1, xFP, #OFF_FP_SHADOWFRAME
1555 sbfm x2, xINST, 0, 31 // Sign extend branch offset
1556 bl MterpProfileBranch // (self, shadow_frame, offset)
1557 cbnz w0, MterpOnStackReplacement // Note: offset must be in xINST
1558 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1559 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001560 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001561 b.mi MterpCheckSuspendAndContinue
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001562 GET_INST_OPCODE ip // extract opcode from wINST
1563 GOTO_OPCODE ip // jump to next instruction
1564#else
1565 lsr w1, wINST, #12 // w1<- B
1566 ubfx w0, wINST, #8, #4 // w0<- A
1567 GET_VREG w3, w1 // w3<- vB
1568 GET_VREG w2, w0 // w2<- vA
1569 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001570 mov w0, #2 // Offset if branch not taken
1571 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001572 csel wINST, w1, w0, ge // Branch if true, stashing result in callee save reg.
1573 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1574 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001575 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1576 b.mi MterpCheckSuspendAndContinue
1577 GET_INST_OPCODE ip // extract opcode from wINST
1578 GOTO_OPCODE ip // jump to next instruction
1579#endif
1580
1581
1582/* ------------------------------ */
1583 .balign 128
1584.L_op_if_gt: /* 0x36 */
1585/* File: arm64/op_if_gt.S */
1586/* File: arm64/bincmp.S */
1587 /*
1588 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1589 * fragment that specifies the *reverse* comparison to perform, e.g.
1590 * for "if-le" you would use "gt".
1591 *
1592 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1593 */
1594 /* if-cmp vA, vB, +CCCC */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001595#if MTERP_PROFILE_BRANCHES
1596 lsr w1, wINST, #12 // w1<- B
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001597 ubfx w0, wINST, #8, #4 // w0<- A
1598 GET_VREG w3, w1 // w3<- vB
1599 GET_VREG w2, w0 // w2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001600 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001601 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001602 b.gt .L_op_if_gt_taken
1603 FETCH_ADVANCE_INST 2 // update rPC, load wINST
1604 GET_INST_OPCODE ip // extract opcode from wINST
1605 GOTO_OPCODE ip // jump to next instruction
1606.L_op_if_gt_taken:
1607 EXPORT_PC
1608 mov x0, xSELF
1609 add x1, xFP, #OFF_FP_SHADOWFRAME
1610 sbfm x2, xINST, 0, 31 // Sign extend branch offset
1611 bl MterpProfileBranch // (self, shadow_frame, offset)
1612 cbnz w0, MterpOnStackReplacement // Note: offset must be in xINST
1613 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1614 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001615 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001616 b.mi MterpCheckSuspendAndContinue
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001617 GET_INST_OPCODE ip // extract opcode from wINST
1618 GOTO_OPCODE ip // jump to next instruction
1619#else
1620 lsr w1, wINST, #12 // w1<- B
1621 ubfx w0, wINST, #8, #4 // w0<- A
1622 GET_VREG w3, w1 // w3<- vB
1623 GET_VREG w2, w0 // w2<- vA
1624 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001625 mov w0, #2 // Offset if branch not taken
1626 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001627 csel wINST, w1, w0, gt // Branch if true, stashing result in callee save reg.
1628 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1629 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001630 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1631 b.mi MterpCheckSuspendAndContinue
1632 GET_INST_OPCODE ip // extract opcode from wINST
1633 GOTO_OPCODE ip // jump to next instruction
1634#endif
1635
1636
1637/* ------------------------------ */
1638 .balign 128
1639.L_op_if_le: /* 0x37 */
1640/* File: arm64/op_if_le.S */
1641/* File: arm64/bincmp.S */
1642 /*
1643 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1644 * fragment that specifies the *reverse* comparison to perform, e.g.
1645 * for "if-le" you would use "gt".
1646 *
1647 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1648 */
1649 /* if-cmp vA, vB, +CCCC */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001650#if MTERP_PROFILE_BRANCHES
1651 lsr w1, wINST, #12 // w1<- B
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001652 ubfx w0, wINST, #8, #4 // w0<- A
1653 GET_VREG w3, w1 // w3<- vB
1654 GET_VREG w2, w0 // w2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001655 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001656 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001657 b.le .L_op_if_le_taken
1658 FETCH_ADVANCE_INST 2 // update rPC, load wINST
1659 GET_INST_OPCODE ip // extract opcode from wINST
1660 GOTO_OPCODE ip // jump to next instruction
1661.L_op_if_le_taken:
1662 EXPORT_PC
1663 mov x0, xSELF
1664 add x1, xFP, #OFF_FP_SHADOWFRAME
1665 sbfm x2, xINST, 0, 31 // Sign extend branch offset
1666 bl MterpProfileBranch // (self, shadow_frame, offset)
1667 cbnz w0, MterpOnStackReplacement // Note: offset must be in xINST
1668 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1669 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001670 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001671 b.mi MterpCheckSuspendAndContinue
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001672 GET_INST_OPCODE ip // extract opcode from wINST
1673 GOTO_OPCODE ip // jump to next instruction
1674#else
1675 lsr w1, wINST, #12 // w1<- B
1676 ubfx w0, wINST, #8, #4 // w0<- A
1677 GET_VREG w3, w1 // w3<- vB
1678 GET_VREG w2, w0 // w2<- vA
1679 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001680 mov w0, #2 // Offset if branch not taken
1681 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001682 csel wINST, w1, w0, le // Branch if true, stashing result in callee save reg.
1683 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1684 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001685 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1686 b.mi MterpCheckSuspendAndContinue
1687 GET_INST_OPCODE ip // extract opcode from wINST
1688 GOTO_OPCODE ip // jump to next instruction
1689#endif
1690
1691
1692/* ------------------------------ */
1693 .balign 128
1694.L_op_if_eqz: /* 0x38 */
1695/* File: arm64/op_if_eqz.S */
1696/* File: arm64/zcmp.S */
1697 /*
1698 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1699 * fragment that specifies the *reverse* comparison to perform, e.g.
1700 * for "if-le" you would use "gt".
1701 *
1702 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1703 */
1704 /* if-cmp vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001705#if MTERP_PROFILE_BRANCHES
1706 lsr w0, wINST, #8 // w0<- AA
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001707 GET_VREG w2, w0 // w2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001708 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001709 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001710 b.eq .L_op_if_eqz_taken
1711 FETCH_ADVANCE_INST 2 // update rPC, load wINST
1712 GET_INST_OPCODE ip // extract opcode from wINST
1713 GOTO_OPCODE ip // jump to next instruction
1714.L_op_if_eqz_taken:
1715 EXPORT_PC
1716 mov x0, xSELF
1717 add x1, xFP, #OFF_FP_SHADOWFRAME
1718 sbfm x2, xINST, 0, 31
1719 bl MterpProfileBranch // (self, shadow_frame, offset)
1720 cbnz w0, MterpOnStackReplacement // Note: offset must be in wINST
1721 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1722 adds w2, wINST, wINST // convert to bytes & set flags
1723 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1724 b.mi MterpCheckSuspendAndContinue
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001725 GET_INST_OPCODE ip // extract opcode from wINST
1726 GOTO_OPCODE ip // jump to next instruction
1727#else
1728 lsr w0, wINST, #8 // w0<- AA
1729 GET_VREG w2, w0 // w2<- vAA
1730 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001731 mov w0, #2 // Branch offset if not taken
1732 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001733 csel wINST, w1, w0, eq // Branch if true, stashing result in callee save reg
1734 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1735 adds w2, wINST, wINST // convert to bytes & set flags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001736 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1737 b.mi MterpCheckSuspendAndContinue
1738 GET_INST_OPCODE ip // extract opcode from wINST
1739 GOTO_OPCODE ip // jump to next instruction
1740#endif
1741
1742
1743/* ------------------------------ */
1744 .balign 128
1745.L_op_if_nez: /* 0x39 */
1746/* File: arm64/op_if_nez.S */
1747/* File: arm64/zcmp.S */
1748 /*
1749 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1750 * fragment that specifies the *reverse* comparison to perform, e.g.
1751 * for "if-le" you would use "gt".
1752 *
1753 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1754 */
1755 /* if-cmp vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001756#if MTERP_PROFILE_BRANCHES
1757 lsr w0, wINST, #8 // w0<- AA
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001758 GET_VREG w2, w0 // w2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001759 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001760 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001761 b.ne .L_op_if_nez_taken
1762 FETCH_ADVANCE_INST 2 // update rPC, load wINST
1763 GET_INST_OPCODE ip // extract opcode from wINST
1764 GOTO_OPCODE ip // jump to next instruction
1765.L_op_if_nez_taken:
1766 EXPORT_PC
1767 mov x0, xSELF
1768 add x1, xFP, #OFF_FP_SHADOWFRAME
1769 sbfm x2, xINST, 0, 31
1770 bl MterpProfileBranch // (self, shadow_frame, offset)
1771 cbnz w0, MterpOnStackReplacement // Note: offset must be in wINST
1772 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1773 adds w2, wINST, wINST // convert to bytes & set flags
1774 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1775 b.mi MterpCheckSuspendAndContinue
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001776 GET_INST_OPCODE ip // extract opcode from wINST
1777 GOTO_OPCODE ip // jump to next instruction
1778#else
1779 lsr w0, wINST, #8 // w0<- AA
1780 GET_VREG w2, w0 // w2<- vAA
1781 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001782 mov w0, #2 // Branch offset if not taken
1783 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001784 csel wINST, w1, w0, ne // Branch if true, stashing result in callee save reg
1785 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1786 adds w2, wINST, wINST // convert to bytes & set flags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001787 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1788 b.mi MterpCheckSuspendAndContinue
1789 GET_INST_OPCODE ip // extract opcode from wINST
1790 GOTO_OPCODE ip // jump to next instruction
1791#endif
1792
1793
1794/* ------------------------------ */
1795 .balign 128
1796.L_op_if_ltz: /* 0x3a */
1797/* File: arm64/op_if_ltz.S */
1798/* File: arm64/zcmp.S */
1799 /*
1800 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1801 * fragment that specifies the *reverse* comparison to perform, e.g.
1802 * for "if-le" you would use "gt".
1803 *
1804 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1805 */
1806 /* if-cmp vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001807#if MTERP_PROFILE_BRANCHES
1808 lsr w0, wINST, #8 // w0<- AA
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001809 GET_VREG w2, w0 // w2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001810 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001811 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001812 b.lt .L_op_if_ltz_taken
1813 FETCH_ADVANCE_INST 2 // update rPC, load wINST
1814 GET_INST_OPCODE ip // extract opcode from wINST
1815 GOTO_OPCODE ip // jump to next instruction
1816.L_op_if_ltz_taken:
1817 EXPORT_PC
1818 mov x0, xSELF
1819 add x1, xFP, #OFF_FP_SHADOWFRAME
1820 sbfm x2, xINST, 0, 31
1821 bl MterpProfileBranch // (self, shadow_frame, offset)
1822 cbnz w0, MterpOnStackReplacement // Note: offset must be in wINST
1823 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1824 adds w2, wINST, wINST // convert to bytes & set flags
1825 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1826 b.mi MterpCheckSuspendAndContinue
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001827 GET_INST_OPCODE ip // extract opcode from wINST
1828 GOTO_OPCODE ip // jump to next instruction
1829#else
1830 lsr w0, wINST, #8 // w0<- AA
1831 GET_VREG w2, w0 // w2<- vAA
1832 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001833 mov w0, #2 // Branch offset if not taken
1834 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001835 csel wINST, w1, w0, lt // Branch if true, stashing result in callee save reg
1836 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1837 adds w2, wINST, wINST // convert to bytes & set flags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001838 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1839 b.mi MterpCheckSuspendAndContinue
1840 GET_INST_OPCODE ip // extract opcode from wINST
1841 GOTO_OPCODE ip // jump to next instruction
1842#endif
1843
1844
1845/* ------------------------------ */
1846 .balign 128
1847.L_op_if_gez: /* 0x3b */
1848/* File: arm64/op_if_gez.S */
1849/* File: arm64/zcmp.S */
1850 /*
1851 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1852 * fragment that specifies the *reverse* comparison to perform, e.g.
1853 * for "if-le" you would use "gt".
1854 *
1855 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1856 */
1857 /* if-cmp vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001858#if MTERP_PROFILE_BRANCHES
1859 lsr w0, wINST, #8 // w0<- AA
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001860 GET_VREG w2, w0 // w2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001861 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001862 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001863 b.ge .L_op_if_gez_taken
1864 FETCH_ADVANCE_INST 2 // update rPC, load wINST
1865 GET_INST_OPCODE ip // extract opcode from wINST
1866 GOTO_OPCODE ip // jump to next instruction
1867.L_op_if_gez_taken:
1868 EXPORT_PC
1869 mov x0, xSELF
1870 add x1, xFP, #OFF_FP_SHADOWFRAME
1871 sbfm x2, xINST, 0, 31
1872 bl MterpProfileBranch // (self, shadow_frame, offset)
1873 cbnz w0, MterpOnStackReplacement // Note: offset must be in wINST
1874 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1875 adds w2, wINST, wINST // convert to bytes & set flags
1876 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1877 b.mi MterpCheckSuspendAndContinue
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001878 GET_INST_OPCODE ip // extract opcode from wINST
1879 GOTO_OPCODE ip // jump to next instruction
1880#else
1881 lsr w0, wINST, #8 // w0<- AA
1882 GET_VREG w2, w0 // w2<- vAA
1883 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001884 mov w0, #2 // Branch offset if not taken
1885 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001886 csel wINST, w1, w0, ge // Branch if true, stashing result in callee save reg
1887 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1888 adds w2, wINST, wINST // convert to bytes & set flags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001889 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1890 b.mi MterpCheckSuspendAndContinue
1891 GET_INST_OPCODE ip // extract opcode from wINST
1892 GOTO_OPCODE ip // jump to next instruction
1893#endif
1894
1895
1896/* ------------------------------ */
1897 .balign 128
1898.L_op_if_gtz: /* 0x3c */
1899/* File: arm64/op_if_gtz.S */
1900/* File: arm64/zcmp.S */
1901 /*
1902 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1903 * fragment that specifies the *reverse* comparison to perform, e.g.
1904 * for "if-le" you would use "gt".
1905 *
1906 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1907 */
1908 /* if-cmp vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001909#if MTERP_PROFILE_BRANCHES
1910 lsr w0, wINST, #8 // w0<- AA
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001911 GET_VREG w2, w0 // w2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001912 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001913 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001914 b.gt .L_op_if_gtz_taken
1915 FETCH_ADVANCE_INST 2 // update rPC, load wINST
1916 GET_INST_OPCODE ip // extract opcode from wINST
1917 GOTO_OPCODE ip // jump to next instruction
1918.L_op_if_gtz_taken:
1919 EXPORT_PC
1920 mov x0, xSELF
1921 add x1, xFP, #OFF_FP_SHADOWFRAME
1922 sbfm x2, xINST, 0, 31
1923 bl MterpProfileBranch // (self, shadow_frame, offset)
1924 cbnz w0, MterpOnStackReplacement // Note: offset must be in wINST
1925 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1926 adds w2, wINST, wINST // convert to bytes & set flags
1927 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1928 b.mi MterpCheckSuspendAndContinue
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001929 GET_INST_OPCODE ip // extract opcode from wINST
1930 GOTO_OPCODE ip // jump to next instruction
1931#else
1932 lsr w0, wINST, #8 // w0<- AA
1933 GET_VREG w2, w0 // w2<- vAA
1934 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001935 mov w0, #2 // Branch offset if not taken
1936 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001937 csel wINST, w1, w0, gt // Branch if true, stashing result in callee save reg
1938 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1939 adds w2, wINST, wINST // convert to bytes & set flags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001940 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1941 b.mi MterpCheckSuspendAndContinue
1942 GET_INST_OPCODE ip // extract opcode from wINST
1943 GOTO_OPCODE ip // jump to next instruction
1944#endif
1945
1946
1947/* ------------------------------ */
1948 .balign 128
1949.L_op_if_lez: /* 0x3d */
1950/* File: arm64/op_if_lez.S */
1951/* File: arm64/zcmp.S */
1952 /*
1953 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1954 * fragment that specifies the *reverse* comparison to perform, e.g.
1955 * for "if-le" you would use "gt".
1956 *
1957 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1958 */
1959 /* if-cmp vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001960#if MTERP_PROFILE_BRANCHES
1961 lsr w0, wINST, #8 // w0<- AA
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001962 GET_VREG w2, w0 // w2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001963 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001964 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001965 b.le .L_op_if_lez_taken
1966 FETCH_ADVANCE_INST 2 // update rPC, load wINST
1967 GET_INST_OPCODE ip // extract opcode from wINST
1968 GOTO_OPCODE ip // jump to next instruction
1969.L_op_if_lez_taken:
1970 EXPORT_PC
1971 mov x0, xSELF
1972 add x1, xFP, #OFF_FP_SHADOWFRAME
1973 sbfm x2, xINST, 0, 31
1974 bl MterpProfileBranch // (self, shadow_frame, offset)
1975 cbnz w0, MterpOnStackReplacement // Note: offset must be in wINST
1976 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1977 adds w2, wINST, wINST // convert to bytes & set flags
1978 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1979 b.mi MterpCheckSuspendAndContinue
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001980 GET_INST_OPCODE ip // extract opcode from wINST
1981 GOTO_OPCODE ip // jump to next instruction
1982#else
1983 lsr w0, wINST, #8 // w0<- AA
1984 GET_VREG w2, w0 // w2<- vAA
1985 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001986 mov w0, #2 // Branch offset if not taken
1987 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001988 csel wINST, w1, w0, le // Branch if true, stashing result in callee save reg
1989 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1990 adds w2, wINST, wINST // convert to bytes & set flags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001991 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1992 b.mi MterpCheckSuspendAndContinue
1993 GET_INST_OPCODE ip // extract opcode from wINST
1994 GOTO_OPCODE ip // jump to next instruction
1995#endif
1996
1997
1998/* ------------------------------ */
1999 .balign 128
2000.L_op_unused_3e: /* 0x3e */
2001/* File: arm64/op_unused_3e.S */
2002/* File: arm64/unused.S */
2003/*
2004 * Bail to reference interpreter to throw.
2005 */
2006 b MterpFallback
2007
2008
2009/* ------------------------------ */
2010 .balign 128
2011.L_op_unused_3f: /* 0x3f */
2012/* File: arm64/op_unused_3f.S */
2013/* File: arm64/unused.S */
2014/*
2015 * Bail to reference interpreter to throw.
2016 */
2017 b MterpFallback
2018
2019
2020/* ------------------------------ */
2021 .balign 128
2022.L_op_unused_40: /* 0x40 */
2023/* File: arm64/op_unused_40.S */
2024/* File: arm64/unused.S */
2025/*
2026 * Bail to reference interpreter to throw.
2027 */
2028 b MterpFallback
2029
2030
2031/* ------------------------------ */
2032 .balign 128
2033.L_op_unused_41: /* 0x41 */
2034/* File: arm64/op_unused_41.S */
2035/* File: arm64/unused.S */
2036/*
2037 * Bail to reference interpreter to throw.
2038 */
2039 b MterpFallback
2040
2041
2042/* ------------------------------ */
2043 .balign 128
2044.L_op_unused_42: /* 0x42 */
2045/* File: arm64/op_unused_42.S */
2046/* File: arm64/unused.S */
2047/*
2048 * Bail to reference interpreter to throw.
2049 */
2050 b MterpFallback
2051
2052
2053/* ------------------------------ */
2054 .balign 128
2055.L_op_unused_43: /* 0x43 */
2056/* File: arm64/op_unused_43.S */
2057/* File: arm64/unused.S */
2058/*
2059 * Bail to reference interpreter to throw.
2060 */
2061 b MterpFallback
2062
2063
2064/* ------------------------------ */
2065 .balign 128
2066.L_op_aget: /* 0x44 */
2067/* File: arm64/op_aget.S */
2068 /*
2069 * Array get, 32 bits or less. vAA <- vBB[vCC].
2070 *
2071 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2072 * instructions. We use a pair of FETCH_Bs instead.
2073 *
2074 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2075 *
2076 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2077 * If this changes, specialize.
2078 */
2079 /* op vAA, vBB, vCC */
2080 FETCH_B w2, 1, 0 // w2<- BB
2081 lsr w9, wINST, #8 // w9<- AA
2082 FETCH_B w3, 1, 1 // w3<- CC
2083 GET_VREG w0, w2 // w0<- vBB (array object)
2084 GET_VREG w1, w3 // w1<- vCC (requested index)
2085 cbz x0, common_errNullObject // bail if null array object.
2086 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2087 add x0, x0, w1, uxtw #2 // w0<- arrayObj + index*width
2088 cmp w1, w3 // compare unsigned index, length
2089 bcs common_errArrayIndex // index >= length, bail
2090 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2091 ldr w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
2092 GET_INST_OPCODE ip // extract opcode from rINST
2093 SET_VREG w2, w9 // vAA<- w2
2094 GOTO_OPCODE ip // jump to next instruction
2095
2096/* ------------------------------ */
2097 .balign 128
2098.L_op_aget_wide: /* 0x45 */
2099/* File: arm64/op_aget_wide.S */
2100 /*
2101 * Array get, 64 bits. vAA <- vBB[vCC].
2102 *
2103 */
2104 /* aget-wide vAA, vBB, vCC */
2105 FETCH w0, 1 // w0<- CCBB
2106 lsr w4, wINST, #8 // w4<- AA
2107 and w2, w0, #255 // w2<- BB
2108 lsr w3, w0, #8 // w3<- CC
2109 GET_VREG w0, w2 // w0<- vBB (array object)
2110 GET_VREG w1, w3 // w1<- vCC (requested index)
2111 cbz w0, common_errNullObject // yes, bail
2112 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2113 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width
2114 cmp w1, w3 // compare unsigned index, length
2115 bcs common_errArrayIndex // index >= length, bail
2116 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
2117 ldr x2, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] // x2<- vBB[vCC]
2118 GET_INST_OPCODE ip // extract opcode from wINST
2119 SET_VREG_WIDE x2, w4
2120 GOTO_OPCODE ip // jump to next instruction
2121
2122/* ------------------------------ */
2123 .balign 128
2124.L_op_aget_object: /* 0x46 */
2125/* File: arm64/op_aget_object.S */
2126 /*
2127 * Array object get. vAA <- vBB[vCC].
2128 *
2129 * for: aget-object
2130 */
2131 /* op vAA, vBB, vCC */
2132 FETCH_B w2, 1, 0 // w2<- BB
2133 FETCH_B w3, 1, 1 // w3<- CC
2134 EXPORT_PC
2135 GET_VREG w0, w2 // w0<- vBB (array object)
2136 GET_VREG w1, w3 // w1<- vCC (requested index)
2137 bl artAGetObjectFromMterp // (array, index)
2138 ldr x1, [xSELF, #THREAD_EXCEPTION_OFFSET]
2139 lsr w2, wINST, #8 // w9<- AA
2140 PREFETCH_INST 2
2141 cbnz w1, MterpException
2142 SET_VREG_OBJECT w0, w2
2143 ADVANCE 2
2144 GET_INST_OPCODE ip
2145 GOTO_OPCODE ip // jump to next instruction
2146
2147/* ------------------------------ */
2148 .balign 128
2149.L_op_aget_boolean: /* 0x47 */
2150/* File: arm64/op_aget_boolean.S */
2151/* File: arm64/op_aget.S */
2152 /*
2153 * Array get, 32 bits or less. vAA <- vBB[vCC].
2154 *
2155 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2156 * instructions. We use a pair of FETCH_Bs instead.
2157 *
2158 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2159 *
2160 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2161 * If this changes, specialize.
2162 */
2163 /* op vAA, vBB, vCC */
2164 FETCH_B w2, 1, 0 // w2<- BB
2165 lsr w9, wINST, #8 // w9<- AA
2166 FETCH_B w3, 1, 1 // w3<- CC
2167 GET_VREG w0, w2 // w0<- vBB (array object)
2168 GET_VREG w1, w3 // w1<- vCC (requested index)
2169 cbz x0, common_errNullObject // bail if null array object.
2170 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2171 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width
2172 cmp w1, w3 // compare unsigned index, length
2173 bcs common_errArrayIndex // index >= length, bail
2174 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2175 ldrb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
2176 GET_INST_OPCODE ip // extract opcode from rINST
2177 SET_VREG w2, w9 // vAA<- w2
2178 GOTO_OPCODE ip // jump to next instruction
2179
2180
2181/* ------------------------------ */
2182 .balign 128
2183.L_op_aget_byte: /* 0x48 */
2184/* File: arm64/op_aget_byte.S */
2185/* File: arm64/op_aget.S */
2186 /*
2187 * Array get, 32 bits or less. vAA <- vBB[vCC].
2188 *
2189 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2190 * instructions. We use a pair of FETCH_Bs instead.
2191 *
2192 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2193 *
2194 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2195 * If this changes, specialize.
2196 */
2197 /* op vAA, vBB, vCC */
2198 FETCH_B w2, 1, 0 // w2<- BB
2199 lsr w9, wINST, #8 // w9<- AA
2200 FETCH_B w3, 1, 1 // w3<- CC
2201 GET_VREG w0, w2 // w0<- vBB (array object)
2202 GET_VREG w1, w3 // w1<- vCC (requested index)
2203 cbz x0, common_errNullObject // bail if null array object.
2204 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2205 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width
2206 cmp w1, w3 // compare unsigned index, length
2207 bcs common_errArrayIndex // index >= length, bail
2208 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2209 ldrsb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
2210 GET_INST_OPCODE ip // extract opcode from rINST
2211 SET_VREG w2, w9 // vAA<- w2
2212 GOTO_OPCODE ip // jump to next instruction
2213
2214
2215/* ------------------------------ */
2216 .balign 128
2217.L_op_aget_char: /* 0x49 */
2218/* File: arm64/op_aget_char.S */
2219/* File: arm64/op_aget.S */
2220 /*
2221 * Array get, 32 bits or less. vAA <- vBB[vCC].
2222 *
2223 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2224 * instructions. We use a pair of FETCH_Bs instead.
2225 *
2226 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2227 *
2228 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2229 * If this changes, specialize.
2230 */
2231 /* op vAA, vBB, vCC */
2232 FETCH_B w2, 1, 0 // w2<- BB
2233 lsr w9, wINST, #8 // w9<- AA
2234 FETCH_B w3, 1, 1 // w3<- CC
2235 GET_VREG w0, w2 // w0<- vBB (array object)
2236 GET_VREG w1, w3 // w1<- vCC (requested index)
2237 cbz x0, common_errNullObject // bail if null array object.
2238 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2239 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width
2240 cmp w1, w3 // compare unsigned index, length
2241 bcs common_errArrayIndex // index >= length, bail
2242 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2243 ldrh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
2244 GET_INST_OPCODE ip // extract opcode from rINST
2245 SET_VREG w2, w9 // vAA<- w2
2246 GOTO_OPCODE ip // jump to next instruction
2247
2248
2249/* ------------------------------ */
2250 .balign 128
2251.L_op_aget_short: /* 0x4a */
2252/* File: arm64/op_aget_short.S */
2253/* File: arm64/op_aget.S */
2254 /*
2255 * Array get, 32 bits or less. vAA <- vBB[vCC].
2256 *
2257 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2258 * instructions. We use a pair of FETCH_Bs instead.
2259 *
2260 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2261 *
2262 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2263 * If this changes, specialize.
2264 */
2265 /* op vAA, vBB, vCC */
2266 FETCH_B w2, 1, 0 // w2<- BB
2267 lsr w9, wINST, #8 // w9<- AA
2268 FETCH_B w3, 1, 1 // w3<- CC
2269 GET_VREG w0, w2 // w0<- vBB (array object)
2270 GET_VREG w1, w3 // w1<- vCC (requested index)
2271 cbz x0, common_errNullObject // bail if null array object.
2272 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2273 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width
2274 cmp w1, w3 // compare unsigned index, length
2275 bcs common_errArrayIndex // index >= length, bail
2276 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2277 ldrsh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
2278 GET_INST_OPCODE ip // extract opcode from rINST
2279 SET_VREG w2, w9 // vAA<- w2
2280 GOTO_OPCODE ip // jump to next instruction
2281
2282
2283/* ------------------------------ */
2284 .balign 128
2285.L_op_aput: /* 0x4b */
2286/* File: arm64/op_aput.S */
2287 /*
2288 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2289 *
2290 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2291 * instructions. We use a pair of FETCH_Bs instead.
2292 *
2293 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2294 *
2295 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2296 * If this changes, specialize.
2297 */
2298 /* op vAA, vBB, vCC */
2299 FETCH_B w2, 1, 0 // w2<- BB
2300 lsr w9, wINST, #8 // w9<- AA
2301 FETCH_B w3, 1, 1 // w3<- CC
2302 GET_VREG w0, w2 // w0<- vBB (array object)
2303 GET_VREG w1, w3 // w1<- vCC (requested index)
2304 cbz w0, common_errNullObject // bail if null
2305 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2306 add x0, x0, w1, lsl #2 // w0<- arrayObj + index*width
2307 cmp w1, w3 // compare unsigned index, length
2308 bcs common_errArrayIndex // index >= length, bail
2309 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2310 GET_VREG w2, w9 // w2<- vAA
2311 GET_INST_OPCODE ip // extract opcode from rINST
2312 str w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2313 GOTO_OPCODE ip // jump to next instruction
2314
2315/* ------------------------------ */
2316 .balign 128
2317.L_op_aput_wide: /* 0x4c */
2318/* File: arm64/op_aput_wide.S */
2319 /*
2320 * Array put, 64 bits. vBB[vCC] <- vAA.
2321 *
2322 */
2323 /* aput-wide vAA, vBB, vCC */
2324 FETCH w0, 1 // w0<- CCBB
2325 lsr w4, wINST, #8 // w4<- AA
2326 and w2, w0, #255 // w2<- BB
2327 lsr w3, w0, #8 // w3<- CC
2328 GET_VREG w0, w2 // w0<- vBB (array object)
2329 GET_VREG w1, w3 // w1<- vCC (requested index)
2330 cbz w0, common_errNullObject // bail if null
2331 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2332 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width
2333 cmp w1, w3 // compare unsigned index, length
2334 bcs common_errArrayIndex // index >= length, bail
2335 GET_VREG_WIDE x1, w4
2336 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
2337 GET_INST_OPCODE ip // extract opcode from wINST
2338 str x1, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET]
2339 GOTO_OPCODE ip // jump to next instruction
2340
2341/* ------------------------------ */
2342 .balign 128
2343.L_op_aput_object: /* 0x4d */
2344/* File: arm64/op_aput_object.S */
2345 /*
2346 * Store an object into an array. vBB[vCC] <- vAA.
2347 */
2348 /* op vAA, vBB, vCC */
2349 EXPORT_PC
2350 add x0, xFP, #OFF_FP_SHADOWFRAME
2351 mov x1, xPC
2352 mov w2, wINST
2353 bl MterpAputObject
2354 cbz w0, MterpPossibleException
2355 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2356 GET_INST_OPCODE ip // extract opcode from rINST
2357 GOTO_OPCODE ip // jump to next instruction
2358
2359/* ------------------------------ */
2360 .balign 128
2361.L_op_aput_boolean: /* 0x4e */
2362/* File: arm64/op_aput_boolean.S */
2363/* File: arm64/op_aput.S */
2364 /*
2365 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2366 *
2367 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2368 * instructions. We use a pair of FETCH_Bs instead.
2369 *
2370 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2371 *
2372 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2373 * If this changes, specialize.
2374 */
2375 /* op vAA, vBB, vCC */
2376 FETCH_B w2, 1, 0 // w2<- BB
2377 lsr w9, wINST, #8 // w9<- AA
2378 FETCH_B w3, 1, 1 // w3<- CC
2379 GET_VREG w0, w2 // w0<- vBB (array object)
2380 GET_VREG w1, w3 // w1<- vCC (requested index)
2381 cbz w0, common_errNullObject // bail if null
2382 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2383 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width
2384 cmp w1, w3 // compare unsigned index, length
2385 bcs common_errArrayIndex // index >= length, bail
2386 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2387 GET_VREG w2, w9 // w2<- vAA
2388 GET_INST_OPCODE ip // extract opcode from rINST
2389 strb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2390 GOTO_OPCODE ip // jump to next instruction
2391
2392
2393/* ------------------------------ */
2394 .balign 128
2395.L_op_aput_byte: /* 0x4f */
2396/* File: arm64/op_aput_byte.S */
2397/* File: arm64/op_aput.S */
2398 /*
2399 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2400 *
2401 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2402 * instructions. We use a pair of FETCH_Bs instead.
2403 *
2404 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2405 *
2406 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2407 * If this changes, specialize.
2408 */
2409 /* op vAA, vBB, vCC */
2410 FETCH_B w2, 1, 0 // w2<- BB
2411 lsr w9, wINST, #8 // w9<- AA
2412 FETCH_B w3, 1, 1 // w3<- CC
2413 GET_VREG w0, w2 // w0<- vBB (array object)
2414 GET_VREG w1, w3 // w1<- vCC (requested index)
2415 cbz w0, common_errNullObject // bail if null
2416 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2417 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width
2418 cmp w1, w3 // compare unsigned index, length
2419 bcs common_errArrayIndex // index >= length, bail
2420 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2421 GET_VREG w2, w9 // w2<- vAA
2422 GET_INST_OPCODE ip // extract opcode from rINST
2423 strb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2424 GOTO_OPCODE ip // jump to next instruction
2425
2426
2427/* ------------------------------ */
2428 .balign 128
2429.L_op_aput_char: /* 0x50 */
2430/* File: arm64/op_aput_char.S */
2431/* File: arm64/op_aput.S */
2432 /*
2433 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2434 *
2435 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2436 * instructions. We use a pair of FETCH_Bs instead.
2437 *
2438 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2439 *
2440 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2441 * If this changes, specialize.
2442 */
2443 /* op vAA, vBB, vCC */
2444 FETCH_B w2, 1, 0 // w2<- BB
2445 lsr w9, wINST, #8 // w9<- AA
2446 FETCH_B w3, 1, 1 // w3<- CC
2447 GET_VREG w0, w2 // w0<- vBB (array object)
2448 GET_VREG w1, w3 // w1<- vCC (requested index)
2449 cbz w0, common_errNullObject // bail if null
2450 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2451 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width
2452 cmp w1, w3 // compare unsigned index, length
2453 bcs common_errArrayIndex // index >= length, bail
2454 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2455 GET_VREG w2, w9 // w2<- vAA
2456 GET_INST_OPCODE ip // extract opcode from rINST
2457 strh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2458 GOTO_OPCODE ip // jump to next instruction
2459
2460
2461/* ------------------------------ */
2462 .balign 128
2463.L_op_aput_short: /* 0x51 */
2464/* File: arm64/op_aput_short.S */
2465/* File: arm64/op_aput.S */
2466 /*
2467 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2468 *
2469 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2470 * instructions. We use a pair of FETCH_Bs instead.
2471 *
2472 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2473 *
2474 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2475 * If this changes, specialize.
2476 */
2477 /* op vAA, vBB, vCC */
2478 FETCH_B w2, 1, 0 // w2<- BB
2479 lsr w9, wINST, #8 // w9<- AA
2480 FETCH_B w3, 1, 1 // w3<- CC
2481 GET_VREG w0, w2 // w0<- vBB (array object)
2482 GET_VREG w1, w3 // w1<- vCC (requested index)
2483 cbz w0, common_errNullObject // bail if null
2484 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2485 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width
2486 cmp w1, w3 // compare unsigned index, length
2487 bcs common_errArrayIndex // index >= length, bail
2488 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2489 GET_VREG w2, w9 // w2<- vAA
2490 GET_INST_OPCODE ip // extract opcode from rINST
2491 strh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2492 GOTO_OPCODE ip // jump to next instruction
2493
2494
2495/* ------------------------------ */
2496 .balign 128
2497.L_op_iget: /* 0x52 */
2498/* File: arm64/op_iget.S */
2499 /*
2500 * General instance field get.
2501 *
2502 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2503 */
2504 EXPORT_PC
2505 FETCH w0, 1 // w0<- field ref CCCC
2506 lsr w1, wINST, #12 // w1<- B
2507 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2508 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2509 mov x3, xSELF // w3<- self
2510 bl artGet32InstanceFromCode
2511 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002512
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002513 ubfx w2, wINST, #8, #4 // w2<- A
2514 PREFETCH_INST 2
2515 cbnz x3, MterpPossibleException // bail out
2516 .if 0
2517 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2518 .else
2519 SET_VREG w0, w2 // fp[A]<- w0
2520 .endif
2521 ADVANCE 2
2522 GET_INST_OPCODE ip // extract opcode from rINST
2523 GOTO_OPCODE ip // jump to next instruction
2524
2525/* ------------------------------ */
2526 .balign 128
2527.L_op_iget_wide: /* 0x53 */
2528/* File: arm64/op_iget_wide.S */
2529 /*
2530 * 64-bit instance field get.
2531 *
2532 * for: iget-wide
2533 */
2534 EXPORT_PC
2535 FETCH w0, 1 // w0<- field ref CCCC
2536 lsr w1, wINST, #12 // w1<- B
2537 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2538 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2539 mov x3, xSELF // w3<- self
2540 bl artGet64InstanceFromCode
2541 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2542 ubfx w2, wINST, #8, #4 // w2<- A
2543 PREFETCH_INST 2
2544 cmp w3, #0
2545 cbnz w3, MterpException // bail out
2546 SET_VREG_WIDE x0, w2
2547 ADVANCE 2
2548 GET_INST_OPCODE ip // extract opcode from wINST
2549 GOTO_OPCODE ip // jump to next instruction
2550
2551/* ------------------------------ */
2552 .balign 128
2553.L_op_iget_object: /* 0x54 */
2554/* File: arm64/op_iget_object.S */
2555/* File: arm64/op_iget.S */
2556 /*
2557 * General instance field get.
2558 *
2559 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2560 */
2561 EXPORT_PC
2562 FETCH w0, 1 // w0<- field ref CCCC
2563 lsr w1, wINST, #12 // w1<- B
2564 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2565 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2566 mov x3, xSELF // w3<- self
2567 bl artGetObjInstanceFromCode
2568 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002569
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002570 ubfx w2, wINST, #8, #4 // w2<- A
2571 PREFETCH_INST 2
2572 cbnz x3, MterpPossibleException // bail out
2573 .if 1
2574 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2575 .else
2576 SET_VREG w0, w2 // fp[A]<- w0
2577 .endif
2578 ADVANCE 2
2579 GET_INST_OPCODE ip // extract opcode from rINST
2580 GOTO_OPCODE ip // jump to next instruction
2581
2582
2583/* ------------------------------ */
2584 .balign 128
2585.L_op_iget_boolean: /* 0x55 */
2586/* File: arm64/op_iget_boolean.S */
2587/* File: arm64/op_iget.S */
2588 /*
2589 * General instance field get.
2590 *
2591 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2592 */
2593 EXPORT_PC
2594 FETCH w0, 1 // w0<- field ref CCCC
2595 lsr w1, wINST, #12 // w1<- B
2596 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2597 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2598 mov x3, xSELF // w3<- self
2599 bl artGetBooleanInstanceFromCode
2600 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002601 uxtb w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002602 ubfx w2, wINST, #8, #4 // w2<- A
2603 PREFETCH_INST 2
2604 cbnz x3, MterpPossibleException // bail out
2605 .if 0
2606 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2607 .else
2608 SET_VREG w0, w2 // fp[A]<- w0
2609 .endif
2610 ADVANCE 2
2611 GET_INST_OPCODE ip // extract opcode from rINST
2612 GOTO_OPCODE ip // jump to next instruction
2613
2614
2615/* ------------------------------ */
2616 .balign 128
2617.L_op_iget_byte: /* 0x56 */
2618/* File: arm64/op_iget_byte.S */
2619/* File: arm64/op_iget.S */
2620 /*
2621 * General instance field get.
2622 *
2623 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2624 */
2625 EXPORT_PC
2626 FETCH w0, 1 // w0<- field ref CCCC
2627 lsr w1, wINST, #12 // w1<- B
2628 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2629 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2630 mov x3, xSELF // w3<- self
2631 bl artGetByteInstanceFromCode
2632 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002633 sxtb w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002634 ubfx w2, wINST, #8, #4 // w2<- A
2635 PREFETCH_INST 2
2636 cbnz x3, MterpPossibleException // bail out
2637 .if 0
2638 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2639 .else
2640 SET_VREG w0, w2 // fp[A]<- w0
2641 .endif
2642 ADVANCE 2
2643 GET_INST_OPCODE ip // extract opcode from rINST
2644 GOTO_OPCODE ip // jump to next instruction
2645
2646
2647/* ------------------------------ */
2648 .balign 128
2649.L_op_iget_char: /* 0x57 */
2650/* File: arm64/op_iget_char.S */
2651/* File: arm64/op_iget.S */
2652 /*
2653 * General instance field get.
2654 *
2655 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2656 */
2657 EXPORT_PC
2658 FETCH w0, 1 // w0<- field ref CCCC
2659 lsr w1, wINST, #12 // w1<- B
2660 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2661 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2662 mov x3, xSELF // w3<- self
2663 bl artGetCharInstanceFromCode
2664 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002665 uxth w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002666 ubfx w2, wINST, #8, #4 // w2<- A
2667 PREFETCH_INST 2
2668 cbnz x3, MterpPossibleException // bail out
2669 .if 0
2670 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2671 .else
2672 SET_VREG w0, w2 // fp[A]<- w0
2673 .endif
2674 ADVANCE 2
2675 GET_INST_OPCODE ip // extract opcode from rINST
2676 GOTO_OPCODE ip // jump to next instruction
2677
2678
2679/* ------------------------------ */
2680 .balign 128
2681.L_op_iget_short: /* 0x58 */
2682/* File: arm64/op_iget_short.S */
2683/* File: arm64/op_iget.S */
2684 /*
2685 * General instance field get.
2686 *
2687 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2688 */
2689 EXPORT_PC
2690 FETCH w0, 1 // w0<- field ref CCCC
2691 lsr w1, wINST, #12 // w1<- B
2692 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2693 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2694 mov x3, xSELF // w3<- self
2695 bl artGetShortInstanceFromCode
2696 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002697 sxth w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002698 ubfx w2, wINST, #8, #4 // w2<- A
2699 PREFETCH_INST 2
2700 cbnz x3, MterpPossibleException // bail out
2701 .if 0
2702 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2703 .else
2704 SET_VREG w0, w2 // fp[A]<- w0
2705 .endif
2706 ADVANCE 2
2707 GET_INST_OPCODE ip // extract opcode from rINST
2708 GOTO_OPCODE ip // jump to next instruction
2709
2710
2711/* ------------------------------ */
2712 .balign 128
2713.L_op_iput: /* 0x59 */
2714/* File: arm64/op_iput.S */
2715 /*
2716 * General 32-bit instance field put.
2717 *
2718 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2719 */
2720 /* op vA, vB, field//CCCC */
2721 .extern artSet32InstanceFromMterp
2722 EXPORT_PC
2723 FETCH w0, 1 // w0<- field ref CCCC
2724 lsr w1, wINST, #12 // w1<- B
2725 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2726 ubfx w2, wINST, #8, #4 // w2<- A
2727 GET_VREG w2, w2 // w2<- fp[A]
2728 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2729 PREFETCH_INST 2
2730 bl artSet32InstanceFromMterp
2731 cbnz w0, MterpPossibleException
2732 ADVANCE 2 // advance rPC
2733 GET_INST_OPCODE ip // extract opcode from rINST
2734 GOTO_OPCODE ip // jump to next instruction
2735
2736/* ------------------------------ */
2737 .balign 128
2738.L_op_iput_wide: /* 0x5a */
2739/* File: arm64/op_iput_wide.S */
2740 /* iput-wide vA, vB, field//CCCC */
2741 .extern artSet64InstanceFromMterp
2742 EXPORT_PC
2743 FETCH w0, 1 // w0<- field ref CCCC
2744 lsr w1, wINST, #12 // w1<- B
2745 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2746 ubfx w2, wINST, #8, #4 // w2<- A
2747 add x2, xFP, x2, lsl #2 // w2<- &fp[A]
2748 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2749 PREFETCH_INST 2
2750 bl artSet64InstanceFromMterp
2751 cbnz w0, MterpPossibleException
2752 ADVANCE 2 // advance rPC
2753 GET_INST_OPCODE ip // extract opcode from wINST
2754 GOTO_OPCODE ip // jump to next instruction
2755
2756/* ------------------------------ */
2757 .balign 128
2758.L_op_iput_object: /* 0x5b */
2759/* File: arm64/op_iput_object.S */
2760 EXPORT_PC
2761 add x0, xFP, #OFF_FP_SHADOWFRAME
2762 mov x1, xPC
2763 mov w2, wINST
2764 mov x3, xSELF
2765 bl MterpIputObject
2766 cbz w0, MterpException
2767 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2768 GET_INST_OPCODE ip // extract opcode from rINST
2769 GOTO_OPCODE ip // jump to next instruction
2770
2771/* ------------------------------ */
2772 .balign 128
2773.L_op_iput_boolean: /* 0x5c */
2774/* File: arm64/op_iput_boolean.S */
2775/* File: arm64/op_iput.S */
2776 /*
2777 * General 32-bit instance field put.
2778 *
2779 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2780 */
2781 /* op vA, vB, field//CCCC */
2782 .extern artSet8InstanceFromMterp
2783 EXPORT_PC
2784 FETCH w0, 1 // w0<- field ref CCCC
2785 lsr w1, wINST, #12 // w1<- B
2786 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2787 ubfx w2, wINST, #8, #4 // w2<- A
2788 GET_VREG w2, w2 // w2<- fp[A]
2789 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2790 PREFETCH_INST 2
2791 bl artSet8InstanceFromMterp
2792 cbnz w0, MterpPossibleException
2793 ADVANCE 2 // advance rPC
2794 GET_INST_OPCODE ip // extract opcode from rINST
2795 GOTO_OPCODE ip // jump to next instruction
2796
2797
2798/* ------------------------------ */
2799 .balign 128
2800.L_op_iput_byte: /* 0x5d */
2801/* File: arm64/op_iput_byte.S */
2802/* File: arm64/op_iput.S */
2803 /*
2804 * General 32-bit instance field put.
2805 *
2806 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2807 */
2808 /* op vA, vB, field//CCCC */
2809 .extern artSet8InstanceFromMterp
2810 EXPORT_PC
2811 FETCH w0, 1 // w0<- field ref CCCC
2812 lsr w1, wINST, #12 // w1<- B
2813 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2814 ubfx w2, wINST, #8, #4 // w2<- A
2815 GET_VREG w2, w2 // w2<- fp[A]
2816 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2817 PREFETCH_INST 2
2818 bl artSet8InstanceFromMterp
2819 cbnz w0, MterpPossibleException
2820 ADVANCE 2 // advance rPC
2821 GET_INST_OPCODE ip // extract opcode from rINST
2822 GOTO_OPCODE ip // jump to next instruction
2823
2824
2825/* ------------------------------ */
2826 .balign 128
2827.L_op_iput_char: /* 0x5e */
2828/* File: arm64/op_iput_char.S */
2829/* File: arm64/op_iput.S */
2830 /*
2831 * General 32-bit instance field put.
2832 *
2833 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2834 */
2835 /* op vA, vB, field//CCCC */
2836 .extern artSet16InstanceFromMterp
2837 EXPORT_PC
2838 FETCH w0, 1 // w0<- field ref CCCC
2839 lsr w1, wINST, #12 // w1<- B
2840 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2841 ubfx w2, wINST, #8, #4 // w2<- A
2842 GET_VREG w2, w2 // w2<- fp[A]
2843 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2844 PREFETCH_INST 2
2845 bl artSet16InstanceFromMterp
2846 cbnz w0, MterpPossibleException
2847 ADVANCE 2 // advance rPC
2848 GET_INST_OPCODE ip // extract opcode from rINST
2849 GOTO_OPCODE ip // jump to next instruction
2850
2851
2852/* ------------------------------ */
2853 .balign 128
2854.L_op_iput_short: /* 0x5f */
2855/* File: arm64/op_iput_short.S */
2856/* File: arm64/op_iput.S */
2857 /*
2858 * General 32-bit instance field put.
2859 *
2860 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2861 */
2862 /* op vA, vB, field//CCCC */
2863 .extern artSet16InstanceFromMterp
2864 EXPORT_PC
2865 FETCH w0, 1 // w0<- field ref CCCC
2866 lsr w1, wINST, #12 // w1<- B
2867 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2868 ubfx w2, wINST, #8, #4 // w2<- A
2869 GET_VREG w2, w2 // w2<- fp[A]
2870 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2871 PREFETCH_INST 2
2872 bl artSet16InstanceFromMterp
2873 cbnz w0, MterpPossibleException
2874 ADVANCE 2 // advance rPC
2875 GET_INST_OPCODE ip // extract opcode from rINST
2876 GOTO_OPCODE ip // jump to next instruction
2877
2878
2879/* ------------------------------ */
2880 .balign 128
2881.L_op_sget: /* 0x60 */
2882/* File: arm64/op_sget.S */
2883 /*
2884 * General SGET handler wrapper.
2885 *
2886 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2887 */
2888 /* op vAA, field//BBBB */
2889
2890 .extern artGet32StaticFromCode
2891 EXPORT_PC
2892 FETCH w0, 1 // w0<- field ref BBBB
2893 ldr x1, [xFP, #OFF_FP_METHOD]
2894 mov x2, xSELF
2895 bl artGet32StaticFromCode
2896 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2897 lsr w2, wINST, #8 // w2<- AA
2898
2899 PREFETCH_INST 2
2900 cbnz x3, MterpException // bail out
2901.if 0
2902 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2903.else
2904 SET_VREG w0, w2 // fp[AA]<- w0
2905.endif
2906 ADVANCE 2
2907 GET_INST_OPCODE ip // extract opcode from rINST
2908 GOTO_OPCODE ip
2909
2910/* ------------------------------ */
2911 .balign 128
2912.L_op_sget_wide: /* 0x61 */
2913/* File: arm64/op_sget_wide.S */
2914 /*
2915 * SGET_WIDE handler wrapper.
2916 *
2917 */
2918 /* sget-wide vAA, field//BBBB */
2919
2920 .extern artGet64StaticFromCode
2921 EXPORT_PC
2922 FETCH w0, 1 // w0<- field ref BBBB
2923 ldr x1, [xFP, #OFF_FP_METHOD]
2924 mov x2, xSELF
2925 bl artGet64StaticFromCode
2926 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2927 lsr w4, wINST, #8 // w4<- AA
2928 cbnz x3, MterpException // bail out
2929 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
2930 SET_VREG_WIDE x0, w4
2931 GET_INST_OPCODE ip // extract opcode from wINST
2932 GOTO_OPCODE ip // jump to next instruction
2933
2934/* ------------------------------ */
2935 .balign 128
2936.L_op_sget_object: /* 0x62 */
2937/* File: arm64/op_sget_object.S */
2938/* File: arm64/op_sget.S */
2939 /*
2940 * General SGET handler wrapper.
2941 *
2942 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2943 */
2944 /* op vAA, field//BBBB */
2945
2946 .extern artGetObjStaticFromCode
2947 EXPORT_PC
2948 FETCH w0, 1 // w0<- field ref BBBB
2949 ldr x1, [xFP, #OFF_FP_METHOD]
2950 mov x2, xSELF
2951 bl artGetObjStaticFromCode
2952 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2953 lsr w2, wINST, #8 // w2<- AA
2954
2955 PREFETCH_INST 2
2956 cbnz x3, MterpException // bail out
2957.if 1
2958 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2959.else
2960 SET_VREG w0, w2 // fp[AA]<- w0
2961.endif
2962 ADVANCE 2
2963 GET_INST_OPCODE ip // extract opcode from rINST
2964 GOTO_OPCODE ip
2965
2966
2967/* ------------------------------ */
2968 .balign 128
2969.L_op_sget_boolean: /* 0x63 */
2970/* File: arm64/op_sget_boolean.S */
2971/* File: arm64/op_sget.S */
2972 /*
2973 * General SGET handler wrapper.
2974 *
2975 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2976 */
2977 /* op vAA, field//BBBB */
2978
2979 .extern artGetBooleanStaticFromCode
2980 EXPORT_PC
2981 FETCH w0, 1 // w0<- field ref BBBB
2982 ldr x1, [xFP, #OFF_FP_METHOD]
2983 mov x2, xSELF
2984 bl artGetBooleanStaticFromCode
2985 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2986 lsr w2, wINST, #8 // w2<- AA
2987 uxtb w0, w0
2988 PREFETCH_INST 2
2989 cbnz x3, MterpException // bail out
2990.if 0
2991 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2992.else
2993 SET_VREG w0, w2 // fp[AA]<- w0
2994.endif
2995 ADVANCE 2
2996 GET_INST_OPCODE ip // extract opcode from rINST
2997 GOTO_OPCODE ip
2998
2999
3000/* ------------------------------ */
3001 .balign 128
3002.L_op_sget_byte: /* 0x64 */
3003/* File: arm64/op_sget_byte.S */
3004/* File: arm64/op_sget.S */
3005 /*
3006 * General SGET handler wrapper.
3007 *
3008 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3009 */
3010 /* op vAA, field//BBBB */
3011
3012 .extern artGetByteStaticFromCode
3013 EXPORT_PC
3014 FETCH w0, 1 // w0<- field ref BBBB
3015 ldr x1, [xFP, #OFF_FP_METHOD]
3016 mov x2, xSELF
3017 bl artGetByteStaticFromCode
3018 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
3019 lsr w2, wINST, #8 // w2<- AA
3020 sxtb w0, w0
3021 PREFETCH_INST 2
3022 cbnz x3, MterpException // bail out
3023.if 0
3024 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
3025.else
3026 SET_VREG w0, w2 // fp[AA]<- w0
3027.endif
3028 ADVANCE 2
3029 GET_INST_OPCODE ip // extract opcode from rINST
3030 GOTO_OPCODE ip
3031
3032
3033/* ------------------------------ */
3034 .balign 128
3035.L_op_sget_char: /* 0x65 */
3036/* File: arm64/op_sget_char.S */
3037/* File: arm64/op_sget.S */
3038 /*
3039 * General SGET handler wrapper.
3040 *
3041 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3042 */
3043 /* op vAA, field//BBBB */
3044
3045 .extern artGetCharStaticFromCode
3046 EXPORT_PC
3047 FETCH w0, 1 // w0<- field ref BBBB
3048 ldr x1, [xFP, #OFF_FP_METHOD]
3049 mov x2, xSELF
3050 bl artGetCharStaticFromCode
3051 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
3052 lsr w2, wINST, #8 // w2<- AA
3053 uxth w0, w0
3054 PREFETCH_INST 2
3055 cbnz x3, MterpException // bail out
3056.if 0
3057 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
3058.else
3059 SET_VREG w0, w2 // fp[AA]<- w0
3060.endif
3061 ADVANCE 2
3062 GET_INST_OPCODE ip // extract opcode from rINST
3063 GOTO_OPCODE ip
3064
3065
3066/* ------------------------------ */
3067 .balign 128
3068.L_op_sget_short: /* 0x66 */
3069/* File: arm64/op_sget_short.S */
3070/* File: arm64/op_sget.S */
3071 /*
3072 * General SGET handler wrapper.
3073 *
3074 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3075 */
3076 /* op vAA, field//BBBB */
3077
3078 .extern artGetShortStaticFromCode
3079 EXPORT_PC
3080 FETCH w0, 1 // w0<- field ref BBBB
3081 ldr x1, [xFP, #OFF_FP_METHOD]
3082 mov x2, xSELF
3083 bl artGetShortStaticFromCode
3084 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
3085 lsr w2, wINST, #8 // w2<- AA
3086 sxth w0, w0
3087 PREFETCH_INST 2
3088 cbnz x3, MterpException // bail out
3089.if 0
3090 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
3091.else
3092 SET_VREG w0, w2 // fp[AA]<- w0
3093.endif
3094 ADVANCE 2
3095 GET_INST_OPCODE ip // extract opcode from rINST
3096 GOTO_OPCODE ip
3097
3098
3099/* ------------------------------ */
3100 .balign 128
3101.L_op_sput: /* 0x67 */
3102/* File: arm64/op_sput.S */
3103 /*
3104 * General SPUT handler wrapper.
3105 *
3106 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3107 */
3108 /* op vAA, field//BBBB */
3109 EXPORT_PC
3110 FETCH w0, 1 // r0<- field ref BBBB
3111 lsr w3, wINST, #8 // r3<- AA
3112 GET_VREG w1, w3 // r1<= fp[AA]
3113 ldr x2, [xFP, #OFF_FP_METHOD]
3114 mov x3, xSELF
3115 PREFETCH_INST 2 // Get next inst, but don't advance rPC
3116 bl artSet32StaticFromCode
3117 cbnz w0, MterpException // 0 on success
3118 ADVANCE 2 // Past exception point - now advance rPC
3119 GET_INST_OPCODE ip // extract opcode from rINST
3120 GOTO_OPCODE ip // jump to next instruction
3121
3122/* ------------------------------ */
3123 .balign 128
3124.L_op_sput_wide: /* 0x68 */
3125/* File: arm64/op_sput_wide.S */
3126 /*
3127 * SPUT_WIDE handler wrapper.
3128 *
3129 */
3130 /* sput-wide vAA, field//BBBB */
3131 .extern artSet64IndirectStaticFromMterp
3132 EXPORT_PC
3133 FETCH w0, 1 // w0<- field ref BBBB
3134 ldr x1, [xFP, #OFF_FP_METHOD]
3135 lsr w2, wINST, #8 // w3<- AA
3136 add x2, xFP, w2, lsl #2
3137 mov x3, xSELF
3138 PREFETCH_INST 2 // Get next inst, but don't advance rPC
3139 bl artSet64IndirectStaticFromMterp
3140 cbnz w0, MterpException // 0 on success, -1 on failure
3141 ADVANCE 2 // Past exception point - now advance rPC
3142 GET_INST_OPCODE ip // extract opcode from wINST
3143 GOTO_OPCODE ip // jump to next instruction
3144
3145/* ------------------------------ */
3146 .balign 128
3147.L_op_sput_object: /* 0x69 */
3148/* File: arm64/op_sput_object.S */
3149 EXPORT_PC
3150 add x0, xFP, #OFF_FP_SHADOWFRAME
3151 mov x1, xPC
3152 mov x2, xINST
3153 mov x3, xSELF
3154 bl MterpSputObject
3155 cbz w0, MterpException
3156 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3157 GET_INST_OPCODE ip // extract opcode from rINST
3158 GOTO_OPCODE ip // jump to next instruction
3159
3160/* ------------------------------ */
3161 .balign 128
3162.L_op_sput_boolean: /* 0x6a */
3163/* File: arm64/op_sput_boolean.S */
3164/* File: arm64/op_sput.S */
3165 /*
3166 * General SPUT handler wrapper.
3167 *
3168 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3169 */
3170 /* op vAA, field//BBBB */
3171 EXPORT_PC
3172 FETCH w0, 1 // r0<- field ref BBBB
3173 lsr w3, wINST, #8 // r3<- AA
3174 GET_VREG w1, w3 // r1<= fp[AA]
3175 ldr x2, [xFP, #OFF_FP_METHOD]
3176 mov x3, xSELF
3177 PREFETCH_INST 2 // Get next inst, but don't advance rPC
3178 bl artSet8StaticFromCode
3179 cbnz w0, MterpException // 0 on success
3180 ADVANCE 2 // Past exception point - now advance rPC
3181 GET_INST_OPCODE ip // extract opcode from rINST
3182 GOTO_OPCODE ip // jump to next instruction
3183
3184
3185/* ------------------------------ */
3186 .balign 128
3187.L_op_sput_byte: /* 0x6b */
3188/* File: arm64/op_sput_byte.S */
3189/* File: arm64/op_sput.S */
3190 /*
3191 * General SPUT handler wrapper.
3192 *
3193 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3194 */
3195 /* op vAA, field//BBBB */
3196 EXPORT_PC
3197 FETCH w0, 1 // r0<- field ref BBBB
3198 lsr w3, wINST, #8 // r3<- AA
3199 GET_VREG w1, w3 // r1<= fp[AA]
3200 ldr x2, [xFP, #OFF_FP_METHOD]
3201 mov x3, xSELF
3202 PREFETCH_INST 2 // Get next inst, but don't advance rPC
3203 bl artSet8StaticFromCode
3204 cbnz w0, MterpException // 0 on success
3205 ADVANCE 2 // Past exception point - now advance rPC
3206 GET_INST_OPCODE ip // extract opcode from rINST
3207 GOTO_OPCODE ip // jump to next instruction
3208
3209
3210/* ------------------------------ */
3211 .balign 128
3212.L_op_sput_char: /* 0x6c */
3213/* File: arm64/op_sput_char.S */
3214/* File: arm64/op_sput.S */
3215 /*
3216 * General SPUT handler wrapper.
3217 *
3218 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3219 */
3220 /* op vAA, field//BBBB */
3221 EXPORT_PC
3222 FETCH w0, 1 // r0<- field ref BBBB
3223 lsr w3, wINST, #8 // r3<- AA
3224 GET_VREG w1, w3 // r1<= fp[AA]
3225 ldr x2, [xFP, #OFF_FP_METHOD]
3226 mov x3, xSELF
3227 PREFETCH_INST 2 // Get next inst, but don't advance rPC
3228 bl artSet16StaticFromCode
3229 cbnz w0, MterpException // 0 on success
3230 ADVANCE 2 // Past exception point - now advance rPC
3231 GET_INST_OPCODE ip // extract opcode from rINST
3232 GOTO_OPCODE ip // jump to next instruction
3233
3234
3235/* ------------------------------ */
3236 .balign 128
3237.L_op_sput_short: /* 0x6d */
3238/* File: arm64/op_sput_short.S */
3239/* File: arm64/op_sput.S */
3240 /*
3241 * General SPUT handler wrapper.
3242 *
3243 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3244 */
3245 /* op vAA, field//BBBB */
3246 EXPORT_PC
3247 FETCH w0, 1 // r0<- field ref BBBB
3248 lsr w3, wINST, #8 // r3<- AA
3249 GET_VREG w1, w3 // r1<= fp[AA]
3250 ldr x2, [xFP, #OFF_FP_METHOD]
3251 mov x3, xSELF
3252 PREFETCH_INST 2 // Get next inst, but don't advance rPC
3253 bl artSet16StaticFromCode
3254 cbnz w0, MterpException // 0 on success
3255 ADVANCE 2 // Past exception point - now advance rPC
3256 GET_INST_OPCODE ip // extract opcode from rINST
3257 GOTO_OPCODE ip // jump to next instruction
3258
3259
3260/* ------------------------------ */
3261 .balign 128
3262.L_op_invoke_virtual: /* 0x6e */
3263/* File: arm64/op_invoke_virtual.S */
3264/* File: arm64/invoke.S */
3265 /*
3266 * Generic invoke handler wrapper.
3267 */
3268 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3269 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3270 .extern MterpInvokeVirtual
3271 EXPORT_PC
3272 mov x0, xSELF
3273 add x1, xFP, #OFF_FP_SHADOWFRAME
3274 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003275 mov x3, xINST
3276 bl MterpInvokeVirtual
3277 cbz w0, MterpException
3278 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003279 bl MterpShouldSwitchInterpreters
3280 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003281 GET_INST_OPCODE ip
3282 GOTO_OPCODE ip
3283
3284
3285 /*
3286 * Handle a virtual method call.
3287 *
3288 * for: invoke-virtual, invoke-virtual/range
3289 */
3290 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3291 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3292
3293/* ------------------------------ */
3294 .balign 128
3295.L_op_invoke_super: /* 0x6f */
3296/* File: arm64/op_invoke_super.S */
3297/* File: arm64/invoke.S */
3298 /*
3299 * Generic invoke handler wrapper.
3300 */
3301 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3302 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3303 .extern MterpInvokeSuper
3304 EXPORT_PC
3305 mov x0, xSELF
3306 add x1, xFP, #OFF_FP_SHADOWFRAME
3307 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003308 mov x3, xINST
3309 bl MterpInvokeSuper
3310 cbz w0, MterpException
3311 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003312 bl MterpShouldSwitchInterpreters
3313 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003314 GET_INST_OPCODE ip
3315 GOTO_OPCODE ip
3316
3317
3318 /*
3319 * Handle a "super" method call.
3320 *
3321 * for: invoke-super, invoke-super/range
3322 */
3323 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3324 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3325
3326/* ------------------------------ */
3327 .balign 128
3328.L_op_invoke_direct: /* 0x70 */
3329/* File: arm64/op_invoke_direct.S */
3330/* File: arm64/invoke.S */
3331 /*
3332 * Generic invoke handler wrapper.
3333 */
3334 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3335 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3336 .extern MterpInvokeDirect
3337 EXPORT_PC
3338 mov x0, xSELF
3339 add x1, xFP, #OFF_FP_SHADOWFRAME
3340 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003341 mov x3, xINST
3342 bl MterpInvokeDirect
3343 cbz w0, MterpException
3344 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003345 bl MterpShouldSwitchInterpreters
3346 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003347 GET_INST_OPCODE ip
3348 GOTO_OPCODE ip
3349
3350
3351
3352/* ------------------------------ */
3353 .balign 128
3354.L_op_invoke_static: /* 0x71 */
3355/* File: arm64/op_invoke_static.S */
3356/* File: arm64/invoke.S */
3357 /*
3358 * Generic invoke handler wrapper.
3359 */
3360 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3361 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3362 .extern MterpInvokeStatic
3363 EXPORT_PC
3364 mov x0, xSELF
3365 add x1, xFP, #OFF_FP_SHADOWFRAME
3366 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003367 mov x3, xINST
3368 bl MterpInvokeStatic
3369 cbz w0, MterpException
3370 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003371 bl MterpShouldSwitchInterpreters
3372 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003373 GET_INST_OPCODE ip
3374 GOTO_OPCODE ip
3375
3376
3377
3378
3379/* ------------------------------ */
3380 .balign 128
3381.L_op_invoke_interface: /* 0x72 */
3382/* File: arm64/op_invoke_interface.S */
3383/* File: arm64/invoke.S */
3384 /*
3385 * Generic invoke handler wrapper.
3386 */
3387 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3388 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3389 .extern MterpInvokeInterface
3390 EXPORT_PC
3391 mov x0, xSELF
3392 add x1, xFP, #OFF_FP_SHADOWFRAME
3393 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003394 mov x3, xINST
3395 bl MterpInvokeInterface
3396 cbz w0, MterpException
3397 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003398 bl MterpShouldSwitchInterpreters
3399 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003400 GET_INST_OPCODE ip
3401 GOTO_OPCODE ip
3402
3403
3404 /*
3405 * Handle an interface method call.
3406 *
3407 * for: invoke-interface, invoke-interface/range
3408 */
3409 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3410 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3411
3412/* ------------------------------ */
3413 .balign 128
3414.L_op_return_void_no_barrier: /* 0x73 */
3415/* File: arm64/op_return_void_no_barrier.S */
3416 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
3417 mov x0, xSELF
3418 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3419 b.ne .Lop_return_void_no_barrier_check
3420.Lop_return_void_no_barrier_return:
3421 mov x0, #0
3422 b MterpReturn
3423.Lop_return_void_no_barrier_check:
3424 bl MterpSuspendCheck // (self)
3425 b .Lop_return_void_no_barrier_return
3426
3427/* ------------------------------ */
3428 .balign 128
3429.L_op_invoke_virtual_range: /* 0x74 */
3430/* File: arm64/op_invoke_virtual_range.S */
3431/* File: arm64/invoke.S */
3432 /*
3433 * Generic invoke handler wrapper.
3434 */
3435 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3436 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3437 .extern MterpInvokeVirtualRange
3438 EXPORT_PC
3439 mov x0, xSELF
3440 add x1, xFP, #OFF_FP_SHADOWFRAME
3441 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003442 mov x3, xINST
3443 bl MterpInvokeVirtualRange
3444 cbz w0, MterpException
3445 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003446 bl MterpShouldSwitchInterpreters
3447 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003448 GET_INST_OPCODE ip
3449 GOTO_OPCODE ip
3450
3451
3452
3453/* ------------------------------ */
3454 .balign 128
3455.L_op_invoke_super_range: /* 0x75 */
3456/* File: arm64/op_invoke_super_range.S */
3457/* File: arm64/invoke.S */
3458 /*
3459 * Generic invoke handler wrapper.
3460 */
3461 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3462 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3463 .extern MterpInvokeSuperRange
3464 EXPORT_PC
3465 mov x0, xSELF
3466 add x1, xFP, #OFF_FP_SHADOWFRAME
3467 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003468 mov x3, xINST
3469 bl MterpInvokeSuperRange
3470 cbz w0, MterpException
3471 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003472 bl MterpShouldSwitchInterpreters
3473 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003474 GET_INST_OPCODE ip
3475 GOTO_OPCODE ip
3476
3477
3478
3479/* ------------------------------ */
3480 .balign 128
3481.L_op_invoke_direct_range: /* 0x76 */
3482/* File: arm64/op_invoke_direct_range.S */
3483/* File: arm64/invoke.S */
3484 /*
3485 * Generic invoke handler wrapper.
3486 */
3487 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3488 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3489 .extern MterpInvokeDirectRange
3490 EXPORT_PC
3491 mov x0, xSELF
3492 add x1, xFP, #OFF_FP_SHADOWFRAME
3493 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003494 mov x3, xINST
3495 bl MterpInvokeDirectRange
3496 cbz w0, MterpException
3497 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003498 bl MterpShouldSwitchInterpreters
3499 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003500 GET_INST_OPCODE ip
3501 GOTO_OPCODE ip
3502
3503
3504
3505/* ------------------------------ */
3506 .balign 128
3507.L_op_invoke_static_range: /* 0x77 */
3508/* File: arm64/op_invoke_static_range.S */
3509/* File: arm64/invoke.S */
3510 /*
3511 * Generic invoke handler wrapper.
3512 */
3513 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3514 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3515 .extern MterpInvokeStaticRange
3516 EXPORT_PC
3517 mov x0, xSELF
3518 add x1, xFP, #OFF_FP_SHADOWFRAME
3519 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003520 mov x3, xINST
3521 bl MterpInvokeStaticRange
3522 cbz w0, MterpException
3523 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003524 bl MterpShouldSwitchInterpreters
3525 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003526 GET_INST_OPCODE ip
3527 GOTO_OPCODE ip
3528
3529
3530
3531/* ------------------------------ */
3532 .balign 128
3533.L_op_invoke_interface_range: /* 0x78 */
3534/* File: arm64/op_invoke_interface_range.S */
3535/* File: arm64/invoke.S */
3536 /*
3537 * Generic invoke handler wrapper.
3538 */
3539 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3540 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3541 .extern MterpInvokeInterfaceRange
3542 EXPORT_PC
3543 mov x0, xSELF
3544 add x1, xFP, #OFF_FP_SHADOWFRAME
3545 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003546 mov x3, xINST
3547 bl MterpInvokeInterfaceRange
3548 cbz w0, MterpException
3549 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003550 bl MterpShouldSwitchInterpreters
3551 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003552 GET_INST_OPCODE ip
3553 GOTO_OPCODE ip
3554
3555
3556
3557/* ------------------------------ */
3558 .balign 128
3559.L_op_unused_79: /* 0x79 */
3560/* File: arm64/op_unused_79.S */
3561/* File: arm64/unused.S */
3562/*
3563 * Bail to reference interpreter to throw.
3564 */
3565 b MterpFallback
3566
3567
3568/* ------------------------------ */
3569 .balign 128
3570.L_op_unused_7a: /* 0x7a */
3571/* File: arm64/op_unused_7a.S */
3572/* File: arm64/unused.S */
3573/*
3574 * Bail to reference interpreter to throw.
3575 */
3576 b MterpFallback
3577
3578
3579/* ------------------------------ */
3580 .balign 128
3581.L_op_neg_int: /* 0x7b */
3582/* File: arm64/op_neg_int.S */
3583/* File: arm64/unop.S */
3584 /*
3585 * Generic 32-bit unary operation. Provide an "instr" line that
3586 * specifies an instruction that performs "result = op w0".
3587 * This could be an ARM instruction or a function call.
3588 *
3589 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3590 * int-to-byte, int-to-char, int-to-short
3591 */
3592 /* unop vA, vB */
3593 lsr w3, wINST, #12 // w3<- B
3594 GET_VREG w0, w3 // w0<- vB
3595 ubfx w9, wINST, #8, #4 // w9<- A
3596 // optional op; may set condition codes
3597 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3598 sub w0, wzr, w0 // w0<- op, w0-w3 changed
3599 GET_INST_OPCODE ip // extract opcode from rINST
3600 SET_VREG w0, w9 // vAA<- w0
3601 GOTO_OPCODE ip // jump to next instruction
3602 /* 8-9 instructions */
3603
3604
3605/* ------------------------------ */
3606 .balign 128
3607.L_op_not_int: /* 0x7c */
3608/* File: arm64/op_not_int.S */
3609/* File: arm64/unop.S */
3610 /*
3611 * Generic 32-bit unary operation. Provide an "instr" line that
3612 * specifies an instruction that performs "result = op w0".
3613 * This could be an ARM instruction or a function call.
3614 *
3615 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3616 * int-to-byte, int-to-char, int-to-short
3617 */
3618 /* unop vA, vB */
3619 lsr w3, wINST, #12 // w3<- B
3620 GET_VREG w0, w3 // w0<- vB
3621 ubfx w9, wINST, #8, #4 // w9<- A
3622 // optional op; may set condition codes
3623 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3624 mvn w0, w0 // w0<- op, w0-w3 changed
3625 GET_INST_OPCODE ip // extract opcode from rINST
3626 SET_VREG w0, w9 // vAA<- w0
3627 GOTO_OPCODE ip // jump to next instruction
3628 /* 8-9 instructions */
3629
3630
3631/* ------------------------------ */
3632 .balign 128
3633.L_op_neg_long: /* 0x7d */
3634/* File: arm64/op_neg_long.S */
3635/* File: arm64/unopWide.S */
3636 /*
3637 * Generic 64-bit unary operation. Provide an "instr" line that
3638 * specifies an instruction that performs "result = op x0".
3639 *
3640 * For: neg-long, not-long
3641 */
3642 /* unop vA, vB */
3643 lsr w3, wINST, #12 // w3<- B
3644 ubfx w4, wINST, #8, #4 // w4<- A
3645 GET_VREG_WIDE x0, w3
3646 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3647
3648 sub x0, xzr, x0
3649 GET_INST_OPCODE ip // extract opcode from wINST
3650 SET_VREG_WIDE x0, w4
3651 GOTO_OPCODE ip // jump to next instruction
3652 /* 10-11 instructions */
3653
3654
3655/* ------------------------------ */
3656 .balign 128
3657.L_op_not_long: /* 0x7e */
3658/* File: arm64/op_not_long.S */
3659/* File: arm64/unopWide.S */
3660 /*
3661 * Generic 64-bit unary operation. Provide an "instr" line that
3662 * specifies an instruction that performs "result = op x0".
3663 *
3664 * For: neg-long, not-long
3665 */
3666 /* unop vA, vB */
3667 lsr w3, wINST, #12 // w3<- B
3668 ubfx w4, wINST, #8, #4 // w4<- A
3669 GET_VREG_WIDE x0, w3
3670 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3671
3672 mvn x0, x0
3673 GET_INST_OPCODE ip // extract opcode from wINST
3674 SET_VREG_WIDE x0, w4
3675 GOTO_OPCODE ip // jump to next instruction
3676 /* 10-11 instructions */
3677
3678
3679/* ------------------------------ */
3680 .balign 128
3681.L_op_neg_float: /* 0x7f */
3682/* File: arm64/op_neg_float.S */
3683/* File: arm64/unop.S */
3684 /*
3685 * Generic 32-bit unary operation. Provide an "instr" line that
3686 * specifies an instruction that performs "result = op w0".
3687 * This could be an ARM instruction or a function call.
3688 *
3689 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3690 * int-to-byte, int-to-char, int-to-short
3691 */
3692 /* unop vA, vB */
3693 lsr w3, wINST, #12 // w3<- B
3694 GET_VREG w0, w3 // w0<- vB
3695 ubfx w9, wINST, #8, #4 // w9<- A
3696 mov w4, #0x80000000 // optional op; may set condition codes
3697 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3698 add w0, w0, w4 // w0<- op, w0-w3 changed
3699 GET_INST_OPCODE ip // extract opcode from rINST
3700 SET_VREG w0, w9 // vAA<- w0
3701 GOTO_OPCODE ip // jump to next instruction
3702 /* 8-9 instructions */
3703
3704
3705/* ------------------------------ */
3706 .balign 128
3707.L_op_neg_double: /* 0x80 */
3708/* File: arm64/op_neg_double.S */
3709/* File: arm64/unopWide.S */
3710 /*
3711 * Generic 64-bit unary operation. Provide an "instr" line that
3712 * specifies an instruction that performs "result = op x0".
3713 *
3714 * For: neg-long, not-long
3715 */
3716 /* unop vA, vB */
3717 lsr w3, wINST, #12 // w3<- B
3718 ubfx w4, wINST, #8, #4 // w4<- A
3719 GET_VREG_WIDE x0, w3
3720 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3721 mov x1, #0x8000000000000000
3722 add x0, x0, x1
3723 GET_INST_OPCODE ip // extract opcode from wINST
3724 SET_VREG_WIDE x0, w4
3725 GOTO_OPCODE ip // jump to next instruction
3726 /* 10-11 instructions */
3727
3728
3729/* ------------------------------ */
3730 .balign 128
3731.L_op_int_to_long: /* 0x81 */
3732/* File: arm64/op_int_to_long.S */
3733/* File: arm64/funopWider.S */
3734 /*
3735 * Generic 32bit-to-64bit floating point unary operation. Provide an
3736 * "instr" line that specifies an instruction that performs "x0 = op w0".
3737 *
3738 * For: int-to-double, float-to-double, float-to-long
3739 */
3740 /* unop vA, vB */
3741 lsr w3, wINST, #12 // w3<- B
3742 lsr w4, wINST, #8 // w4<- A+
3743 GET_VREG w0, w3
3744 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3745 and w4, w4, #15 // w4<- A
3746 sbfm x0, x0, 0, 31 // d0<- op
3747 GET_INST_OPCODE ip // extract opcode from wINST
3748 SET_VREG_WIDE x0, w4 // vA<- d0
3749 GOTO_OPCODE ip // jump to next instruction
3750
3751
3752/* ------------------------------ */
3753 .balign 128
3754.L_op_int_to_float: /* 0x82 */
3755/* File: arm64/op_int_to_float.S */
3756/* File: arm64/funopNarrow.S */
3757 /*
3758 * Generic 32bit-to-32bit floating point unary operation. Provide an
3759 * "instr" line that specifies an instruction that performs "s0 = op w0".
3760 *
3761 * For: int-to-float, float-to-int
3762 * TODO: refactor all of the conversions - parameterize width and use same template.
3763 */
3764 /* unop vA, vB */
3765 lsr w3, wINST, #12 // w3<- B
3766 lsr w4, wINST, #8 // w4<- A+
3767 GET_VREG w0, w3
3768 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3769 and w4, w4, #15 // w4<- A
3770 scvtf s0, w0 // d0<- op
3771 GET_INST_OPCODE ip // extract opcode from wINST
3772 SET_VREG s0, w4 // vA<- d0
3773 GOTO_OPCODE ip // jump to next instruction
3774
3775
3776/* ------------------------------ */
3777 .balign 128
3778.L_op_int_to_double: /* 0x83 */
3779/* File: arm64/op_int_to_double.S */
3780/* File: arm64/funopWider.S */
3781 /*
3782 * Generic 32bit-to-64bit floating point unary operation. Provide an
3783 * "instr" line that specifies an instruction that performs "d0 = op w0".
3784 *
3785 * For: int-to-double, float-to-double, float-to-long
3786 */
3787 /* unop vA, vB */
3788 lsr w3, wINST, #12 // w3<- B
3789 lsr w4, wINST, #8 // w4<- A+
3790 GET_VREG w0, w3
3791 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3792 and w4, w4, #15 // w4<- A
3793 scvtf d0, w0 // d0<- op
3794 GET_INST_OPCODE ip // extract opcode from wINST
3795 SET_VREG_WIDE d0, w4 // vA<- d0
3796 GOTO_OPCODE ip // jump to next instruction
3797
3798
3799/* ------------------------------ */
3800 .balign 128
3801.L_op_long_to_int: /* 0x84 */
3802/* File: arm64/op_long_to_int.S */
3803/* File: arm64/funopNarrower.S */
3804 /*
3805 * Generic 64bit-to-32bit floating point unary operation. Provide an
3806 * "instr" line that specifies an instruction that performs "w0 = op x0".
3807 *
3808 * For: int-to-double, float-to-double, float-to-long
3809 */
3810 /* unop vA, vB */
3811 lsr w3, wINST, #12 // w3<- B
3812 lsr w4, wINST, #8 // w4<- A+
3813 GET_VREG_WIDE x0, w3
3814 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3815 and w4, w4, #15 // w4<- A
3816 // d0<- op
3817 GET_INST_OPCODE ip // extract opcode from wINST
3818 SET_VREG w0, w4 // vA<- d0
3819 GOTO_OPCODE ip // jump to next instruction
3820
3821
3822/* ------------------------------ */
3823 .balign 128
3824.L_op_long_to_float: /* 0x85 */
3825/* File: arm64/op_long_to_float.S */
3826/* File: arm64/funopNarrower.S */
3827 /*
3828 * Generic 64bit-to-32bit floating point unary operation. Provide an
3829 * "instr" line that specifies an instruction that performs "s0 = op x0".
3830 *
3831 * For: int-to-double, float-to-double, float-to-long
3832 */
3833 /* unop vA, vB */
3834 lsr w3, wINST, #12 // w3<- B
3835 lsr w4, wINST, #8 // w4<- A+
3836 GET_VREG_WIDE x0, w3
3837 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3838 and w4, w4, #15 // w4<- A
3839 scvtf s0, x0 // d0<- op
3840 GET_INST_OPCODE ip // extract opcode from wINST
3841 SET_VREG s0, w4 // vA<- d0
3842 GOTO_OPCODE ip // jump to next instruction
3843
3844
3845/* ------------------------------ */
3846 .balign 128
3847.L_op_long_to_double: /* 0x86 */
3848/* File: arm64/op_long_to_double.S */
3849/* File: arm64/funopWide.S */
3850 /*
3851 * Generic 64bit-to-64bit floating point unary operation. Provide an
3852 * "instr" line that specifies an instruction that performs "d0 = op x0".
3853 *
3854 * For: long-to-double, double-to-long
3855 */
3856 /* unop vA, vB */
3857 lsr w3, wINST, #12 // w3<- B
3858 lsr w4, wINST, #8 // w4<- A+
3859 GET_VREG_WIDE x0, w3
3860 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3861 and w4, w4, #15 // w4<- A
3862 scvtf d0, x0 // d0<- op
3863 GET_INST_OPCODE ip // extract opcode from wINST
3864 SET_VREG_WIDE d0, w4 // vA<- d0
3865 GOTO_OPCODE ip // jump to next instruction
3866
3867
3868/* ------------------------------ */
3869 .balign 128
3870.L_op_float_to_int: /* 0x87 */
3871/* File: arm64/op_float_to_int.S */
3872/* File: arm64/funopNarrow.S */
3873 /*
3874 * Generic 32bit-to-32bit floating point unary operation. Provide an
3875 * "instr" line that specifies an instruction that performs "w0 = op s0".
3876 *
3877 * For: int-to-float, float-to-int
3878 * TODO: refactor all of the conversions - parameterize width and use same template.
3879 */
3880 /* unop vA, vB */
3881 lsr w3, wINST, #12 // w3<- B
3882 lsr w4, wINST, #8 // w4<- A+
3883 GET_VREG s0, w3
3884 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3885 and w4, w4, #15 // w4<- A
3886 fcvtzs w0, s0 // d0<- op
3887 GET_INST_OPCODE ip // extract opcode from wINST
3888 SET_VREG w0, w4 // vA<- d0
3889 GOTO_OPCODE ip // jump to next instruction
3890
3891
3892/* ------------------------------ */
3893 .balign 128
3894.L_op_float_to_long: /* 0x88 */
3895/* File: arm64/op_float_to_long.S */
3896/* File: arm64/funopWider.S */
3897 /*
3898 * Generic 32bit-to-64bit floating point unary operation. Provide an
3899 * "instr" line that specifies an instruction that performs "x0 = op s0".
3900 *
3901 * For: int-to-double, float-to-double, float-to-long
3902 */
3903 /* unop vA, vB */
3904 lsr w3, wINST, #12 // w3<- B
3905 lsr w4, wINST, #8 // w4<- A+
3906 GET_VREG s0, w3
3907 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3908 and w4, w4, #15 // w4<- A
3909 fcvtzs x0, s0 // d0<- op
3910 GET_INST_OPCODE ip // extract opcode from wINST
3911 SET_VREG_WIDE x0, w4 // vA<- d0
3912 GOTO_OPCODE ip // jump to next instruction
3913
3914
3915/* ------------------------------ */
3916 .balign 128
3917.L_op_float_to_double: /* 0x89 */
3918/* File: arm64/op_float_to_double.S */
3919/* File: arm64/funopWider.S */
3920 /*
3921 * Generic 32bit-to-64bit floating point unary operation. Provide an
3922 * "instr" line that specifies an instruction that performs "d0 = op s0".
3923 *
3924 * For: int-to-double, float-to-double, float-to-long
3925 */
3926 /* unop vA, vB */
3927 lsr w3, wINST, #12 // w3<- B
3928 lsr w4, wINST, #8 // w4<- A+
3929 GET_VREG s0, w3
3930 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3931 and w4, w4, #15 // w4<- A
3932 fcvt d0, s0 // d0<- op
3933 GET_INST_OPCODE ip // extract opcode from wINST
3934 SET_VREG_WIDE d0, w4 // vA<- d0
3935 GOTO_OPCODE ip // jump to next instruction
3936
3937
3938/* ------------------------------ */
3939 .balign 128
3940.L_op_double_to_int: /* 0x8a */
3941/* File: arm64/op_double_to_int.S */
3942/* File: arm64/funopNarrower.S */
3943 /*
3944 * Generic 64bit-to-32bit floating point unary operation. Provide an
3945 * "instr" line that specifies an instruction that performs "w0 = op d0".
3946 *
3947 * For: int-to-double, float-to-double, float-to-long
3948 */
3949 /* unop vA, vB */
3950 lsr w3, wINST, #12 // w3<- B
3951 lsr w4, wINST, #8 // w4<- A+
3952 GET_VREG_WIDE d0, w3
3953 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3954 and w4, w4, #15 // w4<- A
3955 fcvtzs w0, d0 // d0<- op
3956 GET_INST_OPCODE ip // extract opcode from wINST
3957 SET_VREG w0, w4 // vA<- d0
3958 GOTO_OPCODE ip // jump to next instruction
3959
3960
3961/* ------------------------------ */
3962 .balign 128
3963.L_op_double_to_long: /* 0x8b */
3964/* File: arm64/op_double_to_long.S */
3965/* File: arm64/funopWide.S */
3966 /*
3967 * Generic 64bit-to-64bit floating point unary operation. Provide an
3968 * "instr" line that specifies an instruction that performs "x0 = op d0".
3969 *
3970 * For: long-to-double, double-to-long
3971 */
3972 /* unop vA, vB */
3973 lsr w3, wINST, #12 // w3<- B
3974 lsr w4, wINST, #8 // w4<- A+
3975 GET_VREG_WIDE d0, w3
3976 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3977 and w4, w4, #15 // w4<- A
3978 fcvtzs x0, d0 // d0<- op
3979 GET_INST_OPCODE ip // extract opcode from wINST
3980 SET_VREG_WIDE x0, w4 // vA<- d0
3981 GOTO_OPCODE ip // jump to next instruction
3982
3983
3984/* ------------------------------ */
3985 .balign 128
3986.L_op_double_to_float: /* 0x8c */
3987/* File: arm64/op_double_to_float.S */
3988/* File: arm64/funopNarrower.S */
3989 /*
3990 * Generic 64bit-to-32bit floating point unary operation. Provide an
3991 * "instr" line that specifies an instruction that performs "s0 = op d0".
3992 *
3993 * For: int-to-double, float-to-double, float-to-long
3994 */
3995 /* unop vA, vB */
3996 lsr w3, wINST, #12 // w3<- B
3997 lsr w4, wINST, #8 // w4<- A+
3998 GET_VREG_WIDE d0, w3
3999 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
4000 and w4, w4, #15 // w4<- A
4001 fcvt s0, d0 // d0<- op
4002 GET_INST_OPCODE ip // extract opcode from wINST
4003 SET_VREG s0, w4 // vA<- d0
4004 GOTO_OPCODE ip // jump to next instruction
4005
4006
4007/* ------------------------------ */
4008 .balign 128
4009.L_op_int_to_byte: /* 0x8d */
4010/* File: arm64/op_int_to_byte.S */
4011/* File: arm64/unop.S */
4012 /*
4013 * Generic 32-bit unary operation. Provide an "instr" line that
4014 * specifies an instruction that performs "result = op w0".
4015 * This could be an ARM instruction or a function call.
4016 *
4017 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4018 * int-to-byte, int-to-char, int-to-short
4019 */
4020 /* unop vA, vB */
4021 lsr w3, wINST, #12 // w3<- B
4022 GET_VREG w0, w3 // w0<- vB
4023 ubfx w9, wINST, #8, #4 // w9<- A
4024 // optional op; may set condition codes
4025 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4026 sxtb w0, w0 // w0<- op, w0-w3 changed
4027 GET_INST_OPCODE ip // extract opcode from rINST
4028 SET_VREG w0, w9 // vAA<- w0
4029 GOTO_OPCODE ip // jump to next instruction
4030 /* 8-9 instructions */
4031
4032
4033/* ------------------------------ */
4034 .balign 128
4035.L_op_int_to_char: /* 0x8e */
4036/* File: arm64/op_int_to_char.S */
4037/* File: arm64/unop.S */
4038 /*
4039 * Generic 32-bit unary operation. Provide an "instr" line that
4040 * specifies an instruction that performs "result = op w0".
4041 * This could be an ARM instruction or a function call.
4042 *
4043 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4044 * int-to-byte, int-to-char, int-to-short
4045 */
4046 /* unop vA, vB */
4047 lsr w3, wINST, #12 // w3<- B
4048 GET_VREG w0, w3 // w0<- vB
4049 ubfx w9, wINST, #8, #4 // w9<- A
4050 // optional op; may set condition codes
4051 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4052 uxth w0, w0 // w0<- op, w0-w3 changed
4053 GET_INST_OPCODE ip // extract opcode from rINST
4054 SET_VREG w0, w9 // vAA<- w0
4055 GOTO_OPCODE ip // jump to next instruction
4056 /* 8-9 instructions */
4057
4058
4059/* ------------------------------ */
4060 .balign 128
4061.L_op_int_to_short: /* 0x8f */
4062/* File: arm64/op_int_to_short.S */
4063/* File: arm64/unop.S */
4064 /*
4065 * Generic 32-bit unary operation. Provide an "instr" line that
4066 * specifies an instruction that performs "result = op w0".
4067 * This could be an ARM instruction or a function call.
4068 *
4069 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4070 * int-to-byte, int-to-char, int-to-short
4071 */
4072 /* unop vA, vB */
4073 lsr w3, wINST, #12 // w3<- B
4074 GET_VREG w0, w3 // w0<- vB
4075 ubfx w9, wINST, #8, #4 // w9<- A
4076 // optional op; may set condition codes
4077 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4078 sxth w0, w0 // w0<- op, w0-w3 changed
4079 GET_INST_OPCODE ip // extract opcode from rINST
4080 SET_VREG w0, w9 // vAA<- w0
4081 GOTO_OPCODE ip // jump to next instruction
4082 /* 8-9 instructions */
4083
4084
4085/* ------------------------------ */
4086 .balign 128
4087.L_op_add_int: /* 0x90 */
4088/* File: arm64/op_add_int.S */
4089/* File: arm64/binop.S */
4090 /*
4091 * Generic 32-bit binary operation. Provide an "instr" line that
4092 * specifies an instruction that performs "result = w0 op w1".
4093 * This could be an ARM instruction or a function call. (If the result
4094 * comes back in a register other than w0, you can override "result".)
4095 *
4096 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4097 * vCC (w1). Useful for integer division and modulus. Note that we
4098 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4099 * handles it correctly.
4100 *
4101 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4102 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4103 * mul-float, div-float, rem-float
4104 */
4105 /* binop vAA, vBB, vCC */
4106 FETCH w0, 1 // w0<- CCBB
4107 lsr w9, wINST, #8 // w9<- AA
4108 lsr w3, w0, #8 // w3<- CC
4109 and w2, w0, #255 // w2<- BB
4110 GET_VREG w1, w3 // w1<- vCC
4111 GET_VREG w0, w2 // w0<- vBB
4112 .if 0
4113 cbz w1, common_errDivideByZero // is second operand zero?
4114 .endif
4115 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4116 // optional op; may set condition codes
4117 add w0, w0, w1 // w0<- op, w0-w3 changed
4118 GET_INST_OPCODE ip // extract opcode from rINST
4119 SET_VREG w0, w9 // vAA<- w0
4120 GOTO_OPCODE ip // jump to next instruction
4121 /* 11-14 instructions */
4122
4123
4124/* ------------------------------ */
4125 .balign 128
4126.L_op_sub_int: /* 0x91 */
4127/* File: arm64/op_sub_int.S */
4128/* File: arm64/binop.S */
4129 /*
4130 * Generic 32-bit binary operation. Provide an "instr" line that
4131 * specifies an instruction that performs "result = w0 op w1".
4132 * This could be an ARM instruction or a function call. (If the result
4133 * comes back in a register other than w0, you can override "result".)
4134 *
4135 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4136 * vCC (w1). Useful for integer division and modulus. Note that we
4137 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4138 * handles it correctly.
4139 *
4140 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4141 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4142 * mul-float, div-float, rem-float
4143 */
4144 /* binop vAA, vBB, vCC */
4145 FETCH w0, 1 // w0<- CCBB
4146 lsr w9, wINST, #8 // w9<- AA
4147 lsr w3, w0, #8 // w3<- CC
4148 and w2, w0, #255 // w2<- BB
4149 GET_VREG w1, w3 // w1<- vCC
4150 GET_VREG w0, w2 // w0<- vBB
4151 .if 0
4152 cbz w1, common_errDivideByZero // is second operand zero?
4153 .endif
4154 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4155 // optional op; may set condition codes
4156 sub w0, w0, w1 // w0<- op, w0-w3 changed
4157 GET_INST_OPCODE ip // extract opcode from rINST
4158 SET_VREG w0, w9 // vAA<- w0
4159 GOTO_OPCODE ip // jump to next instruction
4160 /* 11-14 instructions */
4161
4162
4163/* ------------------------------ */
4164 .balign 128
4165.L_op_mul_int: /* 0x92 */
4166/* File: arm64/op_mul_int.S */
4167/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
4168/* File: arm64/binop.S */
4169 /*
4170 * Generic 32-bit binary operation. Provide an "instr" line that
4171 * specifies an instruction that performs "result = w0 op w1".
4172 * This could be an ARM instruction or a function call. (If the result
4173 * comes back in a register other than w0, you can override "result".)
4174 *
4175 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4176 * vCC (w1). Useful for integer division and modulus. Note that we
4177 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4178 * handles it correctly.
4179 *
4180 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4181 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4182 * mul-float, div-float, rem-float
4183 */
4184 /* binop vAA, vBB, vCC */
4185 FETCH w0, 1 // w0<- CCBB
4186 lsr w9, wINST, #8 // w9<- AA
4187 lsr w3, w0, #8 // w3<- CC
4188 and w2, w0, #255 // w2<- BB
4189 GET_VREG w1, w3 // w1<- vCC
4190 GET_VREG w0, w2 // w0<- vBB
4191 .if 0
4192 cbz w1, common_errDivideByZero // is second operand zero?
4193 .endif
4194 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4195 // optional op; may set condition codes
4196 mul w0, w1, w0 // w0<- op, w0-w3 changed
4197 GET_INST_OPCODE ip // extract opcode from rINST
4198 SET_VREG w0, w9 // vAA<- w0
4199 GOTO_OPCODE ip // jump to next instruction
4200 /* 11-14 instructions */
4201
4202
4203/* ------------------------------ */
4204 .balign 128
4205.L_op_div_int: /* 0x93 */
4206/* File: arm64/op_div_int.S */
4207/* File: arm64/binop.S */
4208 /*
4209 * Generic 32-bit binary operation. Provide an "instr" line that
4210 * specifies an instruction that performs "result = w0 op w1".
4211 * This could be an ARM instruction or a function call. (If the result
4212 * comes back in a register other than w0, you can override "result".)
4213 *
4214 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4215 * vCC (w1). Useful for integer division and modulus. Note that we
4216 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4217 * handles it correctly.
4218 *
4219 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4220 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4221 * mul-float, div-float, rem-float
4222 */
4223 /* binop vAA, vBB, vCC */
4224 FETCH w0, 1 // w0<- CCBB
4225 lsr w9, wINST, #8 // w9<- AA
4226 lsr w3, w0, #8 // w3<- CC
4227 and w2, w0, #255 // w2<- BB
4228 GET_VREG w1, w3 // w1<- vCC
4229 GET_VREG w0, w2 // w0<- vBB
4230 .if 1
4231 cbz w1, common_errDivideByZero // is second operand zero?
4232 .endif
4233 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4234 // optional op; may set condition codes
4235 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
4236 GET_INST_OPCODE ip // extract opcode from rINST
4237 SET_VREG w0, w9 // vAA<- w0
4238 GOTO_OPCODE ip // jump to next instruction
4239 /* 11-14 instructions */
4240
4241
4242/* ------------------------------ */
4243 .balign 128
4244.L_op_rem_int: /* 0x94 */
4245/* File: arm64/op_rem_int.S */
4246/* File: arm64/binop.S */
4247 /*
4248 * Generic 32-bit binary operation. Provide an "instr" line that
4249 * specifies an instruction that performs "result = w0 op w1".
4250 * This could be an ARM instruction or a function call. (If the result
4251 * comes back in a register other than w0, you can override "result".)
4252 *
4253 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4254 * vCC (w1). Useful for integer division and modulus. Note that we
4255 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4256 * handles it correctly.
4257 *
4258 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4259 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4260 * mul-float, div-float, rem-float
4261 */
4262 /* binop vAA, vBB, vCC */
4263 FETCH w0, 1 // w0<- CCBB
4264 lsr w9, wINST, #8 // w9<- AA
4265 lsr w3, w0, #8 // w3<- CC
4266 and w2, w0, #255 // w2<- BB
4267 GET_VREG w1, w3 // w1<- vCC
4268 GET_VREG w0, w2 // w0<- vBB
4269 .if 1
4270 cbz w1, common_errDivideByZero // is second operand zero?
4271 .endif
4272 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4273 sdiv w2, w0, w1 // optional op; may set condition codes
4274 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
4275 GET_INST_OPCODE ip // extract opcode from rINST
4276 SET_VREG w0, w9 // vAA<- w0
4277 GOTO_OPCODE ip // jump to next instruction
4278 /* 11-14 instructions */
4279
4280
4281/* ------------------------------ */
4282 .balign 128
4283.L_op_and_int: /* 0x95 */
4284/* File: arm64/op_and_int.S */
4285/* File: arm64/binop.S */
4286 /*
4287 * Generic 32-bit binary operation. Provide an "instr" line that
4288 * specifies an instruction that performs "result = w0 op w1".
4289 * This could be an ARM instruction or a function call. (If the result
4290 * comes back in a register other than w0, you can override "result".)
4291 *
4292 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4293 * vCC (w1). Useful for integer division and modulus. Note that we
4294 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4295 * handles it correctly.
4296 *
4297 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4298 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4299 * mul-float, div-float, rem-float
4300 */
4301 /* binop vAA, vBB, vCC */
4302 FETCH w0, 1 // w0<- CCBB
4303 lsr w9, wINST, #8 // w9<- AA
4304 lsr w3, w0, #8 // w3<- CC
4305 and w2, w0, #255 // w2<- BB
4306 GET_VREG w1, w3 // w1<- vCC
4307 GET_VREG w0, w2 // w0<- vBB
4308 .if 0
4309 cbz w1, common_errDivideByZero // is second operand zero?
4310 .endif
4311 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4312 // optional op; may set condition codes
4313 and w0, w0, w1 // w0<- op, w0-w3 changed
4314 GET_INST_OPCODE ip // extract opcode from rINST
4315 SET_VREG w0, w9 // vAA<- w0
4316 GOTO_OPCODE ip // jump to next instruction
4317 /* 11-14 instructions */
4318
4319
4320/* ------------------------------ */
4321 .balign 128
4322.L_op_or_int: /* 0x96 */
4323/* File: arm64/op_or_int.S */
4324/* File: arm64/binop.S */
4325 /*
4326 * Generic 32-bit binary operation. Provide an "instr" line that
4327 * specifies an instruction that performs "result = w0 op w1".
4328 * This could be an ARM instruction or a function call. (If the result
4329 * comes back in a register other than w0, you can override "result".)
4330 *
4331 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4332 * vCC (w1). Useful for integer division and modulus. Note that we
4333 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4334 * handles it correctly.
4335 *
4336 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4337 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4338 * mul-float, div-float, rem-float
4339 */
4340 /* binop vAA, vBB, vCC */
4341 FETCH w0, 1 // w0<- CCBB
4342 lsr w9, wINST, #8 // w9<- AA
4343 lsr w3, w0, #8 // w3<- CC
4344 and w2, w0, #255 // w2<- BB
4345 GET_VREG w1, w3 // w1<- vCC
4346 GET_VREG w0, w2 // w0<- vBB
4347 .if 0
4348 cbz w1, common_errDivideByZero // is second operand zero?
4349 .endif
4350 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4351 // optional op; may set condition codes
4352 orr w0, w0, w1 // w0<- op, w0-w3 changed
4353 GET_INST_OPCODE ip // extract opcode from rINST
4354 SET_VREG w0, w9 // vAA<- w0
4355 GOTO_OPCODE ip // jump to next instruction
4356 /* 11-14 instructions */
4357
4358
4359/* ------------------------------ */
4360 .balign 128
4361.L_op_xor_int: /* 0x97 */
4362/* File: arm64/op_xor_int.S */
4363/* File: arm64/binop.S */
4364 /*
4365 * Generic 32-bit binary operation. Provide an "instr" line that
4366 * specifies an instruction that performs "result = w0 op w1".
4367 * This could be an ARM instruction or a function call. (If the result
4368 * comes back in a register other than w0, you can override "result".)
4369 *
4370 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4371 * vCC (w1). Useful for integer division and modulus. Note that we
4372 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4373 * handles it correctly.
4374 *
4375 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4376 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4377 * mul-float, div-float, rem-float
4378 */
4379 /* binop vAA, vBB, vCC */
4380 FETCH w0, 1 // w0<- CCBB
4381 lsr w9, wINST, #8 // w9<- AA
4382 lsr w3, w0, #8 // w3<- CC
4383 and w2, w0, #255 // w2<- BB
4384 GET_VREG w1, w3 // w1<- vCC
4385 GET_VREG w0, w2 // w0<- vBB
4386 .if 0
4387 cbz w1, common_errDivideByZero // is second operand zero?
4388 .endif
4389 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4390 // optional op; may set condition codes
4391 eor w0, w0, w1 // w0<- op, w0-w3 changed
4392 GET_INST_OPCODE ip // extract opcode from rINST
4393 SET_VREG w0, w9 // vAA<- w0
4394 GOTO_OPCODE ip // jump to next instruction
4395 /* 11-14 instructions */
4396
4397
4398/* ------------------------------ */
4399 .balign 128
4400.L_op_shl_int: /* 0x98 */
4401/* File: arm64/op_shl_int.S */
4402/* File: arm64/binop.S */
4403 /*
4404 * Generic 32-bit binary operation. Provide an "instr" line that
4405 * specifies an instruction that performs "result = w0 op w1".
4406 * This could be an ARM instruction or a function call. (If the result
4407 * comes back in a register other than w0, you can override "result".)
4408 *
4409 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4410 * vCC (w1). Useful for integer division and modulus. Note that we
4411 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4412 * handles it correctly.
4413 *
4414 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4415 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4416 * mul-float, div-float, rem-float
4417 */
4418 /* binop vAA, vBB, vCC */
4419 FETCH w0, 1 // w0<- CCBB
4420 lsr w9, wINST, #8 // w9<- AA
4421 lsr w3, w0, #8 // w3<- CC
4422 and w2, w0, #255 // w2<- BB
4423 GET_VREG w1, w3 // w1<- vCC
4424 GET_VREG w0, w2 // w0<- vBB
4425 .if 0
4426 cbz w1, common_errDivideByZero // is second operand zero?
4427 .endif
4428 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4429 and w1, w1, #31 // optional op; may set condition codes
4430 lsl w0, w0, w1 // w0<- op, w0-w3 changed
4431 GET_INST_OPCODE ip // extract opcode from rINST
4432 SET_VREG w0, w9 // vAA<- w0
4433 GOTO_OPCODE ip // jump to next instruction
4434 /* 11-14 instructions */
4435
4436
4437/* ------------------------------ */
4438 .balign 128
4439.L_op_shr_int: /* 0x99 */
4440/* File: arm64/op_shr_int.S */
4441/* File: arm64/binop.S */
4442 /*
4443 * Generic 32-bit binary operation. Provide an "instr" line that
4444 * specifies an instruction that performs "result = w0 op w1".
4445 * This could be an ARM instruction or a function call. (If the result
4446 * comes back in a register other than w0, you can override "result".)
4447 *
4448 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4449 * vCC (w1). Useful for integer division and modulus. Note that we
4450 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4451 * handles it correctly.
4452 *
4453 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4454 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4455 * mul-float, div-float, rem-float
4456 */
4457 /* binop vAA, vBB, vCC */
4458 FETCH w0, 1 // w0<- CCBB
4459 lsr w9, wINST, #8 // w9<- AA
4460 lsr w3, w0, #8 // w3<- CC
4461 and w2, w0, #255 // w2<- BB
4462 GET_VREG w1, w3 // w1<- vCC
4463 GET_VREG w0, w2 // w0<- vBB
4464 .if 0
4465 cbz w1, common_errDivideByZero // is second operand zero?
4466 .endif
4467 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4468 and w1, w1, #31 // optional op; may set condition codes
4469 asr w0, w0, w1 // w0<- op, w0-w3 changed
4470 GET_INST_OPCODE ip // extract opcode from rINST
4471 SET_VREG w0, w9 // vAA<- w0
4472 GOTO_OPCODE ip // jump to next instruction
4473 /* 11-14 instructions */
4474
4475
4476/* ------------------------------ */
4477 .balign 128
4478.L_op_ushr_int: /* 0x9a */
4479/* File: arm64/op_ushr_int.S */
4480/* File: arm64/binop.S */
4481 /*
4482 * Generic 32-bit binary operation. Provide an "instr" line that
4483 * specifies an instruction that performs "result = w0 op w1".
4484 * This could be an ARM instruction or a function call. (If the result
4485 * comes back in a register other than w0, you can override "result".)
4486 *
4487 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4488 * vCC (w1). Useful for integer division and modulus. Note that we
4489 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4490 * handles it correctly.
4491 *
4492 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4493 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4494 * mul-float, div-float, rem-float
4495 */
4496 /* binop vAA, vBB, vCC */
4497 FETCH w0, 1 // w0<- CCBB
4498 lsr w9, wINST, #8 // w9<- AA
4499 lsr w3, w0, #8 // w3<- CC
4500 and w2, w0, #255 // w2<- BB
4501 GET_VREG w1, w3 // w1<- vCC
4502 GET_VREG w0, w2 // w0<- vBB
4503 .if 0
4504 cbz w1, common_errDivideByZero // is second operand zero?
4505 .endif
4506 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4507 and w1, w1, #31 // optional op; may set condition codes
4508 lsr w0, w0, w1 // w0<- op, w0-w3 changed
4509 GET_INST_OPCODE ip // extract opcode from rINST
4510 SET_VREG w0, w9 // vAA<- w0
4511 GOTO_OPCODE ip // jump to next instruction
4512 /* 11-14 instructions */
4513
4514
4515/* ------------------------------ */
4516 .balign 128
4517.L_op_add_long: /* 0x9b */
4518/* File: arm64/op_add_long.S */
4519/* File: arm64/binopWide.S */
4520 /*
4521 * Generic 64-bit binary operation. Provide an "instr" line that
4522 * specifies an instruction that performs "result = x1 op x2".
4523 * This could be an ARM instruction or a function call. (If the result
4524 * comes back in a register other than x0, you can override "result".)
4525 *
4526 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4527 * vCC (w1). Useful for integer division and modulus.
4528 *
4529 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4530 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4531 */
4532 /* binop vAA, vBB, vCC */
4533 FETCH w0, 1 // w0<- CCBB
4534 lsr w4, wINST, #8 // w4<- AA
4535 lsr w2, w0, #8 // w2<- CC
4536 and w1, w0, #255 // w1<- BB
4537 GET_VREG_WIDE x2, w2 // w2<- vCC
4538 GET_VREG_WIDE x1, w1 // w1<- vBB
4539 .if 0
4540 cbz x2, common_errDivideByZero // is second operand zero?
4541 .endif
4542 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4543
4544 add x0, x1, x2 // x0<- op, w0-w4 changed
4545 GET_INST_OPCODE ip // extract opcode from rINST
4546 SET_VREG_WIDE x0, w4 // vAA<- x0
4547 GOTO_OPCODE ip // jump to next instruction
4548 /* 11-14 instructions */
4549
4550
4551/* ------------------------------ */
4552 .balign 128
4553.L_op_sub_long: /* 0x9c */
4554/* File: arm64/op_sub_long.S */
4555/* File: arm64/binopWide.S */
4556 /*
4557 * Generic 64-bit binary operation. Provide an "instr" line that
4558 * specifies an instruction that performs "result = x1 op x2".
4559 * This could be an ARM instruction or a function call. (If the result
4560 * comes back in a register other than x0, you can override "result".)
4561 *
4562 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4563 * vCC (w1). Useful for integer division and modulus.
4564 *
4565 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4566 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4567 */
4568 /* binop vAA, vBB, vCC */
4569 FETCH w0, 1 // w0<- CCBB
4570 lsr w4, wINST, #8 // w4<- AA
4571 lsr w2, w0, #8 // w2<- CC
4572 and w1, w0, #255 // w1<- BB
4573 GET_VREG_WIDE x2, w2 // w2<- vCC
4574 GET_VREG_WIDE x1, w1 // w1<- vBB
4575 .if 0
4576 cbz x2, common_errDivideByZero // is second operand zero?
4577 .endif
4578 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4579
4580 sub x0, x1, x2 // x0<- op, w0-w4 changed
4581 GET_INST_OPCODE ip // extract opcode from rINST
4582 SET_VREG_WIDE x0, w4 // vAA<- x0
4583 GOTO_OPCODE ip // jump to next instruction
4584 /* 11-14 instructions */
4585
4586
4587/* ------------------------------ */
4588 .balign 128
4589.L_op_mul_long: /* 0x9d */
4590/* File: arm64/op_mul_long.S */
4591/* File: arm64/binopWide.S */
4592 /*
4593 * Generic 64-bit binary operation. Provide an "instr" line that
4594 * specifies an instruction that performs "result = x1 op x2".
4595 * This could be an ARM instruction or a function call. (If the result
4596 * comes back in a register other than x0, you can override "result".)
4597 *
4598 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4599 * vCC (w1). Useful for integer division and modulus.
4600 *
4601 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4602 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4603 */
4604 /* binop vAA, vBB, vCC */
4605 FETCH w0, 1 // w0<- CCBB
4606 lsr w4, wINST, #8 // w4<- AA
4607 lsr w2, w0, #8 // w2<- CC
4608 and w1, w0, #255 // w1<- BB
4609 GET_VREG_WIDE x2, w2 // w2<- vCC
4610 GET_VREG_WIDE x1, w1 // w1<- vBB
4611 .if 0
4612 cbz x2, common_errDivideByZero // is second operand zero?
4613 .endif
4614 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4615
4616 mul x0, x1, x2 // x0<- op, w0-w4 changed
4617 GET_INST_OPCODE ip // extract opcode from rINST
4618 SET_VREG_WIDE x0, w4 // vAA<- x0
4619 GOTO_OPCODE ip // jump to next instruction
4620 /* 11-14 instructions */
4621
4622
4623/* ------------------------------ */
4624 .balign 128
4625.L_op_div_long: /* 0x9e */
4626/* File: arm64/op_div_long.S */
4627/* File: arm64/binopWide.S */
4628 /*
4629 * Generic 64-bit binary operation. Provide an "instr" line that
4630 * specifies an instruction that performs "result = x1 op x2".
4631 * This could be an ARM instruction or a function call. (If the result
4632 * comes back in a register other than x0, you can override "result".)
4633 *
4634 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4635 * vCC (w1). Useful for integer division and modulus.
4636 *
4637 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4638 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4639 */
4640 /* binop vAA, vBB, vCC */
4641 FETCH w0, 1 // w0<- CCBB
4642 lsr w4, wINST, #8 // w4<- AA
4643 lsr w2, w0, #8 // w2<- CC
4644 and w1, w0, #255 // w1<- BB
4645 GET_VREG_WIDE x2, w2 // w2<- vCC
4646 GET_VREG_WIDE x1, w1 // w1<- vBB
4647 .if 1
4648 cbz x2, common_errDivideByZero // is second operand zero?
4649 .endif
4650 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4651
4652 sdiv x0, x1, x2 // x0<- op, w0-w4 changed
4653 GET_INST_OPCODE ip // extract opcode from rINST
4654 SET_VREG_WIDE x0, w4 // vAA<- x0
4655 GOTO_OPCODE ip // jump to next instruction
4656 /* 11-14 instructions */
4657
4658
4659/* ------------------------------ */
4660 .balign 128
4661.L_op_rem_long: /* 0x9f */
4662/* File: arm64/op_rem_long.S */
4663/* File: arm64/binopWide.S */
4664 /*
4665 * Generic 64-bit binary operation. Provide an "instr" line that
4666 * specifies an instruction that performs "result = x1 op x2".
4667 * This could be an ARM instruction or a function call. (If the result
4668 * comes back in a register other than x0, you can override "result".)
4669 *
4670 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4671 * vCC (w1). Useful for integer division and modulus.
4672 *
4673 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4674 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4675 */
4676 /* binop vAA, vBB, vCC */
4677 FETCH w0, 1 // w0<- CCBB
4678 lsr w4, wINST, #8 // w4<- AA
4679 lsr w2, w0, #8 // w2<- CC
4680 and w1, w0, #255 // w1<- BB
4681 GET_VREG_WIDE x2, w2 // w2<- vCC
4682 GET_VREG_WIDE x1, w1 // w1<- vBB
4683 .if 1
4684 cbz x2, common_errDivideByZero // is second operand zero?
4685 .endif
4686 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4687 sdiv x3, x1, x2
4688 msub x0, x3, x2, x1 // x0<- op, w0-w4 changed
4689 GET_INST_OPCODE ip // extract opcode from rINST
4690 SET_VREG_WIDE x0, w4 // vAA<- x0
4691 GOTO_OPCODE ip // jump to next instruction
4692 /* 11-14 instructions */
4693
4694
4695/* ------------------------------ */
4696 .balign 128
4697.L_op_and_long: /* 0xa0 */
4698/* File: arm64/op_and_long.S */
4699/* File: arm64/binopWide.S */
4700 /*
4701 * Generic 64-bit binary operation. Provide an "instr" line that
4702 * specifies an instruction that performs "result = x1 op x2".
4703 * This could be an ARM instruction or a function call. (If the result
4704 * comes back in a register other than x0, you can override "result".)
4705 *
4706 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4707 * vCC (w1). Useful for integer division and modulus.
4708 *
4709 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4710 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4711 */
4712 /* binop vAA, vBB, vCC */
4713 FETCH w0, 1 // w0<- CCBB
4714 lsr w4, wINST, #8 // w4<- AA
4715 lsr w2, w0, #8 // w2<- CC
4716 and w1, w0, #255 // w1<- BB
4717 GET_VREG_WIDE x2, w2 // w2<- vCC
4718 GET_VREG_WIDE x1, w1 // w1<- vBB
4719 .if 0
4720 cbz x2, common_errDivideByZero // is second operand zero?
4721 .endif
4722 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4723
4724 and x0, x1, x2 // x0<- op, w0-w4 changed
4725 GET_INST_OPCODE ip // extract opcode from rINST
4726 SET_VREG_WIDE x0, w4 // vAA<- x0
4727 GOTO_OPCODE ip // jump to next instruction
4728 /* 11-14 instructions */
4729
4730
4731/* ------------------------------ */
4732 .balign 128
4733.L_op_or_long: /* 0xa1 */
4734/* File: arm64/op_or_long.S */
4735/* File: arm64/binopWide.S */
4736 /*
4737 * Generic 64-bit binary operation. Provide an "instr" line that
4738 * specifies an instruction that performs "result = x1 op x2".
4739 * This could be an ARM instruction or a function call. (If the result
4740 * comes back in a register other than x0, you can override "result".)
4741 *
4742 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4743 * vCC (w1). Useful for integer division and modulus.
4744 *
4745 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4746 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4747 */
4748 /* binop vAA, vBB, vCC */
4749 FETCH w0, 1 // w0<- CCBB
4750 lsr w4, wINST, #8 // w4<- AA
4751 lsr w2, w0, #8 // w2<- CC
4752 and w1, w0, #255 // w1<- BB
4753 GET_VREG_WIDE x2, w2 // w2<- vCC
4754 GET_VREG_WIDE x1, w1 // w1<- vBB
4755 .if 0
4756 cbz x2, common_errDivideByZero // is second operand zero?
4757 .endif
4758 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4759
4760 orr x0, x1, x2 // x0<- op, w0-w4 changed
4761 GET_INST_OPCODE ip // extract opcode from rINST
4762 SET_VREG_WIDE x0, w4 // vAA<- x0
4763 GOTO_OPCODE ip // jump to next instruction
4764 /* 11-14 instructions */
4765
4766
4767/* ------------------------------ */
4768 .balign 128
4769.L_op_xor_long: /* 0xa2 */
4770/* File: arm64/op_xor_long.S */
4771/* File: arm64/binopWide.S */
4772 /*
4773 * Generic 64-bit binary operation. Provide an "instr" line that
4774 * specifies an instruction that performs "result = x1 op x2".
4775 * This could be an ARM instruction or a function call. (If the result
4776 * comes back in a register other than x0, you can override "result".)
4777 *
4778 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4779 * vCC (w1). Useful for integer division and modulus.
4780 *
4781 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4782 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4783 */
4784 /* binop vAA, vBB, vCC */
4785 FETCH w0, 1 // w0<- CCBB
4786 lsr w4, wINST, #8 // w4<- AA
4787 lsr w2, w0, #8 // w2<- CC
4788 and w1, w0, #255 // w1<- BB
4789 GET_VREG_WIDE x2, w2 // w2<- vCC
4790 GET_VREG_WIDE x1, w1 // w1<- vBB
4791 .if 0
4792 cbz x2, common_errDivideByZero // is second operand zero?
4793 .endif
4794 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4795
4796 eor x0, x1, x2 // x0<- op, w0-w4 changed
4797 GET_INST_OPCODE ip // extract opcode from rINST
4798 SET_VREG_WIDE x0, w4 // vAA<- x0
4799 GOTO_OPCODE ip // jump to next instruction
4800 /* 11-14 instructions */
4801
4802
4803/* ------------------------------ */
4804 .balign 128
4805.L_op_shl_long: /* 0xa3 */
4806/* File: arm64/op_shl_long.S */
4807/* File: arm64/shiftWide.S */
4808 /*
4809 * 64-bit shift operation.
4810 *
4811 * For: shl-long, shr-long, ushr-long
4812 */
4813 /* binop vAA, vBB, vCC */
4814 FETCH w0, 1 // w0<- CCBB
4815 lsr w3, wINST, #8 // w3<- AA
4816 lsr w2, w0, #8 // w2<- CC
4817 GET_VREG w2, w2 // w2<- vCC (shift count)
4818 and w1, w0, #255 // w1<- BB
4819 GET_VREG_WIDE x1, w1 // x1<- vBB
4820 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4821 and x2, x2, #63 // Mask low 6
4822 lsl x0, x1, x2 // Do the shift.
4823 GET_INST_OPCODE ip // extract opcode from rINST
4824 SET_VREG_WIDE x0, w3 // vAA<- x0
4825 GOTO_OPCODE ip // jump to next instruction
4826 /* 11-14 instructions */
4827
4828
4829/* ------------------------------ */
4830 .balign 128
4831.L_op_shr_long: /* 0xa4 */
4832/* File: arm64/op_shr_long.S */
4833/* File: arm64/shiftWide.S */
4834 /*
4835 * 64-bit shift operation.
4836 *
4837 * For: shl-long, shr-long, ushr-long
4838 */
4839 /* binop vAA, vBB, vCC */
4840 FETCH w0, 1 // w0<- CCBB
4841 lsr w3, wINST, #8 // w3<- AA
4842 lsr w2, w0, #8 // w2<- CC
4843 GET_VREG w2, w2 // w2<- vCC (shift count)
4844 and w1, w0, #255 // w1<- BB
4845 GET_VREG_WIDE x1, w1 // x1<- vBB
4846 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4847 and x2, x2, #63 // Mask low 6
4848 asr x0, x1, x2 // Do the shift.
4849 GET_INST_OPCODE ip // extract opcode from rINST
4850 SET_VREG_WIDE x0, w3 // vAA<- x0
4851 GOTO_OPCODE ip // jump to next instruction
4852 /* 11-14 instructions */
4853
4854
4855/* ------------------------------ */
4856 .balign 128
4857.L_op_ushr_long: /* 0xa5 */
4858/* File: arm64/op_ushr_long.S */
4859/* File: arm64/shiftWide.S */
4860 /*
4861 * 64-bit shift operation.
4862 *
4863 * For: shl-long, shr-long, ushr-long
4864 */
4865 /* binop vAA, vBB, vCC */
4866 FETCH w0, 1 // w0<- CCBB
4867 lsr w3, wINST, #8 // w3<- AA
4868 lsr w2, w0, #8 // w2<- CC
4869 GET_VREG w2, w2 // w2<- vCC (shift count)
4870 and w1, w0, #255 // w1<- BB
4871 GET_VREG_WIDE x1, w1 // x1<- vBB
4872 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4873 and x2, x2, #63 // Mask low 6
4874 lsr x0, x1, x2 // Do the shift.
4875 GET_INST_OPCODE ip // extract opcode from rINST
4876 SET_VREG_WIDE x0, w3 // vAA<- x0
4877 GOTO_OPCODE ip // jump to next instruction
4878 /* 11-14 instructions */
4879
4880
4881/* ------------------------------ */
4882 .balign 128
4883.L_op_add_float: /* 0xa6 */
4884/* File: arm64/op_add_float.S */
4885/* File: arm64/fbinop.S */
4886 /*:
4887 * Generic 32-bit floating-point operation.
4888 *
4889 * For: add-float, sub-float, mul-float, div-float
4890 * form: <op> s0, s0, s1
4891 */
4892 /* floatop vAA, vBB, vCC */
4893 FETCH w0, 1 // r0<- CCBB
4894 lsr w1, w0, #8 // r2<- CC
4895 and w0, w0, #255 // r1<- BB
4896 GET_VREG s1, w1
4897 GET_VREG s0, w0
4898 fadd s0, s0, s1 // s0<- op
4899 lsr w1, wINST, #8 // r1<- AA
4900 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4901 GET_INST_OPCODE ip // extract opcode from rINST
4902 SET_VREG s0, w1
4903 GOTO_OPCODE ip // jump to next instruction
4904
4905
4906/* ------------------------------ */
4907 .balign 128
4908.L_op_sub_float: /* 0xa7 */
4909/* File: arm64/op_sub_float.S */
4910/* File: arm64/fbinop.S */
4911 /*:
4912 * Generic 32-bit floating-point operation.
4913 *
4914 * For: add-float, sub-float, mul-float, div-float
4915 * form: <op> s0, s0, s1
4916 */
4917 /* floatop vAA, vBB, vCC */
4918 FETCH w0, 1 // r0<- CCBB
4919 lsr w1, w0, #8 // r2<- CC
4920 and w0, w0, #255 // r1<- BB
4921 GET_VREG s1, w1
4922 GET_VREG s0, w0
4923 fsub s0, s0, s1 // s0<- op
4924 lsr w1, wINST, #8 // r1<- AA
4925 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4926 GET_INST_OPCODE ip // extract opcode from rINST
4927 SET_VREG s0, w1
4928 GOTO_OPCODE ip // jump to next instruction
4929
4930
4931/* ------------------------------ */
4932 .balign 128
4933.L_op_mul_float: /* 0xa8 */
4934/* File: arm64/op_mul_float.S */
4935/* File: arm64/fbinop.S */
4936 /*:
4937 * Generic 32-bit floating-point operation.
4938 *
4939 * For: add-float, sub-float, mul-float, div-float
4940 * form: <op> s0, s0, s1
4941 */
4942 /* floatop vAA, vBB, vCC */
4943 FETCH w0, 1 // r0<- CCBB
4944 lsr w1, w0, #8 // r2<- CC
4945 and w0, w0, #255 // r1<- BB
4946 GET_VREG s1, w1
4947 GET_VREG s0, w0
4948 fmul s0, s0, s1 // s0<- op
4949 lsr w1, wINST, #8 // r1<- AA
4950 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4951 GET_INST_OPCODE ip // extract opcode from rINST
4952 SET_VREG s0, w1
4953 GOTO_OPCODE ip // jump to next instruction
4954
4955
4956/* ------------------------------ */
4957 .balign 128
4958.L_op_div_float: /* 0xa9 */
4959/* File: arm64/op_div_float.S */
4960/* File: arm64/fbinop.S */
4961 /*:
4962 * Generic 32-bit floating-point operation.
4963 *
4964 * For: add-float, sub-float, mul-float, div-float
4965 * form: <op> s0, s0, s1
4966 */
4967 /* floatop vAA, vBB, vCC */
4968 FETCH w0, 1 // r0<- CCBB
4969 lsr w1, w0, #8 // r2<- CC
4970 and w0, w0, #255 // r1<- BB
4971 GET_VREG s1, w1
4972 GET_VREG s0, w0
4973 fdiv s0, s0, s1 // s0<- op
4974 lsr w1, wINST, #8 // r1<- AA
4975 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4976 GET_INST_OPCODE ip // extract opcode from rINST
4977 SET_VREG s0, w1
4978 GOTO_OPCODE ip // jump to next instruction
4979
4980
4981/* ------------------------------ */
4982 .balign 128
4983.L_op_rem_float: /* 0xaa */
4984/* File: arm64/op_rem_float.S */
4985/* EABI doesn't define a float remainder function, but libm does */
4986/* File: arm64/fbinop.S */
4987 /*:
4988 * Generic 32-bit floating-point operation.
4989 *
4990 * For: add-float, sub-float, mul-float, div-float
4991 * form: <op> s0, s0, s1
4992 */
4993 /* floatop vAA, vBB, vCC */
4994 FETCH w0, 1 // r0<- CCBB
4995 lsr w1, w0, #8 // r2<- CC
4996 and w0, w0, #255 // r1<- BB
4997 GET_VREG s1, w1
4998 GET_VREG s0, w0
4999 bl fmodf // s0<- op
5000 lsr w1, wINST, #8 // r1<- AA
5001 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5002 GET_INST_OPCODE ip // extract opcode from rINST
5003 SET_VREG s0, w1
5004 GOTO_OPCODE ip // jump to next instruction
5005
5006
5007/* ------------------------------ */
5008 .balign 128
5009.L_op_add_double: /* 0xab */
5010/* File: arm64/op_add_double.S */
5011/* File: arm64/binopWide.S */
5012 /*
5013 * Generic 64-bit binary operation. Provide an "instr" line that
5014 * specifies an instruction that performs "result = x1 op x2".
5015 * This could be an ARM instruction or a function call. (If the result
5016 * comes back in a register other than x0, you can override "result".)
5017 *
5018 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5019 * vCC (w1). Useful for integer division and modulus.
5020 *
5021 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
5022 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
5023 */
5024 /* binop vAA, vBB, vCC */
5025 FETCH w0, 1 // w0<- CCBB
5026 lsr w4, wINST, #8 // w4<- AA
5027 lsr w2, w0, #8 // w2<- CC
5028 and w1, w0, #255 // w1<- BB
5029 GET_VREG_WIDE d2, w2 // w2<- vCC
5030 GET_VREG_WIDE d1, w1 // w1<- vBB
5031 .if 0
5032 cbz d2, common_errDivideByZero // is second operand zero?
5033 .endif
5034 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5035
5036 fadd d0, d1, d2 // d0<- op, w0-w4 changed
5037 GET_INST_OPCODE ip // extract opcode from rINST
5038 SET_VREG_WIDE d0, w4 // vAA<- d0
5039 GOTO_OPCODE ip // jump to next instruction
5040 /* 11-14 instructions */
5041
5042
5043/* ------------------------------ */
5044 .balign 128
5045.L_op_sub_double: /* 0xac */
5046/* File: arm64/op_sub_double.S */
5047/* File: arm64/binopWide.S */
5048 /*
5049 * Generic 64-bit binary operation. Provide an "instr" line that
5050 * specifies an instruction that performs "result = x1 op x2".
5051 * This could be an ARM instruction or a function call. (If the result
5052 * comes back in a register other than x0, you can override "result".)
5053 *
5054 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5055 * vCC (w1). Useful for integer division and modulus.
5056 *
5057 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
5058 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
5059 */
5060 /* binop vAA, vBB, vCC */
5061 FETCH w0, 1 // w0<- CCBB
5062 lsr w4, wINST, #8 // w4<- AA
5063 lsr w2, w0, #8 // w2<- CC
5064 and w1, w0, #255 // w1<- BB
5065 GET_VREG_WIDE d2, w2 // w2<- vCC
5066 GET_VREG_WIDE d1, w1 // w1<- vBB
5067 .if 0
5068 cbz d2, common_errDivideByZero // is second operand zero?
5069 .endif
5070 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5071
5072 fsub d0, d1, d2 // d0<- op, w0-w4 changed
5073 GET_INST_OPCODE ip // extract opcode from rINST
5074 SET_VREG_WIDE d0, w4 // vAA<- d0
5075 GOTO_OPCODE ip // jump to next instruction
5076 /* 11-14 instructions */
5077
5078
5079/* ------------------------------ */
5080 .balign 128
5081.L_op_mul_double: /* 0xad */
5082/* File: arm64/op_mul_double.S */
5083/* File: arm64/binopWide.S */
5084 /*
5085 * Generic 64-bit binary operation. Provide an "instr" line that
5086 * specifies an instruction that performs "result = x1 op x2".
5087 * This could be an ARM instruction or a function call. (If the result
5088 * comes back in a register other than x0, you can override "result".)
5089 *
5090 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5091 * vCC (w1). Useful for integer division and modulus.
5092 *
5093 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
5094 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
5095 */
5096 /* binop vAA, vBB, vCC */
5097 FETCH w0, 1 // w0<- CCBB
5098 lsr w4, wINST, #8 // w4<- AA
5099 lsr w2, w0, #8 // w2<- CC
5100 and w1, w0, #255 // w1<- BB
5101 GET_VREG_WIDE d2, w2 // w2<- vCC
5102 GET_VREG_WIDE d1, w1 // w1<- vBB
5103 .if 0
5104 cbz d2, common_errDivideByZero // is second operand zero?
5105 .endif
5106 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5107
5108 fmul d0, d1, d2 // d0<- op, w0-w4 changed
5109 GET_INST_OPCODE ip // extract opcode from rINST
5110 SET_VREG_WIDE d0, w4 // vAA<- d0
5111 GOTO_OPCODE ip // jump to next instruction
5112 /* 11-14 instructions */
5113
5114
5115/* ------------------------------ */
5116 .balign 128
5117.L_op_div_double: /* 0xae */
5118/* File: arm64/op_div_double.S */
5119/* File: arm64/binopWide.S */
5120 /*
5121 * Generic 64-bit binary operation. Provide an "instr" line that
5122 * specifies an instruction that performs "result = x1 op x2".
5123 * This could be an ARM instruction or a function call. (If the result
5124 * comes back in a register other than x0, you can override "result".)
5125 *
5126 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5127 * vCC (w1). Useful for integer division and modulus.
5128 *
5129 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
5130 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
5131 */
5132 /* binop vAA, vBB, vCC */
5133 FETCH w0, 1 // w0<- CCBB
5134 lsr w4, wINST, #8 // w4<- AA
5135 lsr w2, w0, #8 // w2<- CC
5136 and w1, w0, #255 // w1<- BB
5137 GET_VREG_WIDE d2, w2 // w2<- vCC
5138 GET_VREG_WIDE d1, w1 // w1<- vBB
5139 .if 0
5140 cbz d2, common_errDivideByZero // is second operand zero?
5141 .endif
5142 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5143
5144 fdiv d0, d1, d2 // d0<- op, w0-w4 changed
5145 GET_INST_OPCODE ip // extract opcode from rINST
5146 SET_VREG_WIDE d0, w4 // vAA<- d0
5147 GOTO_OPCODE ip // jump to next instruction
5148 /* 11-14 instructions */
5149
5150
5151/* ------------------------------ */
5152 .balign 128
5153.L_op_rem_double: /* 0xaf */
5154/* File: arm64/op_rem_double.S */
5155 /* rem vAA, vBB, vCC */
5156 FETCH w0, 1 // w0<- CCBB
5157 lsr w2, w0, #8 // w2<- CC
5158 and w1, w0, #255 // w1<- BB
5159 GET_VREG_WIDE d1, w2 // d1<- vCC
5160 GET_VREG_WIDE d0, w1 // d0<- vBB
5161 bl fmod
5162 lsr w4, wINST, #8 // w4<- AA
5163 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5164 GET_INST_OPCODE ip // extract opcode from rINST
5165 SET_VREG_WIDE d0, w4 // vAA<- result
5166 GOTO_OPCODE ip // jump to next instruction
5167 /* 11-14 instructions */
5168
5169/* ------------------------------ */
5170 .balign 128
5171.L_op_add_int_2addr: /* 0xb0 */
5172/* File: arm64/op_add_int_2addr.S */
5173/* File: arm64/binop2addr.S */
5174 /*
5175 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5176 * that specifies an instruction that performs "result = w0 op w1".
5177 * This could be an ARM instruction or a function call. (If the result
5178 * comes back in a register other than w0, you can override "result".)
5179 *
5180 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5181 * vCC (w1). Useful for integer division and modulus.
5182 *
5183 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5184 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5185 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5186 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5187 */
5188 /* binop/2addr vA, vB */
5189 lsr w3, wINST, #12 // w3<- B
5190 ubfx w9, wINST, #8, #4 // w9<- A
5191 GET_VREG w1, w3 // w1<- vB
5192 GET_VREG w0, w9 // w0<- vA
5193 .if 0
5194 cbz w1, common_errDivideByZero
5195 .endif
5196 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5197 // optional op; may set condition codes
5198 add w0, w0, w1 // w0<- op, w0-w3 changed
5199 GET_INST_OPCODE ip // extract opcode from rINST
5200 SET_VREG w0, w9 // vAA<- w0
5201 GOTO_OPCODE ip // jump to next instruction
5202 /* 10-13 instructions */
5203
5204
5205/* ------------------------------ */
5206 .balign 128
5207.L_op_sub_int_2addr: /* 0xb1 */
5208/* File: arm64/op_sub_int_2addr.S */
5209/* File: arm64/binop2addr.S */
5210 /*
5211 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5212 * that specifies an instruction that performs "result = w0 op w1".
5213 * This could be an ARM instruction or a function call. (If the result
5214 * comes back in a register other than w0, you can override "result".)
5215 *
5216 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5217 * vCC (w1). Useful for integer division and modulus.
5218 *
5219 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5220 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5221 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5222 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5223 */
5224 /* binop/2addr vA, vB */
5225 lsr w3, wINST, #12 // w3<- B
5226 ubfx w9, wINST, #8, #4 // w9<- A
5227 GET_VREG w1, w3 // w1<- vB
5228 GET_VREG w0, w9 // w0<- vA
5229 .if 0
5230 cbz w1, common_errDivideByZero
5231 .endif
5232 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5233 // optional op; may set condition codes
5234 sub w0, w0, w1 // w0<- op, w0-w3 changed
5235 GET_INST_OPCODE ip // extract opcode from rINST
5236 SET_VREG w0, w9 // vAA<- w0
5237 GOTO_OPCODE ip // jump to next instruction
5238 /* 10-13 instructions */
5239
5240
5241/* ------------------------------ */
5242 .balign 128
5243.L_op_mul_int_2addr: /* 0xb2 */
5244/* File: arm64/op_mul_int_2addr.S */
5245/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
5246/* File: arm64/binop2addr.S */
5247 /*
5248 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5249 * that specifies an instruction that performs "result = w0 op w1".
5250 * This could be an ARM instruction or a function call. (If the result
5251 * comes back in a register other than w0, you can override "result".)
5252 *
5253 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5254 * vCC (w1). Useful for integer division and modulus.
5255 *
5256 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5257 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5258 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5259 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5260 */
5261 /* binop/2addr vA, vB */
5262 lsr w3, wINST, #12 // w3<- B
5263 ubfx w9, wINST, #8, #4 // w9<- A
5264 GET_VREG w1, w3 // w1<- vB
5265 GET_VREG w0, w9 // w0<- vA
5266 .if 0
5267 cbz w1, common_errDivideByZero
5268 .endif
5269 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5270 // optional op; may set condition codes
5271 mul w0, w1, w0 // w0<- op, w0-w3 changed
5272 GET_INST_OPCODE ip // extract opcode from rINST
5273 SET_VREG w0, w9 // vAA<- w0
5274 GOTO_OPCODE ip // jump to next instruction
5275 /* 10-13 instructions */
5276
5277
5278/* ------------------------------ */
5279 .balign 128
5280.L_op_div_int_2addr: /* 0xb3 */
5281/* File: arm64/op_div_int_2addr.S */
5282/* File: arm64/binop2addr.S */
5283 /*
5284 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5285 * that specifies an instruction that performs "result = w0 op w1".
5286 * This could be an ARM instruction or a function call. (If the result
5287 * comes back in a register other than w0, you can override "result".)
5288 *
5289 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5290 * vCC (w1). Useful for integer division and modulus.
5291 *
5292 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5293 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5294 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5295 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5296 */
5297 /* binop/2addr vA, vB */
5298 lsr w3, wINST, #12 // w3<- B
5299 ubfx w9, wINST, #8, #4 // w9<- A
5300 GET_VREG w1, w3 // w1<- vB
5301 GET_VREG w0, w9 // w0<- vA
5302 .if 1
5303 cbz w1, common_errDivideByZero
5304 .endif
5305 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5306 // optional op; may set condition codes
5307 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
5308 GET_INST_OPCODE ip // extract opcode from rINST
5309 SET_VREG w0, w9 // vAA<- w0
5310 GOTO_OPCODE ip // jump to next instruction
5311 /* 10-13 instructions */
5312
5313
5314/* ------------------------------ */
5315 .balign 128
5316.L_op_rem_int_2addr: /* 0xb4 */
5317/* File: arm64/op_rem_int_2addr.S */
5318/* File: arm64/binop2addr.S */
5319 /*
5320 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5321 * that specifies an instruction that performs "result = w0 op w1".
5322 * This could be an ARM instruction or a function call. (If the result
5323 * comes back in a register other than w0, you can override "result".)
5324 *
5325 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5326 * vCC (w1). Useful for integer division and modulus.
5327 *
5328 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5329 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5330 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5331 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5332 */
5333 /* binop/2addr vA, vB */
5334 lsr w3, wINST, #12 // w3<- B
5335 ubfx w9, wINST, #8, #4 // w9<- A
5336 GET_VREG w1, w3 // w1<- vB
5337 GET_VREG w0, w9 // w0<- vA
5338 .if 1
5339 cbz w1, common_errDivideByZero
5340 .endif
5341 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5342 sdiv w2, w0, w1 // optional op; may set condition codes
5343 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
5344 GET_INST_OPCODE ip // extract opcode from rINST
5345 SET_VREG w0, w9 // vAA<- w0
5346 GOTO_OPCODE ip // jump to next instruction
5347 /* 10-13 instructions */
5348
5349
5350/* ------------------------------ */
5351 .balign 128
5352.L_op_and_int_2addr: /* 0xb5 */
5353/* File: arm64/op_and_int_2addr.S */
5354/* File: arm64/binop2addr.S */
5355 /*
5356 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5357 * that specifies an instruction that performs "result = w0 op w1".
5358 * This could be an ARM instruction or a function call. (If the result
5359 * comes back in a register other than w0, you can override "result".)
5360 *
5361 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5362 * vCC (w1). Useful for integer division and modulus.
5363 *
5364 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5365 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5366 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5367 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5368 */
5369 /* binop/2addr vA, vB */
5370 lsr w3, wINST, #12 // w3<- B
5371 ubfx w9, wINST, #8, #4 // w9<- A
5372 GET_VREG w1, w3 // w1<- vB
5373 GET_VREG w0, w9 // w0<- vA
5374 .if 0
5375 cbz w1, common_errDivideByZero
5376 .endif
5377 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5378 // optional op; may set condition codes
5379 and w0, w0, w1 // w0<- op, w0-w3 changed
5380 GET_INST_OPCODE ip // extract opcode from rINST
5381 SET_VREG w0, w9 // vAA<- w0
5382 GOTO_OPCODE ip // jump to next instruction
5383 /* 10-13 instructions */
5384
5385
5386/* ------------------------------ */
5387 .balign 128
5388.L_op_or_int_2addr: /* 0xb6 */
5389/* File: arm64/op_or_int_2addr.S */
5390/* File: arm64/binop2addr.S */
5391 /*
5392 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5393 * that specifies an instruction that performs "result = w0 op w1".
5394 * This could be an ARM instruction or a function call. (If the result
5395 * comes back in a register other than w0, you can override "result".)
5396 *
5397 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5398 * vCC (w1). Useful for integer division and modulus.
5399 *
5400 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5401 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5402 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5403 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5404 */
5405 /* binop/2addr vA, vB */
5406 lsr w3, wINST, #12 // w3<- B
5407 ubfx w9, wINST, #8, #4 // w9<- A
5408 GET_VREG w1, w3 // w1<- vB
5409 GET_VREG w0, w9 // w0<- vA
5410 .if 0
5411 cbz w1, common_errDivideByZero
5412 .endif
5413 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5414 // optional op; may set condition codes
5415 orr w0, w0, w1 // w0<- op, w0-w3 changed
5416 GET_INST_OPCODE ip // extract opcode from rINST
5417 SET_VREG w0, w9 // vAA<- w0
5418 GOTO_OPCODE ip // jump to next instruction
5419 /* 10-13 instructions */
5420
5421
5422/* ------------------------------ */
5423 .balign 128
5424.L_op_xor_int_2addr: /* 0xb7 */
5425/* File: arm64/op_xor_int_2addr.S */
5426/* File: arm64/binop2addr.S */
5427 /*
5428 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5429 * that specifies an instruction that performs "result = w0 op w1".
5430 * This could be an ARM instruction or a function call. (If the result
5431 * comes back in a register other than w0, you can override "result".)
5432 *
5433 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5434 * vCC (w1). Useful for integer division and modulus.
5435 *
5436 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5437 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5438 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5439 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5440 */
5441 /* binop/2addr vA, vB */
5442 lsr w3, wINST, #12 // w3<- B
5443 ubfx w9, wINST, #8, #4 // w9<- A
5444 GET_VREG w1, w3 // w1<- vB
5445 GET_VREG w0, w9 // w0<- vA
5446 .if 0
5447 cbz w1, common_errDivideByZero
5448 .endif
5449 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5450 // optional op; may set condition codes
5451 eor w0, w0, w1 // w0<- op, w0-w3 changed
5452 GET_INST_OPCODE ip // extract opcode from rINST
5453 SET_VREG w0, w9 // vAA<- w0
5454 GOTO_OPCODE ip // jump to next instruction
5455 /* 10-13 instructions */
5456
5457
5458/* ------------------------------ */
5459 .balign 128
5460.L_op_shl_int_2addr: /* 0xb8 */
5461/* File: arm64/op_shl_int_2addr.S */
5462/* File: arm64/binop2addr.S */
5463 /*
5464 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5465 * that specifies an instruction that performs "result = w0 op w1".
5466 * This could be an ARM instruction or a function call. (If the result
5467 * comes back in a register other than w0, you can override "result".)
5468 *
5469 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5470 * vCC (w1). Useful for integer division and modulus.
5471 *
5472 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5473 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5474 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5475 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5476 */
5477 /* binop/2addr vA, vB */
5478 lsr w3, wINST, #12 // w3<- B
5479 ubfx w9, wINST, #8, #4 // w9<- A
5480 GET_VREG w1, w3 // w1<- vB
5481 GET_VREG w0, w9 // w0<- vA
5482 .if 0
5483 cbz w1, common_errDivideByZero
5484 .endif
5485 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5486 and w1, w1, #31 // optional op; may set condition codes
5487 lsl w0, w0, w1 // w0<- op, w0-w3 changed
5488 GET_INST_OPCODE ip // extract opcode from rINST
5489 SET_VREG w0, w9 // vAA<- w0
5490 GOTO_OPCODE ip // jump to next instruction
5491 /* 10-13 instructions */
5492
5493
5494/* ------------------------------ */
5495 .balign 128
5496.L_op_shr_int_2addr: /* 0xb9 */
5497/* File: arm64/op_shr_int_2addr.S */
5498/* File: arm64/binop2addr.S */
5499 /*
5500 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5501 * that specifies an instruction that performs "result = w0 op w1".
5502 * This could be an ARM instruction or a function call. (If the result
5503 * comes back in a register other than w0, you can override "result".)
5504 *
5505 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5506 * vCC (w1). Useful for integer division and modulus.
5507 *
5508 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5509 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5510 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5511 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5512 */
5513 /* binop/2addr vA, vB */
5514 lsr w3, wINST, #12 // w3<- B
5515 ubfx w9, wINST, #8, #4 // w9<- A
5516 GET_VREG w1, w3 // w1<- vB
5517 GET_VREG w0, w9 // w0<- vA
5518 .if 0
5519 cbz w1, common_errDivideByZero
5520 .endif
5521 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5522 and w1, w1, #31 // optional op; may set condition codes
5523 asr w0, w0, w1 // w0<- op, w0-w3 changed
5524 GET_INST_OPCODE ip // extract opcode from rINST
5525 SET_VREG w0, w9 // vAA<- w0
5526 GOTO_OPCODE ip // jump to next instruction
5527 /* 10-13 instructions */
5528
5529
5530/* ------------------------------ */
5531 .balign 128
5532.L_op_ushr_int_2addr: /* 0xba */
5533/* File: arm64/op_ushr_int_2addr.S */
5534/* File: arm64/binop2addr.S */
5535 /*
5536 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5537 * that specifies an instruction that performs "result = w0 op w1".
5538 * This could be an ARM instruction or a function call. (If the result
5539 * comes back in a register other than w0, you can override "result".)
5540 *
5541 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5542 * vCC (w1). Useful for integer division and modulus.
5543 *
5544 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5545 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5546 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5547 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5548 */
5549 /* binop/2addr vA, vB */
5550 lsr w3, wINST, #12 // w3<- B
5551 ubfx w9, wINST, #8, #4 // w9<- A
5552 GET_VREG w1, w3 // w1<- vB
5553 GET_VREG w0, w9 // w0<- vA
5554 .if 0
5555 cbz w1, common_errDivideByZero
5556 .endif
5557 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5558 and w1, w1, #31 // optional op; may set condition codes
5559 lsr w0, w0, w1 // w0<- op, w0-w3 changed
5560 GET_INST_OPCODE ip // extract opcode from rINST
5561 SET_VREG w0, w9 // vAA<- w0
5562 GOTO_OPCODE ip // jump to next instruction
5563 /* 10-13 instructions */
5564
5565
5566/* ------------------------------ */
5567 .balign 128
5568.L_op_add_long_2addr: /* 0xbb */
5569/* File: arm64/op_add_long_2addr.S */
5570/* File: arm64/binopWide2addr.S */
5571 /*
5572 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5573 * that specifies an instruction that performs "x0 = x0 op x1".
5574 * This must not be a function call, as we keep w2 live across it.
5575 *
5576 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5577 * vCC (w1). Useful for integer division and modulus.
5578 *
5579 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5580 * and-long/2addr, or-long/2addr, xor-long/2addr,
5581 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5582 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5583 */
5584 /* binop/2addr vA, vB */
5585 lsr w1, wINST, #12 // w1<- B
5586 ubfx w2, wINST, #8, #4 // w2<- A
5587 GET_VREG_WIDE x1, w1 // x1<- vB
5588 GET_VREG_WIDE x0, w2 // x0<- vA
5589 .if 0
5590 cbz x1, common_errDivideByZero
5591 .endif
5592 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5593
5594 add x0, x0, x1 // result<- op
5595 GET_INST_OPCODE ip // extract opcode from rINST
5596 SET_VREG_WIDE x0, w2 // vAA<- result
5597 GOTO_OPCODE ip // jump to next instruction
5598 /* 10-13 instructions */
5599
5600
5601/* ------------------------------ */
5602 .balign 128
5603.L_op_sub_long_2addr: /* 0xbc */
5604/* File: arm64/op_sub_long_2addr.S */
5605/* File: arm64/binopWide2addr.S */
5606 /*
5607 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5608 * that specifies an instruction that performs "x0 = x0 op x1".
5609 * This must not be a function call, as we keep w2 live across it.
5610 *
5611 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5612 * vCC (w1). Useful for integer division and modulus.
5613 *
5614 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5615 * and-long/2addr, or-long/2addr, xor-long/2addr,
5616 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5617 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5618 */
5619 /* binop/2addr vA, vB */
5620 lsr w1, wINST, #12 // w1<- B
5621 ubfx w2, wINST, #8, #4 // w2<- A
5622 GET_VREG_WIDE x1, w1 // x1<- vB
5623 GET_VREG_WIDE x0, w2 // x0<- vA
5624 .if 0
5625 cbz x1, common_errDivideByZero
5626 .endif
5627 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5628
5629 sub x0, x0, x1 // result<- op
5630 GET_INST_OPCODE ip // extract opcode from rINST
5631 SET_VREG_WIDE x0, w2 // vAA<- result
5632 GOTO_OPCODE ip // jump to next instruction
5633 /* 10-13 instructions */
5634
5635
5636/* ------------------------------ */
5637 .balign 128
5638.L_op_mul_long_2addr: /* 0xbd */
5639/* File: arm64/op_mul_long_2addr.S */
5640/* File: arm64/binopWide2addr.S */
5641 /*
5642 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5643 * that specifies an instruction that performs "x0 = x0 op x1".
5644 * This must not be a function call, as we keep w2 live across it.
5645 *
5646 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5647 * vCC (w1). Useful for integer division and modulus.
5648 *
5649 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5650 * and-long/2addr, or-long/2addr, xor-long/2addr,
5651 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5652 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5653 */
5654 /* binop/2addr vA, vB */
5655 lsr w1, wINST, #12 // w1<- B
5656 ubfx w2, wINST, #8, #4 // w2<- A
5657 GET_VREG_WIDE x1, w1 // x1<- vB
5658 GET_VREG_WIDE x0, w2 // x0<- vA
5659 .if 0
5660 cbz x1, common_errDivideByZero
5661 .endif
5662 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5663
5664 mul x0, x0, x1 // result<- op
5665 GET_INST_OPCODE ip // extract opcode from rINST
5666 SET_VREG_WIDE x0, w2 // vAA<- result
5667 GOTO_OPCODE ip // jump to next instruction
5668 /* 10-13 instructions */
5669
5670
5671/* ------------------------------ */
5672 .balign 128
5673.L_op_div_long_2addr: /* 0xbe */
5674/* File: arm64/op_div_long_2addr.S */
5675/* File: arm64/binopWide2addr.S */
5676 /*
5677 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5678 * that specifies an instruction that performs "x0 = x0 op x1".
5679 * This must not be a function call, as we keep w2 live across it.
5680 *
5681 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5682 * vCC (w1). Useful for integer division and modulus.
5683 *
5684 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5685 * and-long/2addr, or-long/2addr, xor-long/2addr,
5686 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5687 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5688 */
5689 /* binop/2addr vA, vB */
5690 lsr w1, wINST, #12 // w1<- B
5691 ubfx w2, wINST, #8, #4 // w2<- A
5692 GET_VREG_WIDE x1, w1 // x1<- vB
5693 GET_VREG_WIDE x0, w2 // x0<- vA
5694 .if 1
5695 cbz x1, common_errDivideByZero
5696 .endif
5697 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5698
5699 sdiv x0, x0, x1 // result<- op
5700 GET_INST_OPCODE ip // extract opcode from rINST
5701 SET_VREG_WIDE x0, w2 // vAA<- result
5702 GOTO_OPCODE ip // jump to next instruction
5703 /* 10-13 instructions */
5704
5705
5706/* ------------------------------ */
5707 .balign 128
5708.L_op_rem_long_2addr: /* 0xbf */
5709/* File: arm64/op_rem_long_2addr.S */
5710/* File: arm64/binopWide2addr.S */
5711 /*
5712 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5713 * that specifies an instruction that performs "x0 = x0 op x1".
5714 * This must not be a function call, as we keep w2 live across it.
5715 *
5716 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5717 * vCC (w1). Useful for integer division and modulus.
5718 *
5719 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5720 * and-long/2addr, or-long/2addr, xor-long/2addr,
5721 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5722 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5723 */
5724 /* binop/2addr vA, vB */
5725 lsr w1, wINST, #12 // w1<- B
5726 ubfx w2, wINST, #8, #4 // w2<- A
5727 GET_VREG_WIDE x1, w1 // x1<- vB
5728 GET_VREG_WIDE x0, w2 // x0<- vA
5729 .if 1
5730 cbz x1, common_errDivideByZero
5731 .endif
5732 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5733 sdiv x3, x0, x1
5734 msub x0, x3, x1, x0 // result<- op
5735 GET_INST_OPCODE ip // extract opcode from rINST
5736 SET_VREG_WIDE x0, w2 // vAA<- result
5737 GOTO_OPCODE ip // jump to next instruction
5738 /* 10-13 instructions */
5739
5740
5741/* ------------------------------ */
5742 .balign 128
5743.L_op_and_long_2addr: /* 0xc0 */
5744/* File: arm64/op_and_long_2addr.S */
5745/* File: arm64/binopWide2addr.S */
5746 /*
5747 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5748 * that specifies an instruction that performs "x0 = x0 op x1".
5749 * This must not be a function call, as we keep w2 live across it.
5750 *
5751 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5752 * vCC (w1). Useful for integer division and modulus.
5753 *
5754 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5755 * and-long/2addr, or-long/2addr, xor-long/2addr,
5756 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5757 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5758 */
5759 /* binop/2addr vA, vB */
5760 lsr w1, wINST, #12 // w1<- B
5761 ubfx w2, wINST, #8, #4 // w2<- A
5762 GET_VREG_WIDE x1, w1 // x1<- vB
5763 GET_VREG_WIDE x0, w2 // x0<- vA
5764 .if 0
5765 cbz x1, common_errDivideByZero
5766 .endif
5767 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5768
5769 and x0, x0, x1 // result<- op
5770 GET_INST_OPCODE ip // extract opcode from rINST
5771 SET_VREG_WIDE x0, w2 // vAA<- result
5772 GOTO_OPCODE ip // jump to next instruction
5773 /* 10-13 instructions */
5774
5775
5776/* ------------------------------ */
5777 .balign 128
5778.L_op_or_long_2addr: /* 0xc1 */
5779/* File: arm64/op_or_long_2addr.S */
5780/* File: arm64/binopWide2addr.S */
5781 /*
5782 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5783 * that specifies an instruction that performs "x0 = x0 op x1".
5784 * This must not be a function call, as we keep w2 live across it.
5785 *
5786 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5787 * vCC (w1). Useful for integer division and modulus.
5788 *
5789 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5790 * and-long/2addr, or-long/2addr, xor-long/2addr,
5791 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5792 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5793 */
5794 /* binop/2addr vA, vB */
5795 lsr w1, wINST, #12 // w1<- B
5796 ubfx w2, wINST, #8, #4 // w2<- A
5797 GET_VREG_WIDE x1, w1 // x1<- vB
5798 GET_VREG_WIDE x0, w2 // x0<- vA
5799 .if 0
5800 cbz x1, common_errDivideByZero
5801 .endif
5802 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5803
5804 orr x0, x0, x1 // result<- op
5805 GET_INST_OPCODE ip // extract opcode from rINST
5806 SET_VREG_WIDE x0, w2 // vAA<- result
5807 GOTO_OPCODE ip // jump to next instruction
5808 /* 10-13 instructions */
5809
5810
5811/* ------------------------------ */
5812 .balign 128
5813.L_op_xor_long_2addr: /* 0xc2 */
5814/* File: arm64/op_xor_long_2addr.S */
5815/* File: arm64/binopWide2addr.S */
5816 /*
5817 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5818 * that specifies an instruction that performs "x0 = x0 op x1".
5819 * This must not be a function call, as we keep w2 live across it.
5820 *
5821 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5822 * vCC (w1). Useful for integer division and modulus.
5823 *
5824 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5825 * and-long/2addr, or-long/2addr, xor-long/2addr,
5826 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5827 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5828 */
5829 /* binop/2addr vA, vB */
5830 lsr w1, wINST, #12 // w1<- B
5831 ubfx w2, wINST, #8, #4 // w2<- A
5832 GET_VREG_WIDE x1, w1 // x1<- vB
5833 GET_VREG_WIDE x0, w2 // x0<- vA
5834 .if 0
5835 cbz x1, common_errDivideByZero
5836 .endif
5837 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5838
5839 eor x0, x0, x1 // result<- op
5840 GET_INST_OPCODE ip // extract opcode from rINST
5841 SET_VREG_WIDE x0, w2 // vAA<- result
5842 GOTO_OPCODE ip // jump to next instruction
5843 /* 10-13 instructions */
5844
5845
5846/* ------------------------------ */
5847 .balign 128
5848.L_op_shl_long_2addr: /* 0xc3 */
5849/* File: arm64/op_shl_long_2addr.S */
5850/* File: arm64/shiftWide2addr.S */
5851 /*
5852 * Generic 64-bit shift operation.
5853 */
5854 /* binop/2addr vA, vB */
5855 lsr w1, wINST, #12 // w1<- B
5856 ubfx w2, wINST, #8, #4 // w2<- A
5857 GET_VREG w1, w1 // x1<- vB
5858 GET_VREG_WIDE x0, w2 // x0<- vA
5859 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5860 and x1, x1, #63 // Mask low 6 bits.
5861 lsl x0, x0, x1
5862 GET_INST_OPCODE ip // extract opcode from rINST
5863 SET_VREG_WIDE x0, w2 // vAA<- result
5864 GOTO_OPCODE ip // jump to next instruction
5865 /* 10-13 instructions */
5866
5867
5868/* ------------------------------ */
5869 .balign 128
5870.L_op_shr_long_2addr: /* 0xc4 */
5871/* File: arm64/op_shr_long_2addr.S */
5872/* File: arm64/shiftWide2addr.S */
5873 /*
5874 * Generic 64-bit shift operation.
5875 */
5876 /* binop/2addr vA, vB */
5877 lsr w1, wINST, #12 // w1<- B
5878 ubfx w2, wINST, #8, #4 // w2<- A
5879 GET_VREG w1, w1 // x1<- vB
5880 GET_VREG_WIDE x0, w2 // x0<- vA
5881 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5882 and x1, x1, #63 // Mask low 6 bits.
5883 asr x0, x0, x1
5884 GET_INST_OPCODE ip // extract opcode from rINST
5885 SET_VREG_WIDE x0, w2 // vAA<- result
5886 GOTO_OPCODE ip // jump to next instruction
5887 /* 10-13 instructions */
5888
5889
5890/* ------------------------------ */
5891 .balign 128
5892.L_op_ushr_long_2addr: /* 0xc5 */
5893/* File: arm64/op_ushr_long_2addr.S */
5894/* File: arm64/shiftWide2addr.S */
5895 /*
5896 * Generic 64-bit shift operation.
5897 */
5898 /* binop/2addr vA, vB */
5899 lsr w1, wINST, #12 // w1<- B
5900 ubfx w2, wINST, #8, #4 // w2<- A
5901 GET_VREG w1, w1 // x1<- vB
5902 GET_VREG_WIDE x0, w2 // x0<- vA
5903 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5904 and x1, x1, #63 // Mask low 6 bits.
5905 lsr x0, x0, x1
5906 GET_INST_OPCODE ip // extract opcode from rINST
5907 SET_VREG_WIDE x0, w2 // vAA<- result
5908 GOTO_OPCODE ip // jump to next instruction
5909 /* 10-13 instructions */
5910
5911
5912/* ------------------------------ */
5913 .balign 128
5914.L_op_add_float_2addr: /* 0xc6 */
5915/* File: arm64/op_add_float_2addr.S */
5916/* File: arm64/fbinop2addr.S */
5917 /*
5918 * Generic 32-bit floating point "/2addr" binary operation. Provide
5919 * an "instr" line that specifies an instruction that performs
5920 * "s2 = s0 op s1".
5921 *
5922 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5923 */
5924 /* binop/2addr vA, vB */
5925 lsr w3, wINST, #12 // w3<- B
5926 lsr w9, wINST, #8 // w9<- A+
5927 and w9, w9, #15 // w9<- A
5928 GET_VREG s1, w3
5929 GET_VREG s0, w9
5930 fadd s2, s0, s1 // s2<- op
5931 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5932 GET_INST_OPCODE ip // extract opcode from rINST
5933 SET_VREG s2, w9
5934 GOTO_OPCODE ip // jump to next instruction
5935
5936
5937/* ------------------------------ */
5938 .balign 128
5939.L_op_sub_float_2addr: /* 0xc7 */
5940/* File: arm64/op_sub_float_2addr.S */
5941/* File: arm64/fbinop2addr.S */
5942 /*
5943 * Generic 32-bit floating point "/2addr" binary operation. Provide
5944 * an "instr" line that specifies an instruction that performs
5945 * "s2 = s0 op s1".
5946 *
5947 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5948 */
5949 /* binop/2addr vA, vB */
5950 lsr w3, wINST, #12 // w3<- B
5951 lsr w9, wINST, #8 // w9<- A+
5952 and w9, w9, #15 // w9<- A
5953 GET_VREG s1, w3
5954 GET_VREG s0, w9
5955 fsub s2, s0, s1 // s2<- op
5956 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5957 GET_INST_OPCODE ip // extract opcode from rINST
5958 SET_VREG s2, w9
5959 GOTO_OPCODE ip // jump to next instruction
5960
5961
5962/* ------------------------------ */
5963 .balign 128
5964.L_op_mul_float_2addr: /* 0xc8 */
5965/* File: arm64/op_mul_float_2addr.S */
5966/* File: arm64/fbinop2addr.S */
5967 /*
5968 * Generic 32-bit floating point "/2addr" binary operation. Provide
5969 * an "instr" line that specifies an instruction that performs
5970 * "s2 = s0 op s1".
5971 *
5972 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5973 */
5974 /* binop/2addr vA, vB */
5975 lsr w3, wINST, #12 // w3<- B
5976 lsr w9, wINST, #8 // w9<- A+
5977 and w9, w9, #15 // w9<- A
5978 GET_VREG s1, w3
5979 GET_VREG s0, w9
5980 fmul s2, s0, s1 // s2<- op
5981 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5982 GET_INST_OPCODE ip // extract opcode from rINST
5983 SET_VREG s2, w9
5984 GOTO_OPCODE ip // jump to next instruction
5985
5986
5987/* ------------------------------ */
5988 .balign 128
5989.L_op_div_float_2addr: /* 0xc9 */
5990/* File: arm64/op_div_float_2addr.S */
5991/* File: arm64/fbinop2addr.S */
5992 /*
5993 * Generic 32-bit floating point "/2addr" binary operation. Provide
5994 * an "instr" line that specifies an instruction that performs
5995 * "s2 = s0 op s1".
5996 *
5997 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5998 */
5999 /* binop/2addr vA, vB */
6000 lsr w3, wINST, #12 // w3<- B
6001 lsr w9, wINST, #8 // w9<- A+
6002 and w9, w9, #15 // w9<- A
6003 GET_VREG s1, w3
6004 GET_VREG s0, w9
6005 fdiv s2, s0, s1 // s2<- op
6006 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
6007 GET_INST_OPCODE ip // extract opcode from rINST
6008 SET_VREG s2, w9
6009 GOTO_OPCODE ip // jump to next instruction
6010
6011
6012/* ------------------------------ */
6013 .balign 128
6014.L_op_rem_float_2addr: /* 0xca */
6015/* File: arm64/op_rem_float_2addr.S */
6016 /* rem vA, vB */
6017 lsr w3, wINST, #12 // w3<- B
6018 lsr w9, wINST, #8 // w9<- A+
6019 and w9, w9, #15 // w9<- A
6020 GET_VREG s1, w3
6021 GET_VREG s0, w9
6022 bl fmodf
6023 lsr w9, wINST, #8 // w9<- A+
6024 and w9, w9, #15 // w9<- A
6025 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
6026 GET_INST_OPCODE ip // extract opcode from rINST
6027 SET_VREG s0, w9
6028 GOTO_OPCODE ip // jump to next instruction
6029
6030/* ------------------------------ */
6031 .balign 128
6032.L_op_add_double_2addr: /* 0xcb */
6033/* File: arm64/op_add_double_2addr.S */
6034/* File: arm64/binopWide2addr.S */
6035 /*
6036 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6037 * that specifies an instruction that performs "x0 = x0 op x1".
6038 * This must not be a function call, as we keep w2 live across it.
6039 *
6040 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6041 * vCC (w1). Useful for integer division and modulus.
6042 *
6043 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
6044 * and-long/2addr, or-long/2addr, xor-long/2addr,
6045 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
6046 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
6047 */
6048 /* binop/2addr vA, vB */
6049 lsr w1, wINST, #12 // w1<- B
6050 ubfx w2, wINST, #8, #4 // w2<- A
6051 GET_VREG_WIDE d1, w1 // x1<- vB
6052 GET_VREG_WIDE d0, w2 // x0<- vA
6053 .if 0
6054 cbz d1, common_errDivideByZero
6055 .endif
6056 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
6057
6058 fadd d0, d0, d1 // result<- op
6059 GET_INST_OPCODE ip // extract opcode from rINST
6060 SET_VREG_WIDE d0, w2 // vAA<- result
6061 GOTO_OPCODE ip // jump to next instruction
6062 /* 10-13 instructions */
6063
6064
6065/* ------------------------------ */
6066 .balign 128
6067.L_op_sub_double_2addr: /* 0xcc */
6068/* File: arm64/op_sub_double_2addr.S */
6069/* File: arm64/binopWide2addr.S */
6070 /*
6071 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6072 * that specifies an instruction that performs "x0 = x0 op x1".
6073 * This must not be a function call, as we keep w2 live across it.
6074 *
6075 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6076 * vCC (w1). Useful for integer division and modulus.
6077 *
6078 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
6079 * and-long/2addr, or-long/2addr, xor-long/2addr,
6080 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
6081 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
6082 */
6083 /* binop/2addr vA, vB */
6084 lsr w1, wINST, #12 // w1<- B
6085 ubfx w2, wINST, #8, #4 // w2<- A
6086 GET_VREG_WIDE d1, w1 // x1<- vB
6087 GET_VREG_WIDE d0, w2 // x0<- vA
6088 .if 0
6089 cbz d1, common_errDivideByZero
6090 .endif
6091 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
6092
6093 fsub d0, d0, d1 // result<- op
6094 GET_INST_OPCODE ip // extract opcode from rINST
6095 SET_VREG_WIDE d0, w2 // vAA<- result
6096 GOTO_OPCODE ip // jump to next instruction
6097 /* 10-13 instructions */
6098
6099
6100/* ------------------------------ */
6101 .balign 128
6102.L_op_mul_double_2addr: /* 0xcd */
6103/* File: arm64/op_mul_double_2addr.S */
6104/* File: arm64/binopWide2addr.S */
6105 /*
6106 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6107 * that specifies an instruction that performs "x0 = x0 op x1".
6108 * This must not be a function call, as we keep w2 live across it.
6109 *
6110 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6111 * vCC (w1). Useful for integer division and modulus.
6112 *
6113 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
6114 * and-long/2addr, or-long/2addr, xor-long/2addr,
6115 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
6116 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
6117 */
6118 /* binop/2addr vA, vB */
6119 lsr w1, wINST, #12 // w1<- B
6120 ubfx w2, wINST, #8, #4 // w2<- A
6121 GET_VREG_WIDE d1, w1 // x1<- vB
6122 GET_VREG_WIDE d0, w2 // x0<- vA
6123 .if 0
6124 cbz d1, common_errDivideByZero
6125 .endif
6126 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
6127
6128 fmul d0, d0, d1 // result<- op
6129 GET_INST_OPCODE ip // extract opcode from rINST
6130 SET_VREG_WIDE d0, w2 // vAA<- result
6131 GOTO_OPCODE ip // jump to next instruction
6132 /* 10-13 instructions */
6133
6134
6135/* ------------------------------ */
6136 .balign 128
6137.L_op_div_double_2addr: /* 0xce */
6138/* File: arm64/op_div_double_2addr.S */
6139/* File: arm64/binopWide2addr.S */
6140 /*
6141 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6142 * that specifies an instruction that performs "x0 = x0 op x1".
6143 * This must not be a function call, as we keep w2 live across it.
6144 *
6145 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6146 * vCC (w1). Useful for integer division and modulus.
6147 *
6148 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
6149 * and-long/2addr, or-long/2addr, xor-long/2addr,
6150 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
6151 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
6152 */
6153 /* binop/2addr vA, vB */
6154 lsr w1, wINST, #12 // w1<- B
6155 ubfx w2, wINST, #8, #4 // w2<- A
6156 GET_VREG_WIDE d1, w1 // x1<- vB
6157 GET_VREG_WIDE d0, w2 // x0<- vA
6158 .if 0
6159 cbz d1, common_errDivideByZero
6160 .endif
6161 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
6162
6163 fdiv d0, d0, d1 // result<- op
6164 GET_INST_OPCODE ip // extract opcode from rINST
6165 SET_VREG_WIDE d0, w2 // vAA<- result
6166 GOTO_OPCODE ip // jump to next instruction
6167 /* 10-13 instructions */
6168
6169
6170/* ------------------------------ */
6171 .balign 128
6172.L_op_rem_double_2addr: /* 0xcf */
6173/* File: arm64/op_rem_double_2addr.S */
6174 /* rem vA, vB */
6175 lsr w1, wINST, #12 // w1<- B
6176 ubfx w2, wINST, #8, #4 // w2<- A
6177 GET_VREG_WIDE d1, w1 // d1<- vB
6178 GET_VREG_WIDE d0, w2 // d0<- vA
6179 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
6180 bl fmod
6181 ubfx w2, wINST, #8, #4 // w2<- A (need to reload - killed across call)
6182 GET_INST_OPCODE ip // extract opcode from rINST
6183 SET_VREG_WIDE d0, w2 // vAA<- result
6184 GOTO_OPCODE ip // jump to next instruction
6185 /* 10-13 instructions */
6186
6187/* ------------------------------ */
6188 .balign 128
6189.L_op_add_int_lit16: /* 0xd0 */
6190/* File: arm64/op_add_int_lit16.S */
6191/* File: arm64/binopLit16.S */
6192 /*
6193 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6194 * that specifies an instruction that performs "result = w0 op w1".
6195 * This could be an ARM instruction or a function call. (If the result
6196 * comes back in a register other than w0, you can override "result".)
6197 *
6198 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6199 * vCC (w1). Useful for integer division and modulus.
6200 *
6201 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6202 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6203 */
6204 /* binop/lit16 vA, vB, #+CCCC */
6205 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6206 lsr w2, wINST, #12 // w2<- B
6207 ubfx w9, wINST, #8, #4 // w9<- A
6208 GET_VREG w0, w2 // w0<- vB
6209 .if 0
6210 cbz w1, common_errDivideByZero
6211 .endif
6212 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6213
6214 add w0, w0, w1 // w0<- op, w0-w3 changed
6215 GET_INST_OPCODE ip // extract opcode from rINST
6216 SET_VREG w0, w9 // vAA<- w0
6217 GOTO_OPCODE ip // jump to next instruction
6218 /* 10-13 instructions */
6219
6220
6221/* ------------------------------ */
6222 .balign 128
6223.L_op_rsub_int: /* 0xd1 */
6224/* File: arm64/op_rsub_int.S */
6225/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6226/* File: arm64/binopLit16.S */
6227 /*
6228 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6229 * that specifies an instruction that performs "result = w0 op w1".
6230 * This could be an ARM instruction or a function call. (If the result
6231 * comes back in a register other than w0, you can override "result".)
6232 *
6233 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6234 * vCC (w1). Useful for integer division and modulus.
6235 *
6236 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6237 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6238 */
6239 /* binop/lit16 vA, vB, #+CCCC */
6240 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6241 lsr w2, wINST, #12 // w2<- B
6242 ubfx w9, wINST, #8, #4 // w9<- A
6243 GET_VREG w0, w2 // w0<- vB
6244 .if 0
6245 cbz w1, common_errDivideByZero
6246 .endif
6247 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6248
6249 sub w0, w1, w0 // w0<- op, w0-w3 changed
6250 GET_INST_OPCODE ip // extract opcode from rINST
6251 SET_VREG w0, w9 // vAA<- w0
6252 GOTO_OPCODE ip // jump to next instruction
6253 /* 10-13 instructions */
6254
6255
6256/* ------------------------------ */
6257 .balign 128
6258.L_op_mul_int_lit16: /* 0xd2 */
6259/* File: arm64/op_mul_int_lit16.S */
6260/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
6261/* File: arm64/binopLit16.S */
6262 /*
6263 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6264 * that specifies an instruction that performs "result = w0 op w1".
6265 * This could be an ARM instruction or a function call. (If the result
6266 * comes back in a register other than w0, you can override "result".)
6267 *
6268 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6269 * vCC (w1). Useful for integer division and modulus.
6270 *
6271 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6272 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6273 */
6274 /* binop/lit16 vA, vB, #+CCCC */
6275 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6276 lsr w2, wINST, #12 // w2<- B
6277 ubfx w9, wINST, #8, #4 // w9<- A
6278 GET_VREG w0, w2 // w0<- vB
6279 .if 0
6280 cbz w1, common_errDivideByZero
6281 .endif
6282 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6283
6284 mul w0, w1, w0 // w0<- op, w0-w3 changed
6285 GET_INST_OPCODE ip // extract opcode from rINST
6286 SET_VREG w0, w9 // vAA<- w0
6287 GOTO_OPCODE ip // jump to next instruction
6288 /* 10-13 instructions */
6289
6290
6291/* ------------------------------ */
6292 .balign 128
6293.L_op_div_int_lit16: /* 0xd3 */
6294/* File: arm64/op_div_int_lit16.S */
6295/* File: arm64/binopLit16.S */
6296 /*
6297 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6298 * that specifies an instruction that performs "result = w0 op w1".
6299 * This could be an ARM instruction or a function call. (If the result
6300 * comes back in a register other than w0, you can override "result".)
6301 *
6302 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6303 * vCC (w1). Useful for integer division and modulus.
6304 *
6305 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6306 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6307 */
6308 /* binop/lit16 vA, vB, #+CCCC */
6309 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6310 lsr w2, wINST, #12 // w2<- B
6311 ubfx w9, wINST, #8, #4 // w9<- A
6312 GET_VREG w0, w2 // w0<- vB
6313 .if 1
6314 cbz w1, common_errDivideByZero
6315 .endif
6316 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6317
6318 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
6319 GET_INST_OPCODE ip // extract opcode from rINST
6320 SET_VREG w0, w9 // vAA<- w0
6321 GOTO_OPCODE ip // jump to next instruction
6322 /* 10-13 instructions */
6323
6324
6325/* ------------------------------ */
6326 .balign 128
6327.L_op_rem_int_lit16: /* 0xd4 */
6328/* File: arm64/op_rem_int_lit16.S */
6329/* File: arm64/binopLit16.S */
6330 /*
6331 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6332 * that specifies an instruction that performs "result = w0 op w1".
6333 * This could be an ARM instruction or a function call. (If the result
6334 * comes back in a register other than w0, you can override "result".)
6335 *
6336 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6337 * vCC (w1). Useful for integer division and modulus.
6338 *
6339 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6340 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6341 */
6342 /* binop/lit16 vA, vB, #+CCCC */
6343 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6344 lsr w2, wINST, #12 // w2<- B
6345 ubfx w9, wINST, #8, #4 // w9<- A
6346 GET_VREG w0, w2 // w0<- vB
6347 .if 1
6348 cbz w1, common_errDivideByZero
6349 .endif
6350 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6351 sdiv w3, w0, w1
6352 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
6353 GET_INST_OPCODE ip // extract opcode from rINST
6354 SET_VREG w0, w9 // vAA<- w0
6355 GOTO_OPCODE ip // jump to next instruction
6356 /* 10-13 instructions */
6357
6358
6359/* ------------------------------ */
6360 .balign 128
6361.L_op_and_int_lit16: /* 0xd5 */
6362/* File: arm64/op_and_int_lit16.S */
6363/* File: arm64/binopLit16.S */
6364 /*
6365 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6366 * that specifies an instruction that performs "result = w0 op w1".
6367 * This could be an ARM instruction or a function call. (If the result
6368 * comes back in a register other than w0, you can override "result".)
6369 *
6370 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6371 * vCC (w1). Useful for integer division and modulus.
6372 *
6373 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6374 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6375 */
6376 /* binop/lit16 vA, vB, #+CCCC */
6377 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6378 lsr w2, wINST, #12 // w2<- B
6379 ubfx w9, wINST, #8, #4 // w9<- A
6380 GET_VREG w0, w2 // w0<- vB
6381 .if 0
6382 cbz w1, common_errDivideByZero
6383 .endif
6384 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6385
6386 and w0, w0, w1 // w0<- op, w0-w3 changed
6387 GET_INST_OPCODE ip // extract opcode from rINST
6388 SET_VREG w0, w9 // vAA<- w0
6389 GOTO_OPCODE ip // jump to next instruction
6390 /* 10-13 instructions */
6391
6392
6393/* ------------------------------ */
6394 .balign 128
6395.L_op_or_int_lit16: /* 0xd6 */
6396/* File: arm64/op_or_int_lit16.S */
6397/* File: arm64/binopLit16.S */
6398 /*
6399 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6400 * that specifies an instruction that performs "result = w0 op w1".
6401 * This could be an ARM instruction or a function call. (If the result
6402 * comes back in a register other than w0, you can override "result".)
6403 *
6404 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6405 * vCC (w1). Useful for integer division and modulus.
6406 *
6407 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6408 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6409 */
6410 /* binop/lit16 vA, vB, #+CCCC */
6411 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6412 lsr w2, wINST, #12 // w2<- B
6413 ubfx w9, wINST, #8, #4 // w9<- A
6414 GET_VREG w0, w2 // w0<- vB
6415 .if 0
6416 cbz w1, common_errDivideByZero
6417 .endif
6418 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6419
6420 orr w0, w0, w1 // w0<- op, w0-w3 changed
6421 GET_INST_OPCODE ip // extract opcode from rINST
6422 SET_VREG w0, w9 // vAA<- w0
6423 GOTO_OPCODE ip // jump to next instruction
6424 /* 10-13 instructions */
6425
6426
6427/* ------------------------------ */
6428 .balign 128
6429.L_op_xor_int_lit16: /* 0xd7 */
6430/* File: arm64/op_xor_int_lit16.S */
6431/* File: arm64/binopLit16.S */
6432 /*
6433 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6434 * that specifies an instruction that performs "result = w0 op w1".
6435 * This could be an ARM instruction or a function call. (If the result
6436 * comes back in a register other than w0, you can override "result".)
6437 *
6438 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6439 * vCC (w1). Useful for integer division and modulus.
6440 *
6441 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6442 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6443 */
6444 /* binop/lit16 vA, vB, #+CCCC */
6445 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6446 lsr w2, wINST, #12 // w2<- B
6447 ubfx w9, wINST, #8, #4 // w9<- A
6448 GET_VREG w0, w2 // w0<- vB
6449 .if 0
6450 cbz w1, common_errDivideByZero
6451 .endif
6452 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6453
6454 eor w0, w0, w1 // w0<- op, w0-w3 changed
6455 GET_INST_OPCODE ip // extract opcode from rINST
6456 SET_VREG w0, w9 // vAA<- w0
6457 GOTO_OPCODE ip // jump to next instruction
6458 /* 10-13 instructions */
6459
6460
6461/* ------------------------------ */
6462 .balign 128
6463.L_op_add_int_lit8: /* 0xd8 */
6464/* File: arm64/op_add_int_lit8.S */
6465/* File: arm64/binopLit8.S */
6466 /*
6467 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6468 * that specifies an instruction that performs "result = w0 op w1".
6469 * This could be an ARM instruction or a function call. (If the result
6470 * comes back in a register other than w0, you can override "result".)
6471 *
6472 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6473 * vCC (w1). Useful for integer division and modulus.
6474 *
6475 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6476 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6477 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6478 */
6479 /* binop/lit8 vAA, vBB, #+CC */
6480 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6481 lsr w9, wINST, #8 // w9<- AA
6482 and w2, w3, #255 // w2<- BB
6483 GET_VREG w0, w2 // w0<- vBB
6484 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6485 .if 0
6486 cbz w1, common_errDivideByZero
6487 .endif
6488 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6489 // optional op; may set condition codes
6490 add w0, w0, w1 // w0<- op, w0-w3 changed
6491 GET_INST_OPCODE ip // extract opcode from rINST
6492 SET_VREG w0, w9 // vAA<- w0
6493 GOTO_OPCODE ip // jump to next instruction
6494 /* 10-12 instructions */
6495
6496
6497/* ------------------------------ */
6498 .balign 128
6499.L_op_rsub_int_lit8: /* 0xd9 */
6500/* File: arm64/op_rsub_int_lit8.S */
6501/* File: arm64/binopLit8.S */
6502 /*
6503 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6504 * that specifies an instruction that performs "result = w0 op w1".
6505 * This could be an ARM instruction or a function call. (If the result
6506 * comes back in a register other than w0, you can override "result".)
6507 *
6508 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6509 * vCC (w1). Useful for integer division and modulus.
6510 *
6511 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6512 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6513 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6514 */
6515 /* binop/lit8 vAA, vBB, #+CC */
6516 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6517 lsr w9, wINST, #8 // w9<- AA
6518 and w2, w3, #255 // w2<- BB
6519 GET_VREG w0, w2 // w0<- vBB
6520 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6521 .if 0
6522 cbz w1, common_errDivideByZero
6523 .endif
6524 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6525 // optional op; may set condition codes
6526 sub w0, w1, w0 // w0<- op, w0-w3 changed
6527 GET_INST_OPCODE ip // extract opcode from rINST
6528 SET_VREG w0, w9 // vAA<- w0
6529 GOTO_OPCODE ip // jump to next instruction
6530 /* 10-12 instructions */
6531
6532
6533/* ------------------------------ */
6534 .balign 128
6535.L_op_mul_int_lit8: /* 0xda */
6536/* File: arm64/op_mul_int_lit8.S */
6537/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
6538/* File: arm64/binopLit8.S */
6539 /*
6540 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6541 * that specifies an instruction that performs "result = w0 op w1".
6542 * This could be an ARM instruction or a function call. (If the result
6543 * comes back in a register other than w0, you can override "result".)
6544 *
6545 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6546 * vCC (w1). Useful for integer division and modulus.
6547 *
6548 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6549 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6550 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6551 */
6552 /* binop/lit8 vAA, vBB, #+CC */
6553 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6554 lsr w9, wINST, #8 // w9<- AA
6555 and w2, w3, #255 // w2<- BB
6556 GET_VREG w0, w2 // w0<- vBB
6557 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6558 .if 0
6559 cbz w1, common_errDivideByZero
6560 .endif
6561 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6562 // optional op; may set condition codes
6563 mul w0, w1, w0 // w0<- op, w0-w3 changed
6564 GET_INST_OPCODE ip // extract opcode from rINST
6565 SET_VREG w0, w9 // vAA<- w0
6566 GOTO_OPCODE ip // jump to next instruction
6567 /* 10-12 instructions */
6568
6569
6570/* ------------------------------ */
6571 .balign 128
6572.L_op_div_int_lit8: /* 0xdb */
6573/* File: arm64/op_div_int_lit8.S */
6574/* File: arm64/binopLit8.S */
6575 /*
6576 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6577 * that specifies an instruction that performs "result = w0 op w1".
6578 * This could be an ARM instruction or a function call. (If the result
6579 * comes back in a register other than w0, you can override "result".)
6580 *
6581 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6582 * vCC (w1). Useful for integer division and modulus.
6583 *
6584 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6585 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6586 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6587 */
6588 /* binop/lit8 vAA, vBB, #+CC */
6589 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6590 lsr w9, wINST, #8 // w9<- AA
6591 and w2, w3, #255 // w2<- BB
6592 GET_VREG w0, w2 // w0<- vBB
6593 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6594 .if 1
6595 cbz w1, common_errDivideByZero
6596 .endif
6597 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6598 // optional op; may set condition codes
6599 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
6600 GET_INST_OPCODE ip // extract opcode from rINST
6601 SET_VREG w0, w9 // vAA<- w0
6602 GOTO_OPCODE ip // jump to next instruction
6603 /* 10-12 instructions */
6604
6605
6606/* ------------------------------ */
6607 .balign 128
6608.L_op_rem_int_lit8: /* 0xdc */
6609/* File: arm64/op_rem_int_lit8.S */
6610/* File: arm64/binopLit8.S */
6611 /*
6612 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6613 * that specifies an instruction that performs "result = w0 op w1".
6614 * This could be an ARM instruction or a function call. (If the result
6615 * comes back in a register other than w0, you can override "result".)
6616 *
6617 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6618 * vCC (w1). Useful for integer division and modulus.
6619 *
6620 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6621 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6622 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6623 */
6624 /* binop/lit8 vAA, vBB, #+CC */
6625 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6626 lsr w9, wINST, #8 // w9<- AA
6627 and w2, w3, #255 // w2<- BB
6628 GET_VREG w0, w2 // w0<- vBB
6629 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6630 .if 1
6631 cbz w1, common_errDivideByZero
6632 .endif
6633 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6634 sdiv w3, w0, w1 // optional op; may set condition codes
6635 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
6636 GET_INST_OPCODE ip // extract opcode from rINST
6637 SET_VREG w0, w9 // vAA<- w0
6638 GOTO_OPCODE ip // jump to next instruction
6639 /* 10-12 instructions */
6640
6641
6642/* ------------------------------ */
6643 .balign 128
6644.L_op_and_int_lit8: /* 0xdd */
6645/* File: arm64/op_and_int_lit8.S */
6646/* File: arm64/binopLit8.S */
6647 /*
6648 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6649 * that specifies an instruction that performs "result = w0 op w1".
6650 * This could be an ARM instruction or a function call. (If the result
6651 * comes back in a register other than w0, you can override "result".)
6652 *
6653 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6654 * vCC (w1). Useful for integer division and modulus.
6655 *
6656 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6657 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6658 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6659 */
6660 /* binop/lit8 vAA, vBB, #+CC */
6661 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6662 lsr w9, wINST, #8 // w9<- AA
6663 and w2, w3, #255 // w2<- BB
6664 GET_VREG w0, w2 // w0<- vBB
6665 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6666 .if 0
6667 cbz w1, common_errDivideByZero
6668 .endif
6669 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6670 // optional op; may set condition codes
6671 and w0, w0, w1 // w0<- op, w0-w3 changed
6672 GET_INST_OPCODE ip // extract opcode from rINST
6673 SET_VREG w0, w9 // vAA<- w0
6674 GOTO_OPCODE ip // jump to next instruction
6675 /* 10-12 instructions */
6676
6677
6678/* ------------------------------ */
6679 .balign 128
6680.L_op_or_int_lit8: /* 0xde */
6681/* File: arm64/op_or_int_lit8.S */
6682/* File: arm64/binopLit8.S */
6683 /*
6684 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6685 * that specifies an instruction that performs "result = w0 op w1".
6686 * This could be an ARM instruction or a function call. (If the result
6687 * comes back in a register other than w0, you can override "result".)
6688 *
6689 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6690 * vCC (w1). Useful for integer division and modulus.
6691 *
6692 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6693 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6694 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6695 */
6696 /* binop/lit8 vAA, vBB, #+CC */
6697 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6698 lsr w9, wINST, #8 // w9<- AA
6699 and w2, w3, #255 // w2<- BB
6700 GET_VREG w0, w2 // w0<- vBB
6701 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6702 .if 0
6703 cbz w1, common_errDivideByZero
6704 .endif
6705 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6706 // optional op; may set condition codes
6707 orr w0, w0, w1 // w0<- op, w0-w3 changed
6708 GET_INST_OPCODE ip // extract opcode from rINST
6709 SET_VREG w0, w9 // vAA<- w0
6710 GOTO_OPCODE ip // jump to next instruction
6711 /* 10-12 instructions */
6712
6713
6714/* ------------------------------ */
6715 .balign 128
6716.L_op_xor_int_lit8: /* 0xdf */
6717/* File: arm64/op_xor_int_lit8.S */
6718/* File: arm64/binopLit8.S */
6719 /*
6720 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6721 * that specifies an instruction that performs "result = w0 op w1".
6722 * This could be an ARM instruction or a function call. (If the result
6723 * comes back in a register other than w0, you can override "result".)
6724 *
6725 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6726 * vCC (w1). Useful for integer division and modulus.
6727 *
6728 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6729 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6730 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6731 */
6732 /* binop/lit8 vAA, vBB, #+CC */
6733 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6734 lsr w9, wINST, #8 // w9<- AA
6735 and w2, w3, #255 // w2<- BB
6736 GET_VREG w0, w2 // w0<- vBB
6737 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6738 .if 0
6739 cbz w1, common_errDivideByZero
6740 .endif
6741 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6742 // optional op; may set condition codes
6743 eor w0, w0, w1 // w0<- op, w0-w3 changed
6744 GET_INST_OPCODE ip // extract opcode from rINST
6745 SET_VREG w0, w9 // vAA<- w0
6746 GOTO_OPCODE ip // jump to next instruction
6747 /* 10-12 instructions */
6748
6749
6750/* ------------------------------ */
6751 .balign 128
6752.L_op_shl_int_lit8: /* 0xe0 */
6753/* File: arm64/op_shl_int_lit8.S */
6754/* File: arm64/binopLit8.S */
6755 /*
6756 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6757 * that specifies an instruction that performs "result = w0 op w1".
6758 * This could be an ARM instruction or a function call. (If the result
6759 * comes back in a register other than w0, you can override "result".)
6760 *
6761 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6762 * vCC (w1). Useful for integer division and modulus.
6763 *
6764 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6765 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6766 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6767 */
6768 /* binop/lit8 vAA, vBB, #+CC */
6769 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6770 lsr w9, wINST, #8 // w9<- AA
6771 and w2, w3, #255 // w2<- BB
6772 GET_VREG w0, w2 // w0<- vBB
6773 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6774 .if 0
6775 cbz w1, common_errDivideByZero
6776 .endif
6777 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6778 and w1, w1, #31 // optional op; may set condition codes
6779 lsl w0, w0, w1 // w0<- op, w0-w3 changed
6780 GET_INST_OPCODE ip // extract opcode from rINST
6781 SET_VREG w0, w9 // vAA<- w0
6782 GOTO_OPCODE ip // jump to next instruction
6783 /* 10-12 instructions */
6784
6785
6786/* ------------------------------ */
6787 .balign 128
6788.L_op_shr_int_lit8: /* 0xe1 */
6789/* File: arm64/op_shr_int_lit8.S */
6790/* File: arm64/binopLit8.S */
6791 /*
6792 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6793 * that specifies an instruction that performs "result = w0 op w1".
6794 * This could be an ARM instruction or a function call. (If the result
6795 * comes back in a register other than w0, you can override "result".)
6796 *
6797 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6798 * vCC (w1). Useful for integer division and modulus.
6799 *
6800 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6801 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6802 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6803 */
6804 /* binop/lit8 vAA, vBB, #+CC */
6805 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6806 lsr w9, wINST, #8 // w9<- AA
6807 and w2, w3, #255 // w2<- BB
6808 GET_VREG w0, w2 // w0<- vBB
6809 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6810 .if 0
6811 cbz w1, common_errDivideByZero
6812 .endif
6813 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6814 and w1, w1, #31 // optional op; may set condition codes
6815 asr w0, w0, w1 // w0<- op, w0-w3 changed
6816 GET_INST_OPCODE ip // extract opcode from rINST
6817 SET_VREG w0, w9 // vAA<- w0
6818 GOTO_OPCODE ip // jump to next instruction
6819 /* 10-12 instructions */
6820
6821
6822/* ------------------------------ */
6823 .balign 128
6824.L_op_ushr_int_lit8: /* 0xe2 */
6825/* File: arm64/op_ushr_int_lit8.S */
6826/* File: arm64/binopLit8.S */
6827 /*
6828 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6829 * that specifies an instruction that performs "result = w0 op w1".
6830 * This could be an ARM instruction or a function call. (If the result
6831 * comes back in a register other than w0, you can override "result".)
6832 *
6833 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6834 * vCC (w1). Useful for integer division and modulus.
6835 *
6836 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6837 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6838 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6839 */
6840 /* binop/lit8 vAA, vBB, #+CC */
6841 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6842 lsr w9, wINST, #8 // w9<- AA
6843 and w2, w3, #255 // w2<- BB
6844 GET_VREG w0, w2 // w0<- vBB
6845 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6846 .if 0
6847 cbz w1, common_errDivideByZero
6848 .endif
6849 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6850 and w1, w1, #31 // optional op; may set condition codes
6851 lsr w0, w0, w1 // w0<- op, w0-w3 changed
6852 GET_INST_OPCODE ip // extract opcode from rINST
6853 SET_VREG w0, w9 // vAA<- w0
6854 GOTO_OPCODE ip // jump to next instruction
6855 /* 10-12 instructions */
6856
6857
6858/* ------------------------------ */
6859 .balign 128
6860.L_op_iget_quick: /* 0xe3 */
6861/* File: arm64/op_iget_quick.S */
6862 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6863 /* op vA, vB, offset//CCCC */
6864 lsr w2, wINST, #12 // w2<- B
6865 FETCH w1, 1 // w1<- field byte offset
6866 GET_VREG w3, w2 // w3<- object we're operating on
6867 ubfx w2, wINST, #8, #4 // w2<- A
6868 cmp x3, #0 // check object for null
6869 beq common_errNullObject // object was null
6870 ldr w0, [x3, x1] // w0<- obj.field
6871 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6872
6873 SET_VREG w0, w2 // fp[A]<- w0
6874 GET_INST_OPCODE ip // extract opcode from rINST
6875 GOTO_OPCODE ip // jump to next instruction
6876
6877/* ------------------------------ */
6878 .balign 128
6879.L_op_iget_wide_quick: /* 0xe4 */
6880/* File: arm64/op_iget_wide_quick.S */
6881 /* iget-wide-quick vA, vB, offset//CCCC */
6882 lsr w2, wINST, #12 // w2<- B
6883 FETCH w4, 1 // w4<- field byte offset
6884 GET_VREG w3, w2 // w3<- object we're operating on
6885 ubfx w2, wINST, #8, #4 // w2<- A
6886 cbz w3, common_errNullObject // object was null
6887 add x4, x3, x4 // create direct pointer
6888 ldr x0, [x4]
6889 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
6890 SET_VREG_WIDE x0, w2
6891 GET_INST_OPCODE ip // extract opcode from wINST
6892 GOTO_OPCODE ip // jump to next instruction
6893
6894/* ------------------------------ */
6895 .balign 128
6896.L_op_iget_object_quick: /* 0xe5 */
6897/* File: arm64/op_iget_object_quick.S */
6898 /* For: iget-object-quick */
6899 /* op vA, vB, offset//CCCC */
6900 lsr w2, wINST, #12 // w2<- B
6901 FETCH w1, 1 // w1<- field byte offset
6902 EXPORT_PC
6903 GET_VREG w0, w2 // w0<- object we're operating on
6904 bl artIGetObjectFromMterp // (obj, offset)
6905 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
6906 ubfx w2, wINST, #8, #4 // w2<- A
6907 PREFETCH_INST 2
6908 cbnz w3, MterpPossibleException // bail out
6909 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
6910 ADVANCE 2 // advance rPC
6911 GET_INST_OPCODE ip // extract opcode from wINST
6912 GOTO_OPCODE ip // jump to next instruction
6913
6914/* ------------------------------ */
6915 .balign 128
6916.L_op_iput_quick: /* 0xe6 */
6917/* File: arm64/op_iput_quick.S */
6918 /* For: iput-quick, iput-object-quick */
6919 /* op vA, vB, offset//CCCC */
6920 lsr w2, wINST, #12 // w2<- B
6921 FETCH w1, 1 // w1<- field byte offset
6922 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6923 ubfx w2, wINST, #8, #4 // w2<- A
6924 cmp w3, #0 // check object for null
6925 cbz w3, common_errNullObject // object was null
6926 GET_VREG w0, w2 // w0<- fp[A]
6927 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6928 str w0, [x3, x1] // obj.field<- w0
6929 GET_INST_OPCODE ip // extract opcode from rINST
6930 GOTO_OPCODE ip // jump to next instruction
6931
6932/* ------------------------------ */
6933 .balign 128
6934.L_op_iput_wide_quick: /* 0xe7 */
6935/* File: arm64/op_iput_wide_quick.S */
6936 /* iput-wide-quick vA, vB, offset//CCCC */
6937 lsr w2, wINST, #12 // w2<- B
6938 FETCH w3, 1 // w3<- field byte offset
6939 GET_VREG w2, w2 // w2<- fp[B], the object pointer
6940 ubfx w0, wINST, #8, #4 // w0<- A
6941 cmp w2, #0 // check object for null
6942 beq common_errNullObject // object was null
6943 GET_VREG_WIDE x0, w0 // x0-< fp[A]
6944 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
6945 add x1, x2, x3 // create a direct pointer
6946 str x0, [x1]
6947 GET_INST_OPCODE ip // extract opcode from wINST
6948 GOTO_OPCODE ip // jump to next instruction
6949
6950/* ------------------------------ */
6951 .balign 128
6952.L_op_iput_object_quick: /* 0xe8 */
6953/* File: arm64/op_iput_object_quick.S */
6954 EXPORT_PC
6955 add x0, xFP, #OFF_FP_SHADOWFRAME
6956 mov x1, xPC
6957 mov w2, wINST
6958 bl MterpIputObjectQuick
6959 cbz w0, MterpException
6960 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6961 GET_INST_OPCODE ip // extract opcode from rINST
6962 GOTO_OPCODE ip // jump to next instruction
6963
6964/* ------------------------------ */
6965 .balign 128
6966.L_op_invoke_virtual_quick: /* 0xe9 */
6967/* File: arm64/op_invoke_virtual_quick.S */
6968/* File: arm64/invoke.S */
6969 /*
6970 * Generic invoke handler wrapper.
6971 */
6972 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6973 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6974 .extern MterpInvokeVirtualQuick
6975 EXPORT_PC
6976 mov x0, xSELF
6977 add x1, xFP, #OFF_FP_SHADOWFRAME
6978 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006979 mov x3, xINST
6980 bl MterpInvokeVirtualQuick
6981 cbz w0, MterpException
6982 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006983 bl MterpShouldSwitchInterpreters
6984 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006985 GET_INST_OPCODE ip
6986 GOTO_OPCODE ip
6987
6988
6989
6990/* ------------------------------ */
6991 .balign 128
6992.L_op_invoke_virtual_range_quick: /* 0xea */
6993/* File: arm64/op_invoke_virtual_range_quick.S */
6994/* File: arm64/invoke.S */
6995 /*
6996 * Generic invoke handler wrapper.
6997 */
6998 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6999 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7000 .extern MterpInvokeVirtualQuickRange
7001 EXPORT_PC
7002 mov x0, xSELF
7003 add x1, xFP, #OFF_FP_SHADOWFRAME
7004 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007005 mov x3, xINST
7006 bl MterpInvokeVirtualQuickRange
7007 cbz w0, MterpException
7008 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00007009 bl MterpShouldSwitchInterpreters
7010 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007011 GET_INST_OPCODE ip
7012 GOTO_OPCODE ip
7013
7014
7015
7016/* ------------------------------ */
7017 .balign 128
7018.L_op_iput_boolean_quick: /* 0xeb */
7019/* File: arm64/op_iput_boolean_quick.S */
7020/* File: arm64/op_iput_quick.S */
7021 /* For: iput-quick, iput-object-quick */
7022 /* op vA, vB, offset//CCCC */
7023 lsr w2, wINST, #12 // w2<- B
7024 FETCH w1, 1 // w1<- field byte offset
7025 GET_VREG w3, w2 // w3<- fp[B], the object pointer
7026 ubfx w2, wINST, #8, #4 // w2<- A
7027 cmp w3, #0 // check object for null
7028 cbz w3, common_errNullObject // object was null
7029 GET_VREG w0, w2 // w0<- fp[A]
7030 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
7031 strb w0, [x3, x1] // obj.field<- w0
7032 GET_INST_OPCODE ip // extract opcode from rINST
7033 GOTO_OPCODE ip // jump to next instruction
7034
7035
7036/* ------------------------------ */
7037 .balign 128
7038.L_op_iput_byte_quick: /* 0xec */
7039/* File: arm64/op_iput_byte_quick.S */
7040/* File: arm64/op_iput_quick.S */
7041 /* For: iput-quick, iput-object-quick */
7042 /* op vA, vB, offset//CCCC */
7043 lsr w2, wINST, #12 // w2<- B
7044 FETCH w1, 1 // w1<- field byte offset
7045 GET_VREG w3, w2 // w3<- fp[B], the object pointer
7046 ubfx w2, wINST, #8, #4 // w2<- A
7047 cmp w3, #0 // check object for null
7048 cbz w3, common_errNullObject // object was null
7049 GET_VREG w0, w2 // w0<- fp[A]
7050 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
7051 strb w0, [x3, x1] // obj.field<- w0
7052 GET_INST_OPCODE ip // extract opcode from rINST
7053 GOTO_OPCODE ip // jump to next instruction
7054
7055
7056/* ------------------------------ */
7057 .balign 128
7058.L_op_iput_char_quick: /* 0xed */
7059/* File: arm64/op_iput_char_quick.S */
7060/* File: arm64/op_iput_quick.S */
7061 /* For: iput-quick, iput-object-quick */
7062 /* op vA, vB, offset//CCCC */
7063 lsr w2, wINST, #12 // w2<- B
7064 FETCH w1, 1 // w1<- field byte offset
7065 GET_VREG w3, w2 // w3<- fp[B], the object pointer
7066 ubfx w2, wINST, #8, #4 // w2<- A
7067 cmp w3, #0 // check object for null
7068 cbz w3, common_errNullObject // object was null
7069 GET_VREG w0, w2 // w0<- fp[A]
7070 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
7071 strh w0, [x3, x1] // obj.field<- w0
7072 GET_INST_OPCODE ip // extract opcode from rINST
7073 GOTO_OPCODE ip // jump to next instruction
7074
7075
7076/* ------------------------------ */
7077 .balign 128
7078.L_op_iput_short_quick: /* 0xee */
7079/* File: arm64/op_iput_short_quick.S */
7080/* File: arm64/op_iput_quick.S */
7081 /* For: iput-quick, iput-object-quick */
7082 /* op vA, vB, offset//CCCC */
7083 lsr w2, wINST, #12 // w2<- B
7084 FETCH w1, 1 // w1<- field byte offset
7085 GET_VREG w3, w2 // w3<- fp[B], the object pointer
7086 ubfx w2, wINST, #8, #4 // w2<- A
7087 cmp w3, #0 // check object for null
7088 cbz w3, common_errNullObject // object was null
7089 GET_VREG w0, w2 // w0<- fp[A]
7090 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
7091 strh w0, [x3, x1] // obj.field<- w0
7092 GET_INST_OPCODE ip // extract opcode from rINST
7093 GOTO_OPCODE ip // jump to next instruction
7094
7095
7096/* ------------------------------ */
7097 .balign 128
7098.L_op_iget_boolean_quick: /* 0xef */
7099/* File: arm64/op_iget_boolean_quick.S */
7100/* File: arm64/op_iget_quick.S */
7101 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7102 /* op vA, vB, offset//CCCC */
7103 lsr w2, wINST, #12 // w2<- B
7104 FETCH w1, 1 // w1<- field byte offset
7105 GET_VREG w3, w2 // w3<- object we're operating on
7106 ubfx w2, wINST, #8, #4 // w2<- A
7107 cmp x3, #0 // check object for null
7108 beq common_errNullObject // object was null
7109 ldrb w0, [x3, x1] // w0<- obj.field
7110 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
7111
7112 SET_VREG w0, w2 // fp[A]<- w0
7113 GET_INST_OPCODE ip // extract opcode from rINST
7114 GOTO_OPCODE ip // jump to next instruction
7115
7116
7117/* ------------------------------ */
7118 .balign 128
7119.L_op_iget_byte_quick: /* 0xf0 */
7120/* File: arm64/op_iget_byte_quick.S */
7121/* File: arm64/op_iget_quick.S */
7122 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7123 /* op vA, vB, offset//CCCC */
7124 lsr w2, wINST, #12 // w2<- B
7125 FETCH w1, 1 // w1<- field byte offset
7126 GET_VREG w3, w2 // w3<- object we're operating on
7127 ubfx w2, wINST, #8, #4 // w2<- A
7128 cmp x3, #0 // check object for null
7129 beq common_errNullObject // object was null
7130 ldrsb w0, [x3, x1] // w0<- obj.field
7131 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
7132
7133 SET_VREG w0, w2 // fp[A]<- w0
7134 GET_INST_OPCODE ip // extract opcode from rINST
7135 GOTO_OPCODE ip // jump to next instruction
7136
7137
7138/* ------------------------------ */
7139 .balign 128
7140.L_op_iget_char_quick: /* 0xf1 */
7141/* File: arm64/op_iget_char_quick.S */
7142/* File: arm64/op_iget_quick.S */
7143 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7144 /* op vA, vB, offset//CCCC */
7145 lsr w2, wINST, #12 // w2<- B
7146 FETCH w1, 1 // w1<- field byte offset
7147 GET_VREG w3, w2 // w3<- object we're operating on
7148 ubfx w2, wINST, #8, #4 // w2<- A
7149 cmp x3, #0 // check object for null
7150 beq common_errNullObject // object was null
7151 ldrh w0, [x3, x1] // w0<- obj.field
7152 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
7153
7154 SET_VREG w0, w2 // fp[A]<- w0
7155 GET_INST_OPCODE ip // extract opcode from rINST
7156 GOTO_OPCODE ip // jump to next instruction
7157
7158
7159/* ------------------------------ */
7160 .balign 128
7161.L_op_iget_short_quick: /* 0xf2 */
7162/* File: arm64/op_iget_short_quick.S */
7163/* File: arm64/op_iget_quick.S */
7164 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7165 /* op vA, vB, offset//CCCC */
7166 lsr w2, wINST, #12 // w2<- B
7167 FETCH w1, 1 // w1<- field byte offset
7168 GET_VREG w3, w2 // w3<- object we're operating on
7169 ubfx w2, wINST, #8, #4 // w2<- A
7170 cmp x3, #0 // check object for null
7171 beq common_errNullObject // object was null
7172 ldrsh w0, [x3, x1] // w0<- obj.field
7173 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
7174
7175 SET_VREG w0, w2 // fp[A]<- w0
7176 GET_INST_OPCODE ip // extract opcode from rINST
7177 GOTO_OPCODE ip // jump to next instruction
7178
7179
7180/* ------------------------------ */
7181 .balign 128
7182.L_op_invoke_lambda: /* 0xf3 */
7183/* Transfer stub to alternate interpreter */
7184 b MterpFallback
7185
7186
7187/* ------------------------------ */
7188 .balign 128
7189.L_op_unused_f4: /* 0xf4 */
7190/* File: arm64/op_unused_f4.S */
7191/* File: arm64/unused.S */
7192/*
7193 * Bail to reference interpreter to throw.
7194 */
7195 b MterpFallback
7196
7197
7198/* ------------------------------ */
7199 .balign 128
7200.L_op_capture_variable: /* 0xf5 */
7201/* Transfer stub to alternate interpreter */
7202 b MterpFallback
7203
7204
7205/* ------------------------------ */
7206 .balign 128
7207.L_op_create_lambda: /* 0xf6 */
7208/* Transfer stub to alternate interpreter */
7209 b MterpFallback
7210
7211
7212/* ------------------------------ */
7213 .balign 128
7214.L_op_liberate_variable: /* 0xf7 */
7215/* Transfer stub to alternate interpreter */
7216 b MterpFallback
7217
7218
7219/* ------------------------------ */
7220 .balign 128
7221.L_op_box_lambda: /* 0xf8 */
7222/* Transfer stub to alternate interpreter */
7223 b MterpFallback
7224
7225
7226/* ------------------------------ */
7227 .balign 128
7228.L_op_unbox_lambda: /* 0xf9 */
7229/* Transfer stub to alternate interpreter */
7230 b MterpFallback
7231
7232
7233/* ------------------------------ */
7234 .balign 128
7235.L_op_unused_fa: /* 0xfa */
7236/* File: arm64/op_unused_fa.S */
7237/* File: arm64/unused.S */
7238/*
7239 * Bail to reference interpreter to throw.
7240 */
7241 b MterpFallback
7242
7243
7244/* ------------------------------ */
7245 .balign 128
7246.L_op_unused_fb: /* 0xfb */
7247/* File: arm64/op_unused_fb.S */
7248/* File: arm64/unused.S */
7249/*
7250 * Bail to reference interpreter to throw.
7251 */
7252 b MterpFallback
7253
7254
7255/* ------------------------------ */
7256 .balign 128
7257.L_op_unused_fc: /* 0xfc */
7258/* File: arm64/op_unused_fc.S */
7259/* File: arm64/unused.S */
7260/*
7261 * Bail to reference interpreter to throw.
7262 */
7263 b MterpFallback
7264
7265
7266/* ------------------------------ */
7267 .balign 128
7268.L_op_unused_fd: /* 0xfd */
7269/* File: arm64/op_unused_fd.S */
7270/* File: arm64/unused.S */
7271/*
7272 * Bail to reference interpreter to throw.
7273 */
7274 b MterpFallback
7275
7276
7277/* ------------------------------ */
7278 .balign 128
7279.L_op_unused_fe: /* 0xfe */
7280/* File: arm64/op_unused_fe.S */
7281/* File: arm64/unused.S */
7282/*
7283 * Bail to reference interpreter to throw.
7284 */
7285 b MterpFallback
7286
7287
7288/* ------------------------------ */
7289 .balign 128
7290.L_op_unused_ff: /* 0xff */
7291/* File: arm64/op_unused_ff.S */
7292/* File: arm64/unused.S */
7293/*
7294 * Bail to reference interpreter to throw.
7295 */
7296 b MterpFallback
7297
7298
7299 .balign 128
7300 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7301 .global artMterpAsmInstructionEnd
7302artMterpAsmInstructionEnd:
7303
7304/*
7305 * ===========================================================================
7306 * Sister implementations
7307 * ===========================================================================
7308 */
7309 .global artMterpAsmSisterStart
7310 .type artMterpAsmSisterStart, %function
7311 .text
7312 .balign 4
7313artMterpAsmSisterStart:
7314
7315 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
7316 .global artMterpAsmSisterEnd
7317artMterpAsmSisterEnd:
7318
7319
7320 .global artMterpAsmAltInstructionStart
7321 .type artMterpAsmAltInstructionStart, %function
7322 .text
7323
7324artMterpAsmAltInstructionStart = .L_ALT_op_nop
7325/* ------------------------------ */
7326 .balign 128
7327.L_ALT_op_nop: /* 0x00 */
7328/* File: arm64/alt_stub.S */
7329/*
7330 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7331 * any interesting requests and then jump to the real instruction
7332 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7333 */
7334 .extern MterpCheckBefore
7335 EXPORT_PC
7336 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7337 adr lr, artMterpAsmInstructionStart + (0 * 128) // Addr of primary handler.
7338 mov x0, xSELF
7339 add x1, xFP, #OFF_FP_SHADOWFRAME
7340 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7341
7342/* ------------------------------ */
7343 .balign 128
7344.L_ALT_op_move: /* 0x01 */
7345/* File: arm64/alt_stub.S */
7346/*
7347 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7348 * any interesting requests and then jump to the real instruction
7349 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7350 */
7351 .extern MterpCheckBefore
7352 EXPORT_PC
7353 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7354 adr lr, artMterpAsmInstructionStart + (1 * 128) // Addr of primary handler.
7355 mov x0, xSELF
7356 add x1, xFP, #OFF_FP_SHADOWFRAME
7357 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7358
7359/* ------------------------------ */
7360 .balign 128
7361.L_ALT_op_move_from16: /* 0x02 */
7362/* File: arm64/alt_stub.S */
7363/*
7364 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7365 * any interesting requests and then jump to the real instruction
7366 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7367 */
7368 .extern MterpCheckBefore
7369 EXPORT_PC
7370 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7371 adr lr, artMterpAsmInstructionStart + (2 * 128) // Addr of primary handler.
7372 mov x0, xSELF
7373 add x1, xFP, #OFF_FP_SHADOWFRAME
7374 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7375
7376/* ------------------------------ */
7377 .balign 128
7378.L_ALT_op_move_16: /* 0x03 */
7379/* File: arm64/alt_stub.S */
7380/*
7381 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7382 * any interesting requests and then jump to the real instruction
7383 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7384 */
7385 .extern MterpCheckBefore
7386 EXPORT_PC
7387 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7388 adr lr, artMterpAsmInstructionStart + (3 * 128) // Addr of primary handler.
7389 mov x0, xSELF
7390 add x1, xFP, #OFF_FP_SHADOWFRAME
7391 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7392
7393/* ------------------------------ */
7394 .balign 128
7395.L_ALT_op_move_wide: /* 0x04 */
7396/* File: arm64/alt_stub.S */
7397/*
7398 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7399 * any interesting requests and then jump to the real instruction
7400 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7401 */
7402 .extern MterpCheckBefore
7403 EXPORT_PC
7404 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7405 adr lr, artMterpAsmInstructionStart + (4 * 128) // Addr of primary handler.
7406 mov x0, xSELF
7407 add x1, xFP, #OFF_FP_SHADOWFRAME
7408 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7409
7410/* ------------------------------ */
7411 .balign 128
7412.L_ALT_op_move_wide_from16: /* 0x05 */
7413/* File: arm64/alt_stub.S */
7414/*
7415 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7416 * any interesting requests and then jump to the real instruction
7417 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7418 */
7419 .extern MterpCheckBefore
7420 EXPORT_PC
7421 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7422 adr lr, artMterpAsmInstructionStart + (5 * 128) // Addr of primary handler.
7423 mov x0, xSELF
7424 add x1, xFP, #OFF_FP_SHADOWFRAME
7425 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7426
7427/* ------------------------------ */
7428 .balign 128
7429.L_ALT_op_move_wide_16: /* 0x06 */
7430/* File: arm64/alt_stub.S */
7431/*
7432 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7433 * any interesting requests and then jump to the real instruction
7434 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7435 */
7436 .extern MterpCheckBefore
7437 EXPORT_PC
7438 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7439 adr lr, artMterpAsmInstructionStart + (6 * 128) // Addr of primary handler.
7440 mov x0, xSELF
7441 add x1, xFP, #OFF_FP_SHADOWFRAME
7442 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7443
7444/* ------------------------------ */
7445 .balign 128
7446.L_ALT_op_move_object: /* 0x07 */
7447/* File: arm64/alt_stub.S */
7448/*
7449 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7450 * any interesting requests and then jump to the real instruction
7451 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7452 */
7453 .extern MterpCheckBefore
7454 EXPORT_PC
7455 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7456 adr lr, artMterpAsmInstructionStart + (7 * 128) // Addr of primary handler.
7457 mov x0, xSELF
7458 add x1, xFP, #OFF_FP_SHADOWFRAME
7459 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7460
7461/* ------------------------------ */
7462 .balign 128
7463.L_ALT_op_move_object_from16: /* 0x08 */
7464/* File: arm64/alt_stub.S */
7465/*
7466 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7467 * any interesting requests and then jump to the real instruction
7468 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7469 */
7470 .extern MterpCheckBefore
7471 EXPORT_PC
7472 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7473 adr lr, artMterpAsmInstructionStart + (8 * 128) // Addr of primary handler.
7474 mov x0, xSELF
7475 add x1, xFP, #OFF_FP_SHADOWFRAME
7476 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7477
7478/* ------------------------------ */
7479 .balign 128
7480.L_ALT_op_move_object_16: /* 0x09 */
7481/* File: arm64/alt_stub.S */
7482/*
7483 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7484 * any interesting requests and then jump to the real instruction
7485 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7486 */
7487 .extern MterpCheckBefore
7488 EXPORT_PC
7489 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7490 adr lr, artMterpAsmInstructionStart + (9 * 128) // Addr of primary handler.
7491 mov x0, xSELF
7492 add x1, xFP, #OFF_FP_SHADOWFRAME
7493 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7494
7495/* ------------------------------ */
7496 .balign 128
7497.L_ALT_op_move_result: /* 0x0a */
7498/* File: arm64/alt_stub.S */
7499/*
7500 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7501 * any interesting requests and then jump to the real instruction
7502 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7503 */
7504 .extern MterpCheckBefore
7505 EXPORT_PC
7506 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7507 adr lr, artMterpAsmInstructionStart + (10 * 128) // Addr of primary handler.
7508 mov x0, xSELF
7509 add x1, xFP, #OFF_FP_SHADOWFRAME
7510 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7511
7512/* ------------------------------ */
7513 .balign 128
7514.L_ALT_op_move_result_wide: /* 0x0b */
7515/* File: arm64/alt_stub.S */
7516/*
7517 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7518 * any interesting requests and then jump to the real instruction
7519 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7520 */
7521 .extern MterpCheckBefore
7522 EXPORT_PC
7523 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7524 adr lr, artMterpAsmInstructionStart + (11 * 128) // Addr of primary handler.
7525 mov x0, xSELF
7526 add x1, xFP, #OFF_FP_SHADOWFRAME
7527 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7528
7529/* ------------------------------ */
7530 .balign 128
7531.L_ALT_op_move_result_object: /* 0x0c */
7532/* File: arm64/alt_stub.S */
7533/*
7534 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7535 * any interesting requests and then jump to the real instruction
7536 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7537 */
7538 .extern MterpCheckBefore
7539 EXPORT_PC
7540 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7541 adr lr, artMterpAsmInstructionStart + (12 * 128) // Addr of primary handler.
7542 mov x0, xSELF
7543 add x1, xFP, #OFF_FP_SHADOWFRAME
7544 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7545
7546/* ------------------------------ */
7547 .balign 128
7548.L_ALT_op_move_exception: /* 0x0d */
7549/* File: arm64/alt_stub.S */
7550/*
7551 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7552 * any interesting requests and then jump to the real instruction
7553 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7554 */
7555 .extern MterpCheckBefore
7556 EXPORT_PC
7557 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7558 adr lr, artMterpAsmInstructionStart + (13 * 128) // Addr of primary handler.
7559 mov x0, xSELF
7560 add x1, xFP, #OFF_FP_SHADOWFRAME
7561 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7562
7563/* ------------------------------ */
7564 .balign 128
7565.L_ALT_op_return_void: /* 0x0e */
7566/* File: arm64/alt_stub.S */
7567/*
7568 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7569 * any interesting requests and then jump to the real instruction
7570 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7571 */
7572 .extern MterpCheckBefore
7573 EXPORT_PC
7574 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7575 adr lr, artMterpAsmInstructionStart + (14 * 128) // Addr of primary handler.
7576 mov x0, xSELF
7577 add x1, xFP, #OFF_FP_SHADOWFRAME
7578 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7579
7580/* ------------------------------ */
7581 .balign 128
7582.L_ALT_op_return: /* 0x0f */
7583/* File: arm64/alt_stub.S */
7584/*
7585 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7586 * any interesting requests and then jump to the real instruction
7587 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7588 */
7589 .extern MterpCheckBefore
7590 EXPORT_PC
7591 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7592 adr lr, artMterpAsmInstructionStart + (15 * 128) // Addr of primary handler.
7593 mov x0, xSELF
7594 add x1, xFP, #OFF_FP_SHADOWFRAME
7595 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7596
7597/* ------------------------------ */
7598 .balign 128
7599.L_ALT_op_return_wide: /* 0x10 */
7600/* File: arm64/alt_stub.S */
7601/*
7602 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7603 * any interesting requests and then jump to the real instruction
7604 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7605 */
7606 .extern MterpCheckBefore
7607 EXPORT_PC
7608 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7609 adr lr, artMterpAsmInstructionStart + (16 * 128) // Addr of primary handler.
7610 mov x0, xSELF
7611 add x1, xFP, #OFF_FP_SHADOWFRAME
7612 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7613
7614/* ------------------------------ */
7615 .balign 128
7616.L_ALT_op_return_object: /* 0x11 */
7617/* File: arm64/alt_stub.S */
7618/*
7619 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7620 * any interesting requests and then jump to the real instruction
7621 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7622 */
7623 .extern MterpCheckBefore
7624 EXPORT_PC
7625 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7626 adr lr, artMterpAsmInstructionStart + (17 * 128) // Addr of primary handler.
7627 mov x0, xSELF
7628 add x1, xFP, #OFF_FP_SHADOWFRAME
7629 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7630
7631/* ------------------------------ */
7632 .balign 128
7633.L_ALT_op_const_4: /* 0x12 */
7634/* File: arm64/alt_stub.S */
7635/*
7636 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7637 * any interesting requests and then jump to the real instruction
7638 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7639 */
7640 .extern MterpCheckBefore
7641 EXPORT_PC
7642 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7643 adr lr, artMterpAsmInstructionStart + (18 * 128) // Addr of primary handler.
7644 mov x0, xSELF
7645 add x1, xFP, #OFF_FP_SHADOWFRAME
7646 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7647
7648/* ------------------------------ */
7649 .balign 128
7650.L_ALT_op_const_16: /* 0x13 */
7651/* File: arm64/alt_stub.S */
7652/*
7653 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7654 * any interesting requests and then jump to the real instruction
7655 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7656 */
7657 .extern MterpCheckBefore
7658 EXPORT_PC
7659 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7660 adr lr, artMterpAsmInstructionStart + (19 * 128) // Addr of primary handler.
7661 mov x0, xSELF
7662 add x1, xFP, #OFF_FP_SHADOWFRAME
7663 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7664
7665/* ------------------------------ */
7666 .balign 128
7667.L_ALT_op_const: /* 0x14 */
7668/* File: arm64/alt_stub.S */
7669/*
7670 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7671 * any interesting requests and then jump to the real instruction
7672 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7673 */
7674 .extern MterpCheckBefore
7675 EXPORT_PC
7676 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7677 adr lr, artMterpAsmInstructionStart + (20 * 128) // Addr of primary handler.
7678 mov x0, xSELF
7679 add x1, xFP, #OFF_FP_SHADOWFRAME
7680 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7681
7682/* ------------------------------ */
7683 .balign 128
7684.L_ALT_op_const_high16: /* 0x15 */
7685/* File: arm64/alt_stub.S */
7686/*
7687 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7688 * any interesting requests and then jump to the real instruction
7689 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7690 */
7691 .extern MterpCheckBefore
7692 EXPORT_PC
7693 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7694 adr lr, artMterpAsmInstructionStart + (21 * 128) // Addr of primary handler.
7695 mov x0, xSELF
7696 add x1, xFP, #OFF_FP_SHADOWFRAME
7697 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7698
7699/* ------------------------------ */
7700 .balign 128
7701.L_ALT_op_const_wide_16: /* 0x16 */
7702/* File: arm64/alt_stub.S */
7703/*
7704 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7705 * any interesting requests and then jump to the real instruction
7706 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7707 */
7708 .extern MterpCheckBefore
7709 EXPORT_PC
7710 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7711 adr lr, artMterpAsmInstructionStart + (22 * 128) // Addr of primary handler.
7712 mov x0, xSELF
7713 add x1, xFP, #OFF_FP_SHADOWFRAME
7714 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7715
7716/* ------------------------------ */
7717 .balign 128
7718.L_ALT_op_const_wide_32: /* 0x17 */
7719/* File: arm64/alt_stub.S */
7720/*
7721 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7722 * any interesting requests and then jump to the real instruction
7723 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7724 */
7725 .extern MterpCheckBefore
7726 EXPORT_PC
7727 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7728 adr lr, artMterpAsmInstructionStart + (23 * 128) // Addr of primary handler.
7729 mov x0, xSELF
7730 add x1, xFP, #OFF_FP_SHADOWFRAME
7731 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7732
7733/* ------------------------------ */
7734 .balign 128
7735.L_ALT_op_const_wide: /* 0x18 */
7736/* File: arm64/alt_stub.S */
7737/*
7738 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7739 * any interesting requests and then jump to the real instruction
7740 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7741 */
7742 .extern MterpCheckBefore
7743 EXPORT_PC
7744 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7745 adr lr, artMterpAsmInstructionStart + (24 * 128) // Addr of primary handler.
7746 mov x0, xSELF
7747 add x1, xFP, #OFF_FP_SHADOWFRAME
7748 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7749
7750/* ------------------------------ */
7751 .balign 128
7752.L_ALT_op_const_wide_high16: /* 0x19 */
7753/* File: arm64/alt_stub.S */
7754/*
7755 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7756 * any interesting requests and then jump to the real instruction
7757 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7758 */
7759 .extern MterpCheckBefore
7760 EXPORT_PC
7761 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7762 adr lr, artMterpAsmInstructionStart + (25 * 128) // Addr of primary handler.
7763 mov x0, xSELF
7764 add x1, xFP, #OFF_FP_SHADOWFRAME
7765 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7766
7767/* ------------------------------ */
7768 .balign 128
7769.L_ALT_op_const_string: /* 0x1a */
7770/* File: arm64/alt_stub.S */
7771/*
7772 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7773 * any interesting requests and then jump to the real instruction
7774 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7775 */
7776 .extern MterpCheckBefore
7777 EXPORT_PC
7778 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7779 adr lr, artMterpAsmInstructionStart + (26 * 128) // Addr of primary handler.
7780 mov x0, xSELF
7781 add x1, xFP, #OFF_FP_SHADOWFRAME
7782 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7783
7784/* ------------------------------ */
7785 .balign 128
7786.L_ALT_op_const_string_jumbo: /* 0x1b */
7787/* File: arm64/alt_stub.S */
7788/*
7789 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7790 * any interesting requests and then jump to the real instruction
7791 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7792 */
7793 .extern MterpCheckBefore
7794 EXPORT_PC
7795 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7796 adr lr, artMterpAsmInstructionStart + (27 * 128) // Addr of primary handler.
7797 mov x0, xSELF
7798 add x1, xFP, #OFF_FP_SHADOWFRAME
7799 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7800
7801/* ------------------------------ */
7802 .balign 128
7803.L_ALT_op_const_class: /* 0x1c */
7804/* File: arm64/alt_stub.S */
7805/*
7806 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7807 * any interesting requests and then jump to the real instruction
7808 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7809 */
7810 .extern MterpCheckBefore
7811 EXPORT_PC
7812 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7813 adr lr, artMterpAsmInstructionStart + (28 * 128) // Addr of primary handler.
7814 mov x0, xSELF
7815 add x1, xFP, #OFF_FP_SHADOWFRAME
7816 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7817
7818/* ------------------------------ */
7819 .balign 128
7820.L_ALT_op_monitor_enter: /* 0x1d */
7821/* File: arm64/alt_stub.S */
7822/*
7823 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7824 * any interesting requests and then jump to the real instruction
7825 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7826 */
7827 .extern MterpCheckBefore
7828 EXPORT_PC
7829 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7830 adr lr, artMterpAsmInstructionStart + (29 * 128) // Addr of primary handler.
7831 mov x0, xSELF
7832 add x1, xFP, #OFF_FP_SHADOWFRAME
7833 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7834
7835/* ------------------------------ */
7836 .balign 128
7837.L_ALT_op_monitor_exit: /* 0x1e */
7838/* File: arm64/alt_stub.S */
7839/*
7840 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7841 * any interesting requests and then jump to the real instruction
7842 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7843 */
7844 .extern MterpCheckBefore
7845 EXPORT_PC
7846 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7847 adr lr, artMterpAsmInstructionStart + (30 * 128) // Addr of primary handler.
7848 mov x0, xSELF
7849 add x1, xFP, #OFF_FP_SHADOWFRAME
7850 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7851
7852/* ------------------------------ */
7853 .balign 128
7854.L_ALT_op_check_cast: /* 0x1f */
7855/* File: arm64/alt_stub.S */
7856/*
7857 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7858 * any interesting requests and then jump to the real instruction
7859 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7860 */
7861 .extern MterpCheckBefore
7862 EXPORT_PC
7863 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7864 adr lr, artMterpAsmInstructionStart + (31 * 128) // Addr of primary handler.
7865 mov x0, xSELF
7866 add x1, xFP, #OFF_FP_SHADOWFRAME
7867 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7868
7869/* ------------------------------ */
7870 .balign 128
7871.L_ALT_op_instance_of: /* 0x20 */
7872/* File: arm64/alt_stub.S */
7873/*
7874 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7875 * any interesting requests and then jump to the real instruction
7876 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7877 */
7878 .extern MterpCheckBefore
7879 EXPORT_PC
7880 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7881 adr lr, artMterpAsmInstructionStart + (32 * 128) // Addr of primary handler.
7882 mov x0, xSELF
7883 add x1, xFP, #OFF_FP_SHADOWFRAME
7884 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7885
7886/* ------------------------------ */
7887 .balign 128
7888.L_ALT_op_array_length: /* 0x21 */
7889/* File: arm64/alt_stub.S */
7890/*
7891 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7892 * any interesting requests and then jump to the real instruction
7893 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7894 */
7895 .extern MterpCheckBefore
7896 EXPORT_PC
7897 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7898 adr lr, artMterpAsmInstructionStart + (33 * 128) // Addr of primary handler.
7899 mov x0, xSELF
7900 add x1, xFP, #OFF_FP_SHADOWFRAME
7901 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7902
7903/* ------------------------------ */
7904 .balign 128
7905.L_ALT_op_new_instance: /* 0x22 */
7906/* File: arm64/alt_stub.S */
7907/*
7908 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7909 * any interesting requests and then jump to the real instruction
7910 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7911 */
7912 .extern MterpCheckBefore
7913 EXPORT_PC
7914 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7915 adr lr, artMterpAsmInstructionStart + (34 * 128) // Addr of primary handler.
7916 mov x0, xSELF
7917 add x1, xFP, #OFF_FP_SHADOWFRAME
7918 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7919
7920/* ------------------------------ */
7921 .balign 128
7922.L_ALT_op_new_array: /* 0x23 */
7923/* File: arm64/alt_stub.S */
7924/*
7925 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7926 * any interesting requests and then jump to the real instruction
7927 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7928 */
7929 .extern MterpCheckBefore
7930 EXPORT_PC
7931 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7932 adr lr, artMterpAsmInstructionStart + (35 * 128) // Addr of primary handler.
7933 mov x0, xSELF
7934 add x1, xFP, #OFF_FP_SHADOWFRAME
7935 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7936
7937/* ------------------------------ */
7938 .balign 128
7939.L_ALT_op_filled_new_array: /* 0x24 */
7940/* File: arm64/alt_stub.S */
7941/*
7942 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7943 * any interesting requests and then jump to the real instruction
7944 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7945 */
7946 .extern MterpCheckBefore
7947 EXPORT_PC
7948 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7949 adr lr, artMterpAsmInstructionStart + (36 * 128) // Addr of primary handler.
7950 mov x0, xSELF
7951 add x1, xFP, #OFF_FP_SHADOWFRAME
7952 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7953
7954/* ------------------------------ */
7955 .balign 128
7956.L_ALT_op_filled_new_array_range: /* 0x25 */
7957/* File: arm64/alt_stub.S */
7958/*
7959 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7960 * any interesting requests and then jump to the real instruction
7961 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7962 */
7963 .extern MterpCheckBefore
7964 EXPORT_PC
7965 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7966 adr lr, artMterpAsmInstructionStart + (37 * 128) // Addr of primary handler.
7967 mov x0, xSELF
7968 add x1, xFP, #OFF_FP_SHADOWFRAME
7969 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7970
7971/* ------------------------------ */
7972 .balign 128
7973.L_ALT_op_fill_array_data: /* 0x26 */
7974/* File: arm64/alt_stub.S */
7975/*
7976 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7977 * any interesting requests and then jump to the real instruction
7978 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7979 */
7980 .extern MterpCheckBefore
7981 EXPORT_PC
7982 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7983 adr lr, artMterpAsmInstructionStart + (38 * 128) // Addr of primary handler.
7984 mov x0, xSELF
7985 add x1, xFP, #OFF_FP_SHADOWFRAME
7986 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7987
7988/* ------------------------------ */
7989 .balign 128
7990.L_ALT_op_throw: /* 0x27 */
7991/* File: arm64/alt_stub.S */
7992/*
7993 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7994 * any interesting requests and then jump to the real instruction
7995 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7996 */
7997 .extern MterpCheckBefore
7998 EXPORT_PC
7999 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8000 adr lr, artMterpAsmInstructionStart + (39 * 128) // Addr of primary handler.
8001 mov x0, xSELF
8002 add x1, xFP, #OFF_FP_SHADOWFRAME
8003 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8004
8005/* ------------------------------ */
8006 .balign 128
8007.L_ALT_op_goto: /* 0x28 */
8008/* File: arm64/alt_stub.S */
8009/*
8010 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8011 * any interesting requests and then jump to the real instruction
8012 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8013 */
8014 .extern MterpCheckBefore
8015 EXPORT_PC
8016 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8017 adr lr, artMterpAsmInstructionStart + (40 * 128) // Addr of primary handler.
8018 mov x0, xSELF
8019 add x1, xFP, #OFF_FP_SHADOWFRAME
8020 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8021
8022/* ------------------------------ */
8023 .balign 128
8024.L_ALT_op_goto_16: /* 0x29 */
8025/* File: arm64/alt_stub.S */
8026/*
8027 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8028 * any interesting requests and then jump to the real instruction
8029 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8030 */
8031 .extern MterpCheckBefore
8032 EXPORT_PC
8033 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8034 adr lr, artMterpAsmInstructionStart + (41 * 128) // Addr of primary handler.
8035 mov x0, xSELF
8036 add x1, xFP, #OFF_FP_SHADOWFRAME
8037 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8038
8039/* ------------------------------ */
8040 .balign 128
8041.L_ALT_op_goto_32: /* 0x2a */
8042/* File: arm64/alt_stub.S */
8043/*
8044 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8045 * any interesting requests and then jump to the real instruction
8046 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8047 */
8048 .extern MterpCheckBefore
8049 EXPORT_PC
8050 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8051 adr lr, artMterpAsmInstructionStart + (42 * 128) // Addr of primary handler.
8052 mov x0, xSELF
8053 add x1, xFP, #OFF_FP_SHADOWFRAME
8054 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8055
8056/* ------------------------------ */
8057 .balign 128
8058.L_ALT_op_packed_switch: /* 0x2b */
8059/* File: arm64/alt_stub.S */
8060/*
8061 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8062 * any interesting requests and then jump to the real instruction
8063 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8064 */
8065 .extern MterpCheckBefore
8066 EXPORT_PC
8067 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8068 adr lr, artMterpAsmInstructionStart + (43 * 128) // Addr of primary handler.
8069 mov x0, xSELF
8070 add x1, xFP, #OFF_FP_SHADOWFRAME
8071 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8072
8073/* ------------------------------ */
8074 .balign 128
8075.L_ALT_op_sparse_switch: /* 0x2c */
8076/* File: arm64/alt_stub.S */
8077/*
8078 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8079 * any interesting requests and then jump to the real instruction
8080 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8081 */
8082 .extern MterpCheckBefore
8083 EXPORT_PC
8084 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8085 adr lr, artMterpAsmInstructionStart + (44 * 128) // Addr of primary handler.
8086 mov x0, xSELF
8087 add x1, xFP, #OFF_FP_SHADOWFRAME
8088 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8089
8090/* ------------------------------ */
8091 .balign 128
8092.L_ALT_op_cmpl_float: /* 0x2d */
8093/* File: arm64/alt_stub.S */
8094/*
8095 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8096 * any interesting requests and then jump to the real instruction
8097 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8098 */
8099 .extern MterpCheckBefore
8100 EXPORT_PC
8101 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8102 adr lr, artMterpAsmInstructionStart + (45 * 128) // Addr of primary handler.
8103 mov x0, xSELF
8104 add x1, xFP, #OFF_FP_SHADOWFRAME
8105 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8106
8107/* ------------------------------ */
8108 .balign 128
8109.L_ALT_op_cmpg_float: /* 0x2e */
8110/* File: arm64/alt_stub.S */
8111/*
8112 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8113 * any interesting requests and then jump to the real instruction
8114 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8115 */
8116 .extern MterpCheckBefore
8117 EXPORT_PC
8118 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8119 adr lr, artMterpAsmInstructionStart + (46 * 128) // Addr of primary handler.
8120 mov x0, xSELF
8121 add x1, xFP, #OFF_FP_SHADOWFRAME
8122 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8123
8124/* ------------------------------ */
8125 .balign 128
8126.L_ALT_op_cmpl_double: /* 0x2f */
8127/* File: arm64/alt_stub.S */
8128/*
8129 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8130 * any interesting requests and then jump to the real instruction
8131 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8132 */
8133 .extern MterpCheckBefore
8134 EXPORT_PC
8135 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8136 adr lr, artMterpAsmInstructionStart + (47 * 128) // Addr of primary handler.
8137 mov x0, xSELF
8138 add x1, xFP, #OFF_FP_SHADOWFRAME
8139 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8140
8141/* ------------------------------ */
8142 .balign 128
8143.L_ALT_op_cmpg_double: /* 0x30 */
8144/* File: arm64/alt_stub.S */
8145/*
8146 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8147 * any interesting requests and then jump to the real instruction
8148 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8149 */
8150 .extern MterpCheckBefore
8151 EXPORT_PC
8152 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8153 adr lr, artMterpAsmInstructionStart + (48 * 128) // Addr of primary handler.
8154 mov x0, xSELF
8155 add x1, xFP, #OFF_FP_SHADOWFRAME
8156 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8157
8158/* ------------------------------ */
8159 .balign 128
8160.L_ALT_op_cmp_long: /* 0x31 */
8161/* File: arm64/alt_stub.S */
8162/*
8163 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8164 * any interesting requests and then jump to the real instruction
8165 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8166 */
8167 .extern MterpCheckBefore
8168 EXPORT_PC
8169 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8170 adr lr, artMterpAsmInstructionStart + (49 * 128) // Addr of primary handler.
8171 mov x0, xSELF
8172 add x1, xFP, #OFF_FP_SHADOWFRAME
8173 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8174
8175/* ------------------------------ */
8176 .balign 128
8177.L_ALT_op_if_eq: /* 0x32 */
8178/* File: arm64/alt_stub.S */
8179/*
8180 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8181 * any interesting requests and then jump to the real instruction
8182 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8183 */
8184 .extern MterpCheckBefore
8185 EXPORT_PC
8186 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8187 adr lr, artMterpAsmInstructionStart + (50 * 128) // Addr of primary handler.
8188 mov x0, xSELF
8189 add x1, xFP, #OFF_FP_SHADOWFRAME
8190 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8191
8192/* ------------------------------ */
8193 .balign 128
8194.L_ALT_op_if_ne: /* 0x33 */
8195/* File: arm64/alt_stub.S */
8196/*
8197 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8198 * any interesting requests and then jump to the real instruction
8199 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8200 */
8201 .extern MterpCheckBefore
8202 EXPORT_PC
8203 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8204 adr lr, artMterpAsmInstructionStart + (51 * 128) // Addr of primary handler.
8205 mov x0, xSELF
8206 add x1, xFP, #OFF_FP_SHADOWFRAME
8207 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8208
8209/* ------------------------------ */
8210 .balign 128
8211.L_ALT_op_if_lt: /* 0x34 */
8212/* File: arm64/alt_stub.S */
8213/*
8214 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8215 * any interesting requests and then jump to the real instruction
8216 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8217 */
8218 .extern MterpCheckBefore
8219 EXPORT_PC
8220 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8221 adr lr, artMterpAsmInstructionStart + (52 * 128) // Addr of primary handler.
8222 mov x0, xSELF
8223 add x1, xFP, #OFF_FP_SHADOWFRAME
8224 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8225
8226/* ------------------------------ */
8227 .balign 128
8228.L_ALT_op_if_ge: /* 0x35 */
8229/* File: arm64/alt_stub.S */
8230/*
8231 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8232 * any interesting requests and then jump to the real instruction
8233 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8234 */
8235 .extern MterpCheckBefore
8236 EXPORT_PC
8237 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8238 adr lr, artMterpAsmInstructionStart + (53 * 128) // Addr of primary handler.
8239 mov x0, xSELF
8240 add x1, xFP, #OFF_FP_SHADOWFRAME
8241 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8242
8243/* ------------------------------ */
8244 .balign 128
8245.L_ALT_op_if_gt: /* 0x36 */
8246/* File: arm64/alt_stub.S */
8247/*
8248 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8249 * any interesting requests and then jump to the real instruction
8250 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8251 */
8252 .extern MterpCheckBefore
8253 EXPORT_PC
8254 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8255 adr lr, artMterpAsmInstructionStart + (54 * 128) // Addr of primary handler.
8256 mov x0, xSELF
8257 add x1, xFP, #OFF_FP_SHADOWFRAME
8258 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8259
8260/* ------------------------------ */
8261 .balign 128
8262.L_ALT_op_if_le: /* 0x37 */
8263/* File: arm64/alt_stub.S */
8264/*
8265 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8266 * any interesting requests and then jump to the real instruction
8267 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8268 */
8269 .extern MterpCheckBefore
8270 EXPORT_PC
8271 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8272 adr lr, artMterpAsmInstructionStart + (55 * 128) // Addr of primary handler.
8273 mov x0, xSELF
8274 add x1, xFP, #OFF_FP_SHADOWFRAME
8275 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8276
8277/* ------------------------------ */
8278 .balign 128
8279.L_ALT_op_if_eqz: /* 0x38 */
8280/* File: arm64/alt_stub.S */
8281/*
8282 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8283 * any interesting requests and then jump to the real instruction
8284 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8285 */
8286 .extern MterpCheckBefore
8287 EXPORT_PC
8288 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8289 adr lr, artMterpAsmInstructionStart + (56 * 128) // Addr of primary handler.
8290 mov x0, xSELF
8291 add x1, xFP, #OFF_FP_SHADOWFRAME
8292 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8293
8294/* ------------------------------ */
8295 .balign 128
8296.L_ALT_op_if_nez: /* 0x39 */
8297/* File: arm64/alt_stub.S */
8298/*
8299 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8300 * any interesting requests and then jump to the real instruction
8301 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8302 */
8303 .extern MterpCheckBefore
8304 EXPORT_PC
8305 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8306 adr lr, artMterpAsmInstructionStart + (57 * 128) // Addr of primary handler.
8307 mov x0, xSELF
8308 add x1, xFP, #OFF_FP_SHADOWFRAME
8309 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8310
8311/* ------------------------------ */
8312 .balign 128
8313.L_ALT_op_if_ltz: /* 0x3a */
8314/* File: arm64/alt_stub.S */
8315/*
8316 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8317 * any interesting requests and then jump to the real instruction
8318 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8319 */
8320 .extern MterpCheckBefore
8321 EXPORT_PC
8322 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8323 adr lr, artMterpAsmInstructionStart + (58 * 128) // Addr of primary handler.
8324 mov x0, xSELF
8325 add x1, xFP, #OFF_FP_SHADOWFRAME
8326 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8327
8328/* ------------------------------ */
8329 .balign 128
8330.L_ALT_op_if_gez: /* 0x3b */
8331/* File: arm64/alt_stub.S */
8332/*
8333 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8334 * any interesting requests and then jump to the real instruction
8335 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8336 */
8337 .extern MterpCheckBefore
8338 EXPORT_PC
8339 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8340 adr lr, artMterpAsmInstructionStart + (59 * 128) // Addr of primary handler.
8341 mov x0, xSELF
8342 add x1, xFP, #OFF_FP_SHADOWFRAME
8343 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8344
8345/* ------------------------------ */
8346 .balign 128
8347.L_ALT_op_if_gtz: /* 0x3c */
8348/* File: arm64/alt_stub.S */
8349/*
8350 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8351 * any interesting requests and then jump to the real instruction
8352 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8353 */
8354 .extern MterpCheckBefore
8355 EXPORT_PC
8356 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8357 adr lr, artMterpAsmInstructionStart + (60 * 128) // Addr of primary handler.
8358 mov x0, xSELF
8359 add x1, xFP, #OFF_FP_SHADOWFRAME
8360 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8361
8362/* ------------------------------ */
8363 .balign 128
8364.L_ALT_op_if_lez: /* 0x3d */
8365/* File: arm64/alt_stub.S */
8366/*
8367 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8368 * any interesting requests and then jump to the real instruction
8369 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8370 */
8371 .extern MterpCheckBefore
8372 EXPORT_PC
8373 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8374 adr lr, artMterpAsmInstructionStart + (61 * 128) // Addr of primary handler.
8375 mov x0, xSELF
8376 add x1, xFP, #OFF_FP_SHADOWFRAME
8377 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8378
8379/* ------------------------------ */
8380 .balign 128
8381.L_ALT_op_unused_3e: /* 0x3e */
8382/* File: arm64/alt_stub.S */
8383/*
8384 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8385 * any interesting requests and then jump to the real instruction
8386 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8387 */
8388 .extern MterpCheckBefore
8389 EXPORT_PC
8390 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8391 adr lr, artMterpAsmInstructionStart + (62 * 128) // Addr of primary handler.
8392 mov x0, xSELF
8393 add x1, xFP, #OFF_FP_SHADOWFRAME
8394 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8395
8396/* ------------------------------ */
8397 .balign 128
8398.L_ALT_op_unused_3f: /* 0x3f */
8399/* File: arm64/alt_stub.S */
8400/*
8401 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8402 * any interesting requests and then jump to the real instruction
8403 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8404 */
8405 .extern MterpCheckBefore
8406 EXPORT_PC
8407 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8408 adr lr, artMterpAsmInstructionStart + (63 * 128) // Addr of primary handler.
8409 mov x0, xSELF
8410 add x1, xFP, #OFF_FP_SHADOWFRAME
8411 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8412
8413/* ------------------------------ */
8414 .balign 128
8415.L_ALT_op_unused_40: /* 0x40 */
8416/* File: arm64/alt_stub.S */
8417/*
8418 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8419 * any interesting requests and then jump to the real instruction
8420 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8421 */
8422 .extern MterpCheckBefore
8423 EXPORT_PC
8424 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8425 adr lr, artMterpAsmInstructionStart + (64 * 128) // Addr of primary handler.
8426 mov x0, xSELF
8427 add x1, xFP, #OFF_FP_SHADOWFRAME
8428 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8429
8430/* ------------------------------ */
8431 .balign 128
8432.L_ALT_op_unused_41: /* 0x41 */
8433/* File: arm64/alt_stub.S */
8434/*
8435 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8436 * any interesting requests and then jump to the real instruction
8437 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8438 */
8439 .extern MterpCheckBefore
8440 EXPORT_PC
8441 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8442 adr lr, artMterpAsmInstructionStart + (65 * 128) // Addr of primary handler.
8443 mov x0, xSELF
8444 add x1, xFP, #OFF_FP_SHADOWFRAME
8445 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8446
8447/* ------------------------------ */
8448 .balign 128
8449.L_ALT_op_unused_42: /* 0x42 */
8450/* File: arm64/alt_stub.S */
8451/*
8452 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8453 * any interesting requests and then jump to the real instruction
8454 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8455 */
8456 .extern MterpCheckBefore
8457 EXPORT_PC
8458 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8459 adr lr, artMterpAsmInstructionStart + (66 * 128) // Addr of primary handler.
8460 mov x0, xSELF
8461 add x1, xFP, #OFF_FP_SHADOWFRAME
8462 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8463
8464/* ------------------------------ */
8465 .balign 128
8466.L_ALT_op_unused_43: /* 0x43 */
8467/* File: arm64/alt_stub.S */
8468/*
8469 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8470 * any interesting requests and then jump to the real instruction
8471 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8472 */
8473 .extern MterpCheckBefore
8474 EXPORT_PC
8475 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8476 adr lr, artMterpAsmInstructionStart + (67 * 128) // Addr of primary handler.
8477 mov x0, xSELF
8478 add x1, xFP, #OFF_FP_SHADOWFRAME
8479 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8480
8481/* ------------------------------ */
8482 .balign 128
8483.L_ALT_op_aget: /* 0x44 */
8484/* File: arm64/alt_stub.S */
8485/*
8486 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8487 * any interesting requests and then jump to the real instruction
8488 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8489 */
8490 .extern MterpCheckBefore
8491 EXPORT_PC
8492 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8493 adr lr, artMterpAsmInstructionStart + (68 * 128) // Addr of primary handler.
8494 mov x0, xSELF
8495 add x1, xFP, #OFF_FP_SHADOWFRAME
8496 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8497
8498/* ------------------------------ */
8499 .balign 128
8500.L_ALT_op_aget_wide: /* 0x45 */
8501/* File: arm64/alt_stub.S */
8502/*
8503 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8504 * any interesting requests and then jump to the real instruction
8505 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8506 */
8507 .extern MterpCheckBefore
8508 EXPORT_PC
8509 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8510 adr lr, artMterpAsmInstructionStart + (69 * 128) // Addr of primary handler.
8511 mov x0, xSELF
8512 add x1, xFP, #OFF_FP_SHADOWFRAME
8513 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8514
8515/* ------------------------------ */
8516 .balign 128
8517.L_ALT_op_aget_object: /* 0x46 */
8518/* File: arm64/alt_stub.S */
8519/*
8520 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8521 * any interesting requests and then jump to the real instruction
8522 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8523 */
8524 .extern MterpCheckBefore
8525 EXPORT_PC
8526 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8527 adr lr, artMterpAsmInstructionStart + (70 * 128) // Addr of primary handler.
8528 mov x0, xSELF
8529 add x1, xFP, #OFF_FP_SHADOWFRAME
8530 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8531
8532/* ------------------------------ */
8533 .balign 128
8534.L_ALT_op_aget_boolean: /* 0x47 */
8535/* File: arm64/alt_stub.S */
8536/*
8537 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8538 * any interesting requests and then jump to the real instruction
8539 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8540 */
8541 .extern MterpCheckBefore
8542 EXPORT_PC
8543 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8544 adr lr, artMterpAsmInstructionStart + (71 * 128) // Addr of primary handler.
8545 mov x0, xSELF
8546 add x1, xFP, #OFF_FP_SHADOWFRAME
8547 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8548
8549/* ------------------------------ */
8550 .balign 128
8551.L_ALT_op_aget_byte: /* 0x48 */
8552/* File: arm64/alt_stub.S */
8553/*
8554 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8555 * any interesting requests and then jump to the real instruction
8556 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8557 */
8558 .extern MterpCheckBefore
8559 EXPORT_PC
8560 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8561 adr lr, artMterpAsmInstructionStart + (72 * 128) // Addr of primary handler.
8562 mov x0, xSELF
8563 add x1, xFP, #OFF_FP_SHADOWFRAME
8564 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8565
8566/* ------------------------------ */
8567 .balign 128
8568.L_ALT_op_aget_char: /* 0x49 */
8569/* File: arm64/alt_stub.S */
8570/*
8571 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8572 * any interesting requests and then jump to the real instruction
8573 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8574 */
8575 .extern MterpCheckBefore
8576 EXPORT_PC
8577 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8578 adr lr, artMterpAsmInstructionStart + (73 * 128) // Addr of primary handler.
8579 mov x0, xSELF
8580 add x1, xFP, #OFF_FP_SHADOWFRAME
8581 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8582
8583/* ------------------------------ */
8584 .balign 128
8585.L_ALT_op_aget_short: /* 0x4a */
8586/* File: arm64/alt_stub.S */
8587/*
8588 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8589 * any interesting requests and then jump to the real instruction
8590 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8591 */
8592 .extern MterpCheckBefore
8593 EXPORT_PC
8594 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8595 adr lr, artMterpAsmInstructionStart + (74 * 128) // Addr of primary handler.
8596 mov x0, xSELF
8597 add x1, xFP, #OFF_FP_SHADOWFRAME
8598 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8599
8600/* ------------------------------ */
8601 .balign 128
8602.L_ALT_op_aput: /* 0x4b */
8603/* File: arm64/alt_stub.S */
8604/*
8605 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8606 * any interesting requests and then jump to the real instruction
8607 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8608 */
8609 .extern MterpCheckBefore
8610 EXPORT_PC
8611 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8612 adr lr, artMterpAsmInstructionStart + (75 * 128) // Addr of primary handler.
8613 mov x0, xSELF
8614 add x1, xFP, #OFF_FP_SHADOWFRAME
8615 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8616
8617/* ------------------------------ */
8618 .balign 128
8619.L_ALT_op_aput_wide: /* 0x4c */
8620/* File: arm64/alt_stub.S */
8621/*
8622 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8623 * any interesting requests and then jump to the real instruction
8624 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8625 */
8626 .extern MterpCheckBefore
8627 EXPORT_PC
8628 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8629 adr lr, artMterpAsmInstructionStart + (76 * 128) // Addr of primary handler.
8630 mov x0, xSELF
8631 add x1, xFP, #OFF_FP_SHADOWFRAME
8632 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8633
8634/* ------------------------------ */
8635 .balign 128
8636.L_ALT_op_aput_object: /* 0x4d */
8637/* File: arm64/alt_stub.S */
8638/*
8639 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8640 * any interesting requests and then jump to the real instruction
8641 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8642 */
8643 .extern MterpCheckBefore
8644 EXPORT_PC
8645 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8646 adr lr, artMterpAsmInstructionStart + (77 * 128) // Addr of primary handler.
8647 mov x0, xSELF
8648 add x1, xFP, #OFF_FP_SHADOWFRAME
8649 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8650
8651/* ------------------------------ */
8652 .balign 128
8653.L_ALT_op_aput_boolean: /* 0x4e */
8654/* File: arm64/alt_stub.S */
8655/*
8656 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8657 * any interesting requests and then jump to the real instruction
8658 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8659 */
8660 .extern MterpCheckBefore
8661 EXPORT_PC
8662 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8663 adr lr, artMterpAsmInstructionStart + (78 * 128) // Addr of primary handler.
8664 mov x0, xSELF
8665 add x1, xFP, #OFF_FP_SHADOWFRAME
8666 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8667
8668/* ------------------------------ */
8669 .balign 128
8670.L_ALT_op_aput_byte: /* 0x4f */
8671/* File: arm64/alt_stub.S */
8672/*
8673 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8674 * any interesting requests and then jump to the real instruction
8675 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8676 */
8677 .extern MterpCheckBefore
8678 EXPORT_PC
8679 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8680 adr lr, artMterpAsmInstructionStart + (79 * 128) // Addr of primary handler.
8681 mov x0, xSELF
8682 add x1, xFP, #OFF_FP_SHADOWFRAME
8683 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8684
8685/* ------------------------------ */
8686 .balign 128
8687.L_ALT_op_aput_char: /* 0x50 */
8688/* File: arm64/alt_stub.S */
8689/*
8690 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8691 * any interesting requests and then jump to the real instruction
8692 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8693 */
8694 .extern MterpCheckBefore
8695 EXPORT_PC
8696 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8697 adr lr, artMterpAsmInstructionStart + (80 * 128) // Addr of primary handler.
8698 mov x0, xSELF
8699 add x1, xFP, #OFF_FP_SHADOWFRAME
8700 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8701
8702/* ------------------------------ */
8703 .balign 128
8704.L_ALT_op_aput_short: /* 0x51 */
8705/* File: arm64/alt_stub.S */
8706/*
8707 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8708 * any interesting requests and then jump to the real instruction
8709 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8710 */
8711 .extern MterpCheckBefore
8712 EXPORT_PC
8713 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8714 adr lr, artMterpAsmInstructionStart + (81 * 128) // Addr of primary handler.
8715 mov x0, xSELF
8716 add x1, xFP, #OFF_FP_SHADOWFRAME
8717 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8718
8719/* ------------------------------ */
8720 .balign 128
8721.L_ALT_op_iget: /* 0x52 */
8722/* File: arm64/alt_stub.S */
8723/*
8724 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8725 * any interesting requests and then jump to the real instruction
8726 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8727 */
8728 .extern MterpCheckBefore
8729 EXPORT_PC
8730 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8731 adr lr, artMterpAsmInstructionStart + (82 * 128) // Addr of primary handler.
8732 mov x0, xSELF
8733 add x1, xFP, #OFF_FP_SHADOWFRAME
8734 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8735
8736/* ------------------------------ */
8737 .balign 128
8738.L_ALT_op_iget_wide: /* 0x53 */
8739/* File: arm64/alt_stub.S */
8740/*
8741 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8742 * any interesting requests and then jump to the real instruction
8743 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8744 */
8745 .extern MterpCheckBefore
8746 EXPORT_PC
8747 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8748 adr lr, artMterpAsmInstructionStart + (83 * 128) // Addr of primary handler.
8749 mov x0, xSELF
8750 add x1, xFP, #OFF_FP_SHADOWFRAME
8751 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8752
8753/* ------------------------------ */
8754 .balign 128
8755.L_ALT_op_iget_object: /* 0x54 */
8756/* File: arm64/alt_stub.S */
8757/*
8758 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8759 * any interesting requests and then jump to the real instruction
8760 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8761 */
8762 .extern MterpCheckBefore
8763 EXPORT_PC
8764 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8765 adr lr, artMterpAsmInstructionStart + (84 * 128) // Addr of primary handler.
8766 mov x0, xSELF
8767 add x1, xFP, #OFF_FP_SHADOWFRAME
8768 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8769
8770/* ------------------------------ */
8771 .balign 128
8772.L_ALT_op_iget_boolean: /* 0x55 */
8773/* File: arm64/alt_stub.S */
8774/*
8775 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8776 * any interesting requests and then jump to the real instruction
8777 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8778 */
8779 .extern MterpCheckBefore
8780 EXPORT_PC
8781 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8782 adr lr, artMterpAsmInstructionStart + (85 * 128) // Addr of primary handler.
8783 mov x0, xSELF
8784 add x1, xFP, #OFF_FP_SHADOWFRAME
8785 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8786
8787/* ------------------------------ */
8788 .balign 128
8789.L_ALT_op_iget_byte: /* 0x56 */
8790/* File: arm64/alt_stub.S */
8791/*
8792 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8793 * any interesting requests and then jump to the real instruction
8794 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8795 */
8796 .extern MterpCheckBefore
8797 EXPORT_PC
8798 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8799 adr lr, artMterpAsmInstructionStart + (86 * 128) // Addr of primary handler.
8800 mov x0, xSELF
8801 add x1, xFP, #OFF_FP_SHADOWFRAME
8802 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8803
8804/* ------------------------------ */
8805 .balign 128
8806.L_ALT_op_iget_char: /* 0x57 */
8807/* File: arm64/alt_stub.S */
8808/*
8809 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8810 * any interesting requests and then jump to the real instruction
8811 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8812 */
8813 .extern MterpCheckBefore
8814 EXPORT_PC
8815 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8816 adr lr, artMterpAsmInstructionStart + (87 * 128) // Addr of primary handler.
8817 mov x0, xSELF
8818 add x1, xFP, #OFF_FP_SHADOWFRAME
8819 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8820
8821/* ------------------------------ */
8822 .balign 128
8823.L_ALT_op_iget_short: /* 0x58 */
8824/* File: arm64/alt_stub.S */
8825/*
8826 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8827 * any interesting requests and then jump to the real instruction
8828 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8829 */
8830 .extern MterpCheckBefore
8831 EXPORT_PC
8832 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8833 adr lr, artMterpAsmInstructionStart + (88 * 128) // Addr of primary handler.
8834 mov x0, xSELF
8835 add x1, xFP, #OFF_FP_SHADOWFRAME
8836 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8837
8838/* ------------------------------ */
8839 .balign 128
8840.L_ALT_op_iput: /* 0x59 */
8841/* File: arm64/alt_stub.S */
8842/*
8843 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8844 * any interesting requests and then jump to the real instruction
8845 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8846 */
8847 .extern MterpCheckBefore
8848 EXPORT_PC
8849 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8850 adr lr, artMterpAsmInstructionStart + (89 * 128) // Addr of primary handler.
8851 mov x0, xSELF
8852 add x1, xFP, #OFF_FP_SHADOWFRAME
8853 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8854
8855/* ------------------------------ */
8856 .balign 128
8857.L_ALT_op_iput_wide: /* 0x5a */
8858/* File: arm64/alt_stub.S */
8859/*
8860 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8861 * any interesting requests and then jump to the real instruction
8862 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8863 */
8864 .extern MterpCheckBefore
8865 EXPORT_PC
8866 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8867 adr lr, artMterpAsmInstructionStart + (90 * 128) // Addr of primary handler.
8868 mov x0, xSELF
8869 add x1, xFP, #OFF_FP_SHADOWFRAME
8870 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8871
8872/* ------------------------------ */
8873 .balign 128
8874.L_ALT_op_iput_object: /* 0x5b */
8875/* File: arm64/alt_stub.S */
8876/*
8877 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8878 * any interesting requests and then jump to the real instruction
8879 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8880 */
8881 .extern MterpCheckBefore
8882 EXPORT_PC
8883 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8884 adr lr, artMterpAsmInstructionStart + (91 * 128) // Addr of primary handler.
8885 mov x0, xSELF
8886 add x1, xFP, #OFF_FP_SHADOWFRAME
8887 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8888
8889/* ------------------------------ */
8890 .balign 128
8891.L_ALT_op_iput_boolean: /* 0x5c */
8892/* File: arm64/alt_stub.S */
8893/*
8894 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8895 * any interesting requests and then jump to the real instruction
8896 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8897 */
8898 .extern MterpCheckBefore
8899 EXPORT_PC
8900 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8901 adr lr, artMterpAsmInstructionStart + (92 * 128) // Addr of primary handler.
8902 mov x0, xSELF
8903 add x1, xFP, #OFF_FP_SHADOWFRAME
8904 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8905
8906/* ------------------------------ */
8907 .balign 128
8908.L_ALT_op_iput_byte: /* 0x5d */
8909/* File: arm64/alt_stub.S */
8910/*
8911 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8912 * any interesting requests and then jump to the real instruction
8913 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8914 */
8915 .extern MterpCheckBefore
8916 EXPORT_PC
8917 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8918 adr lr, artMterpAsmInstructionStart + (93 * 128) // Addr of primary handler.
8919 mov x0, xSELF
8920 add x1, xFP, #OFF_FP_SHADOWFRAME
8921 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8922
8923/* ------------------------------ */
8924 .balign 128
8925.L_ALT_op_iput_char: /* 0x5e */
8926/* File: arm64/alt_stub.S */
8927/*
8928 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8929 * any interesting requests and then jump to the real instruction
8930 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8931 */
8932 .extern MterpCheckBefore
8933 EXPORT_PC
8934 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8935 adr lr, artMterpAsmInstructionStart + (94 * 128) // Addr of primary handler.
8936 mov x0, xSELF
8937 add x1, xFP, #OFF_FP_SHADOWFRAME
8938 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8939
8940/* ------------------------------ */
8941 .balign 128
8942.L_ALT_op_iput_short: /* 0x5f */
8943/* File: arm64/alt_stub.S */
8944/*
8945 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8946 * any interesting requests and then jump to the real instruction
8947 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8948 */
8949 .extern MterpCheckBefore
8950 EXPORT_PC
8951 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8952 adr lr, artMterpAsmInstructionStart + (95 * 128) // Addr of primary handler.
8953 mov x0, xSELF
8954 add x1, xFP, #OFF_FP_SHADOWFRAME
8955 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8956
8957/* ------------------------------ */
8958 .balign 128
8959.L_ALT_op_sget: /* 0x60 */
8960/* File: arm64/alt_stub.S */
8961/*
8962 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8963 * any interesting requests and then jump to the real instruction
8964 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8965 */
8966 .extern MterpCheckBefore
8967 EXPORT_PC
8968 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8969 adr lr, artMterpAsmInstructionStart + (96 * 128) // Addr of primary handler.
8970 mov x0, xSELF
8971 add x1, xFP, #OFF_FP_SHADOWFRAME
8972 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8973
8974/* ------------------------------ */
8975 .balign 128
8976.L_ALT_op_sget_wide: /* 0x61 */
8977/* File: arm64/alt_stub.S */
8978/*
8979 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8980 * any interesting requests and then jump to the real instruction
8981 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8982 */
8983 .extern MterpCheckBefore
8984 EXPORT_PC
8985 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8986 adr lr, artMterpAsmInstructionStart + (97 * 128) // Addr of primary handler.
8987 mov x0, xSELF
8988 add x1, xFP, #OFF_FP_SHADOWFRAME
8989 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8990
8991/* ------------------------------ */
8992 .balign 128
8993.L_ALT_op_sget_object: /* 0x62 */
8994/* File: arm64/alt_stub.S */
8995/*
8996 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8997 * any interesting requests and then jump to the real instruction
8998 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8999 */
9000 .extern MterpCheckBefore
9001 EXPORT_PC
9002 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9003 adr lr, artMterpAsmInstructionStart + (98 * 128) // Addr of primary handler.
9004 mov x0, xSELF
9005 add x1, xFP, #OFF_FP_SHADOWFRAME
9006 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9007
9008/* ------------------------------ */
9009 .balign 128
9010.L_ALT_op_sget_boolean: /* 0x63 */
9011/* File: arm64/alt_stub.S */
9012/*
9013 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9014 * any interesting requests and then jump to the real instruction
9015 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9016 */
9017 .extern MterpCheckBefore
9018 EXPORT_PC
9019 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9020 adr lr, artMterpAsmInstructionStart + (99 * 128) // Addr of primary handler.
9021 mov x0, xSELF
9022 add x1, xFP, #OFF_FP_SHADOWFRAME
9023 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9024
9025/* ------------------------------ */
9026 .balign 128
9027.L_ALT_op_sget_byte: /* 0x64 */
9028/* File: arm64/alt_stub.S */
9029/*
9030 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9031 * any interesting requests and then jump to the real instruction
9032 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9033 */
9034 .extern MterpCheckBefore
9035 EXPORT_PC
9036 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9037 adr lr, artMterpAsmInstructionStart + (100 * 128) // Addr of primary handler.
9038 mov x0, xSELF
9039 add x1, xFP, #OFF_FP_SHADOWFRAME
9040 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9041
9042/* ------------------------------ */
9043 .balign 128
9044.L_ALT_op_sget_char: /* 0x65 */
9045/* File: arm64/alt_stub.S */
9046/*
9047 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9048 * any interesting requests and then jump to the real instruction
9049 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9050 */
9051 .extern MterpCheckBefore
9052 EXPORT_PC
9053 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9054 adr lr, artMterpAsmInstructionStart + (101 * 128) // Addr of primary handler.
9055 mov x0, xSELF
9056 add x1, xFP, #OFF_FP_SHADOWFRAME
9057 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9058
9059/* ------------------------------ */
9060 .balign 128
9061.L_ALT_op_sget_short: /* 0x66 */
9062/* File: arm64/alt_stub.S */
9063/*
9064 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9065 * any interesting requests and then jump to the real instruction
9066 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9067 */
9068 .extern MterpCheckBefore
9069 EXPORT_PC
9070 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9071 adr lr, artMterpAsmInstructionStart + (102 * 128) // Addr of primary handler.
9072 mov x0, xSELF
9073 add x1, xFP, #OFF_FP_SHADOWFRAME
9074 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9075
9076/* ------------------------------ */
9077 .balign 128
9078.L_ALT_op_sput: /* 0x67 */
9079/* File: arm64/alt_stub.S */
9080/*
9081 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9082 * any interesting requests and then jump to the real instruction
9083 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9084 */
9085 .extern MterpCheckBefore
9086 EXPORT_PC
9087 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9088 adr lr, artMterpAsmInstructionStart + (103 * 128) // Addr of primary handler.
9089 mov x0, xSELF
9090 add x1, xFP, #OFF_FP_SHADOWFRAME
9091 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9092
9093/* ------------------------------ */
9094 .balign 128
9095.L_ALT_op_sput_wide: /* 0x68 */
9096/* File: arm64/alt_stub.S */
9097/*
9098 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9099 * any interesting requests and then jump to the real instruction
9100 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9101 */
9102 .extern MterpCheckBefore
9103 EXPORT_PC
9104 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9105 adr lr, artMterpAsmInstructionStart + (104 * 128) // Addr of primary handler.
9106 mov x0, xSELF
9107 add x1, xFP, #OFF_FP_SHADOWFRAME
9108 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9109
9110/* ------------------------------ */
9111 .balign 128
9112.L_ALT_op_sput_object: /* 0x69 */
9113/* File: arm64/alt_stub.S */
9114/*
9115 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9116 * any interesting requests and then jump to the real instruction
9117 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9118 */
9119 .extern MterpCheckBefore
9120 EXPORT_PC
9121 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9122 adr lr, artMterpAsmInstructionStart + (105 * 128) // Addr of primary handler.
9123 mov x0, xSELF
9124 add x1, xFP, #OFF_FP_SHADOWFRAME
9125 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9126
9127/* ------------------------------ */
9128 .balign 128
9129.L_ALT_op_sput_boolean: /* 0x6a */
9130/* File: arm64/alt_stub.S */
9131/*
9132 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9133 * any interesting requests and then jump to the real instruction
9134 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9135 */
9136 .extern MterpCheckBefore
9137 EXPORT_PC
9138 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9139 adr lr, artMterpAsmInstructionStart + (106 * 128) // Addr of primary handler.
9140 mov x0, xSELF
9141 add x1, xFP, #OFF_FP_SHADOWFRAME
9142 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9143
9144/* ------------------------------ */
9145 .balign 128
9146.L_ALT_op_sput_byte: /* 0x6b */
9147/* File: arm64/alt_stub.S */
9148/*
9149 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9150 * any interesting requests and then jump to the real instruction
9151 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9152 */
9153 .extern MterpCheckBefore
9154 EXPORT_PC
9155 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9156 adr lr, artMterpAsmInstructionStart + (107 * 128) // Addr of primary handler.
9157 mov x0, xSELF
9158 add x1, xFP, #OFF_FP_SHADOWFRAME
9159 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9160
9161/* ------------------------------ */
9162 .balign 128
9163.L_ALT_op_sput_char: /* 0x6c */
9164/* File: arm64/alt_stub.S */
9165/*
9166 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9167 * any interesting requests and then jump to the real instruction
9168 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9169 */
9170 .extern MterpCheckBefore
9171 EXPORT_PC
9172 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9173 adr lr, artMterpAsmInstructionStart + (108 * 128) // Addr of primary handler.
9174 mov x0, xSELF
9175 add x1, xFP, #OFF_FP_SHADOWFRAME
9176 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9177
9178/* ------------------------------ */
9179 .balign 128
9180.L_ALT_op_sput_short: /* 0x6d */
9181/* File: arm64/alt_stub.S */
9182/*
9183 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9184 * any interesting requests and then jump to the real instruction
9185 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9186 */
9187 .extern MterpCheckBefore
9188 EXPORT_PC
9189 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9190 adr lr, artMterpAsmInstructionStart + (109 * 128) // Addr of primary handler.
9191 mov x0, xSELF
9192 add x1, xFP, #OFF_FP_SHADOWFRAME
9193 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9194
9195/* ------------------------------ */
9196 .balign 128
9197.L_ALT_op_invoke_virtual: /* 0x6e */
9198/* File: arm64/alt_stub.S */
9199/*
9200 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9201 * any interesting requests and then jump to the real instruction
9202 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9203 */
9204 .extern MterpCheckBefore
9205 EXPORT_PC
9206 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9207 adr lr, artMterpAsmInstructionStart + (110 * 128) // Addr of primary handler.
9208 mov x0, xSELF
9209 add x1, xFP, #OFF_FP_SHADOWFRAME
9210 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9211
9212/* ------------------------------ */
9213 .balign 128
9214.L_ALT_op_invoke_super: /* 0x6f */
9215/* File: arm64/alt_stub.S */
9216/*
9217 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9218 * any interesting requests and then jump to the real instruction
9219 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9220 */
9221 .extern MterpCheckBefore
9222 EXPORT_PC
9223 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9224 adr lr, artMterpAsmInstructionStart + (111 * 128) // Addr of primary handler.
9225 mov x0, xSELF
9226 add x1, xFP, #OFF_FP_SHADOWFRAME
9227 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9228
9229/* ------------------------------ */
9230 .balign 128
9231.L_ALT_op_invoke_direct: /* 0x70 */
9232/* File: arm64/alt_stub.S */
9233/*
9234 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9235 * any interesting requests and then jump to the real instruction
9236 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9237 */
9238 .extern MterpCheckBefore
9239 EXPORT_PC
9240 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9241 adr lr, artMterpAsmInstructionStart + (112 * 128) // Addr of primary handler.
9242 mov x0, xSELF
9243 add x1, xFP, #OFF_FP_SHADOWFRAME
9244 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9245
9246/* ------------------------------ */
9247 .balign 128
9248.L_ALT_op_invoke_static: /* 0x71 */
9249/* File: arm64/alt_stub.S */
9250/*
9251 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9252 * any interesting requests and then jump to the real instruction
9253 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9254 */
9255 .extern MterpCheckBefore
9256 EXPORT_PC
9257 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9258 adr lr, artMterpAsmInstructionStart + (113 * 128) // Addr of primary handler.
9259 mov x0, xSELF
9260 add x1, xFP, #OFF_FP_SHADOWFRAME
9261 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9262
9263/* ------------------------------ */
9264 .balign 128
9265.L_ALT_op_invoke_interface: /* 0x72 */
9266/* File: arm64/alt_stub.S */
9267/*
9268 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9269 * any interesting requests and then jump to the real instruction
9270 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9271 */
9272 .extern MterpCheckBefore
9273 EXPORT_PC
9274 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9275 adr lr, artMterpAsmInstructionStart + (114 * 128) // Addr of primary handler.
9276 mov x0, xSELF
9277 add x1, xFP, #OFF_FP_SHADOWFRAME
9278 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9279
9280/* ------------------------------ */
9281 .balign 128
9282.L_ALT_op_return_void_no_barrier: /* 0x73 */
9283/* File: arm64/alt_stub.S */
9284/*
9285 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9286 * any interesting requests and then jump to the real instruction
9287 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9288 */
9289 .extern MterpCheckBefore
9290 EXPORT_PC
9291 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9292 adr lr, artMterpAsmInstructionStart + (115 * 128) // Addr of primary handler.
9293 mov x0, xSELF
9294 add x1, xFP, #OFF_FP_SHADOWFRAME
9295 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9296
9297/* ------------------------------ */
9298 .balign 128
9299.L_ALT_op_invoke_virtual_range: /* 0x74 */
9300/* File: arm64/alt_stub.S */
9301/*
9302 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9303 * any interesting requests and then jump to the real instruction
9304 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9305 */
9306 .extern MterpCheckBefore
9307 EXPORT_PC
9308 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9309 adr lr, artMterpAsmInstructionStart + (116 * 128) // Addr of primary handler.
9310 mov x0, xSELF
9311 add x1, xFP, #OFF_FP_SHADOWFRAME
9312 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9313
9314/* ------------------------------ */
9315 .balign 128
9316.L_ALT_op_invoke_super_range: /* 0x75 */
9317/* File: arm64/alt_stub.S */
9318/*
9319 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9320 * any interesting requests and then jump to the real instruction
9321 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9322 */
9323 .extern MterpCheckBefore
9324 EXPORT_PC
9325 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9326 adr lr, artMterpAsmInstructionStart + (117 * 128) // Addr of primary handler.
9327 mov x0, xSELF
9328 add x1, xFP, #OFF_FP_SHADOWFRAME
9329 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9330
9331/* ------------------------------ */
9332 .balign 128
9333.L_ALT_op_invoke_direct_range: /* 0x76 */
9334/* File: arm64/alt_stub.S */
9335/*
9336 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9337 * any interesting requests and then jump to the real instruction
9338 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9339 */
9340 .extern MterpCheckBefore
9341 EXPORT_PC
9342 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9343 adr lr, artMterpAsmInstructionStart + (118 * 128) // Addr of primary handler.
9344 mov x0, xSELF
9345 add x1, xFP, #OFF_FP_SHADOWFRAME
9346 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9347
9348/* ------------------------------ */
9349 .balign 128
9350.L_ALT_op_invoke_static_range: /* 0x77 */
9351/* File: arm64/alt_stub.S */
9352/*
9353 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9354 * any interesting requests and then jump to the real instruction
9355 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9356 */
9357 .extern MterpCheckBefore
9358 EXPORT_PC
9359 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9360 adr lr, artMterpAsmInstructionStart + (119 * 128) // Addr of primary handler.
9361 mov x0, xSELF
9362 add x1, xFP, #OFF_FP_SHADOWFRAME
9363 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9364
9365/* ------------------------------ */
9366 .balign 128
9367.L_ALT_op_invoke_interface_range: /* 0x78 */
9368/* File: arm64/alt_stub.S */
9369/*
9370 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9371 * any interesting requests and then jump to the real instruction
9372 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9373 */
9374 .extern MterpCheckBefore
9375 EXPORT_PC
9376 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9377 adr lr, artMterpAsmInstructionStart + (120 * 128) // Addr of primary handler.
9378 mov x0, xSELF
9379 add x1, xFP, #OFF_FP_SHADOWFRAME
9380 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9381
9382/* ------------------------------ */
9383 .balign 128
9384.L_ALT_op_unused_79: /* 0x79 */
9385/* File: arm64/alt_stub.S */
9386/*
9387 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9388 * any interesting requests and then jump to the real instruction
9389 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9390 */
9391 .extern MterpCheckBefore
9392 EXPORT_PC
9393 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9394 adr lr, artMterpAsmInstructionStart + (121 * 128) // Addr of primary handler.
9395 mov x0, xSELF
9396 add x1, xFP, #OFF_FP_SHADOWFRAME
9397 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9398
9399/* ------------------------------ */
9400 .balign 128
9401.L_ALT_op_unused_7a: /* 0x7a */
9402/* File: arm64/alt_stub.S */
9403/*
9404 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9405 * any interesting requests and then jump to the real instruction
9406 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9407 */
9408 .extern MterpCheckBefore
9409 EXPORT_PC
9410 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9411 adr lr, artMterpAsmInstructionStart + (122 * 128) // Addr of primary handler.
9412 mov x0, xSELF
9413 add x1, xFP, #OFF_FP_SHADOWFRAME
9414 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9415
9416/* ------------------------------ */
9417 .balign 128
9418.L_ALT_op_neg_int: /* 0x7b */
9419/* File: arm64/alt_stub.S */
9420/*
9421 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9422 * any interesting requests and then jump to the real instruction
9423 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9424 */
9425 .extern MterpCheckBefore
9426 EXPORT_PC
9427 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9428 adr lr, artMterpAsmInstructionStart + (123 * 128) // Addr of primary handler.
9429 mov x0, xSELF
9430 add x1, xFP, #OFF_FP_SHADOWFRAME
9431 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9432
9433/* ------------------------------ */
9434 .balign 128
9435.L_ALT_op_not_int: /* 0x7c */
9436/* File: arm64/alt_stub.S */
9437/*
9438 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9439 * any interesting requests and then jump to the real instruction
9440 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9441 */
9442 .extern MterpCheckBefore
9443 EXPORT_PC
9444 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9445 adr lr, artMterpAsmInstructionStart + (124 * 128) // Addr of primary handler.
9446 mov x0, xSELF
9447 add x1, xFP, #OFF_FP_SHADOWFRAME
9448 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9449
9450/* ------------------------------ */
9451 .balign 128
9452.L_ALT_op_neg_long: /* 0x7d */
9453/* File: arm64/alt_stub.S */
9454/*
9455 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9456 * any interesting requests and then jump to the real instruction
9457 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9458 */
9459 .extern MterpCheckBefore
9460 EXPORT_PC
9461 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9462 adr lr, artMterpAsmInstructionStart + (125 * 128) // Addr of primary handler.
9463 mov x0, xSELF
9464 add x1, xFP, #OFF_FP_SHADOWFRAME
9465 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9466
9467/* ------------------------------ */
9468 .balign 128
9469.L_ALT_op_not_long: /* 0x7e */
9470/* File: arm64/alt_stub.S */
9471/*
9472 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9473 * any interesting requests and then jump to the real instruction
9474 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9475 */
9476 .extern MterpCheckBefore
9477 EXPORT_PC
9478 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9479 adr lr, artMterpAsmInstructionStart + (126 * 128) // Addr of primary handler.
9480 mov x0, xSELF
9481 add x1, xFP, #OFF_FP_SHADOWFRAME
9482 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9483
9484/* ------------------------------ */
9485 .balign 128
9486.L_ALT_op_neg_float: /* 0x7f */
9487/* File: arm64/alt_stub.S */
9488/*
9489 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9490 * any interesting requests and then jump to the real instruction
9491 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9492 */
9493 .extern MterpCheckBefore
9494 EXPORT_PC
9495 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9496 adr lr, artMterpAsmInstructionStart + (127 * 128) // Addr of primary handler.
9497 mov x0, xSELF
9498 add x1, xFP, #OFF_FP_SHADOWFRAME
9499 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9500
9501/* ------------------------------ */
9502 .balign 128
9503.L_ALT_op_neg_double: /* 0x80 */
9504/* File: arm64/alt_stub.S */
9505/*
9506 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9507 * any interesting requests and then jump to the real instruction
9508 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9509 */
9510 .extern MterpCheckBefore
9511 EXPORT_PC
9512 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9513 adr lr, artMterpAsmInstructionStart + (128 * 128) // Addr of primary handler.
9514 mov x0, xSELF
9515 add x1, xFP, #OFF_FP_SHADOWFRAME
9516 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9517
9518/* ------------------------------ */
9519 .balign 128
9520.L_ALT_op_int_to_long: /* 0x81 */
9521/* File: arm64/alt_stub.S */
9522/*
9523 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9524 * any interesting requests and then jump to the real instruction
9525 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9526 */
9527 .extern MterpCheckBefore
9528 EXPORT_PC
9529 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9530 adr lr, artMterpAsmInstructionStart + (129 * 128) // Addr of primary handler.
9531 mov x0, xSELF
9532 add x1, xFP, #OFF_FP_SHADOWFRAME
9533 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9534
9535/* ------------------------------ */
9536 .balign 128
9537.L_ALT_op_int_to_float: /* 0x82 */
9538/* File: arm64/alt_stub.S */
9539/*
9540 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9541 * any interesting requests and then jump to the real instruction
9542 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9543 */
9544 .extern MterpCheckBefore
9545 EXPORT_PC
9546 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9547 adr lr, artMterpAsmInstructionStart + (130 * 128) // Addr of primary handler.
9548 mov x0, xSELF
9549 add x1, xFP, #OFF_FP_SHADOWFRAME
9550 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9551
9552/* ------------------------------ */
9553 .balign 128
9554.L_ALT_op_int_to_double: /* 0x83 */
9555/* File: arm64/alt_stub.S */
9556/*
9557 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9558 * any interesting requests and then jump to the real instruction
9559 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9560 */
9561 .extern MterpCheckBefore
9562 EXPORT_PC
9563 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9564 adr lr, artMterpAsmInstructionStart + (131 * 128) // Addr of primary handler.
9565 mov x0, xSELF
9566 add x1, xFP, #OFF_FP_SHADOWFRAME
9567 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9568
9569/* ------------------------------ */
9570 .balign 128
9571.L_ALT_op_long_to_int: /* 0x84 */
9572/* File: arm64/alt_stub.S */
9573/*
9574 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9575 * any interesting requests and then jump to the real instruction
9576 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9577 */
9578 .extern MterpCheckBefore
9579 EXPORT_PC
9580 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9581 adr lr, artMterpAsmInstructionStart + (132 * 128) // Addr of primary handler.
9582 mov x0, xSELF
9583 add x1, xFP, #OFF_FP_SHADOWFRAME
9584 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9585
9586/* ------------------------------ */
9587 .balign 128
9588.L_ALT_op_long_to_float: /* 0x85 */
9589/* File: arm64/alt_stub.S */
9590/*
9591 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9592 * any interesting requests and then jump to the real instruction
9593 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9594 */
9595 .extern MterpCheckBefore
9596 EXPORT_PC
9597 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9598 adr lr, artMterpAsmInstructionStart + (133 * 128) // Addr of primary handler.
9599 mov x0, xSELF
9600 add x1, xFP, #OFF_FP_SHADOWFRAME
9601 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9602
9603/* ------------------------------ */
9604 .balign 128
9605.L_ALT_op_long_to_double: /* 0x86 */
9606/* File: arm64/alt_stub.S */
9607/*
9608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9609 * any interesting requests and then jump to the real instruction
9610 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9611 */
9612 .extern MterpCheckBefore
9613 EXPORT_PC
9614 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9615 adr lr, artMterpAsmInstructionStart + (134 * 128) // Addr of primary handler.
9616 mov x0, xSELF
9617 add x1, xFP, #OFF_FP_SHADOWFRAME
9618 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9619
9620/* ------------------------------ */
9621 .balign 128
9622.L_ALT_op_float_to_int: /* 0x87 */
9623/* File: arm64/alt_stub.S */
9624/*
9625 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9626 * any interesting requests and then jump to the real instruction
9627 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9628 */
9629 .extern MterpCheckBefore
9630 EXPORT_PC
9631 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9632 adr lr, artMterpAsmInstructionStart + (135 * 128) // Addr of primary handler.
9633 mov x0, xSELF
9634 add x1, xFP, #OFF_FP_SHADOWFRAME
9635 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9636
9637/* ------------------------------ */
9638 .balign 128
9639.L_ALT_op_float_to_long: /* 0x88 */
9640/* File: arm64/alt_stub.S */
9641/*
9642 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9643 * any interesting requests and then jump to the real instruction
9644 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9645 */
9646 .extern MterpCheckBefore
9647 EXPORT_PC
9648 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9649 adr lr, artMterpAsmInstructionStart + (136 * 128) // Addr of primary handler.
9650 mov x0, xSELF
9651 add x1, xFP, #OFF_FP_SHADOWFRAME
9652 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9653
9654/* ------------------------------ */
9655 .balign 128
9656.L_ALT_op_float_to_double: /* 0x89 */
9657/* File: arm64/alt_stub.S */
9658/*
9659 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9660 * any interesting requests and then jump to the real instruction
9661 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9662 */
9663 .extern MterpCheckBefore
9664 EXPORT_PC
9665 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9666 adr lr, artMterpAsmInstructionStart + (137 * 128) // Addr of primary handler.
9667 mov x0, xSELF
9668 add x1, xFP, #OFF_FP_SHADOWFRAME
9669 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9670
9671/* ------------------------------ */
9672 .balign 128
9673.L_ALT_op_double_to_int: /* 0x8a */
9674/* File: arm64/alt_stub.S */
9675/*
9676 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9677 * any interesting requests and then jump to the real instruction
9678 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9679 */
9680 .extern MterpCheckBefore
9681 EXPORT_PC
9682 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9683 adr lr, artMterpAsmInstructionStart + (138 * 128) // Addr of primary handler.
9684 mov x0, xSELF
9685 add x1, xFP, #OFF_FP_SHADOWFRAME
9686 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9687
9688/* ------------------------------ */
9689 .balign 128
9690.L_ALT_op_double_to_long: /* 0x8b */
9691/* File: arm64/alt_stub.S */
9692/*
9693 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9694 * any interesting requests and then jump to the real instruction
9695 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9696 */
9697 .extern MterpCheckBefore
9698 EXPORT_PC
9699 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9700 adr lr, artMterpAsmInstructionStart + (139 * 128) // Addr of primary handler.
9701 mov x0, xSELF
9702 add x1, xFP, #OFF_FP_SHADOWFRAME
9703 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9704
9705/* ------------------------------ */
9706 .balign 128
9707.L_ALT_op_double_to_float: /* 0x8c */
9708/* File: arm64/alt_stub.S */
9709/*
9710 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9711 * any interesting requests and then jump to the real instruction
9712 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9713 */
9714 .extern MterpCheckBefore
9715 EXPORT_PC
9716 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9717 adr lr, artMterpAsmInstructionStart + (140 * 128) // Addr of primary handler.
9718 mov x0, xSELF
9719 add x1, xFP, #OFF_FP_SHADOWFRAME
9720 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9721
9722/* ------------------------------ */
9723 .balign 128
9724.L_ALT_op_int_to_byte: /* 0x8d */
9725/* File: arm64/alt_stub.S */
9726/*
9727 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9728 * any interesting requests and then jump to the real instruction
9729 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9730 */
9731 .extern MterpCheckBefore
9732 EXPORT_PC
9733 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9734 adr lr, artMterpAsmInstructionStart + (141 * 128) // Addr of primary handler.
9735 mov x0, xSELF
9736 add x1, xFP, #OFF_FP_SHADOWFRAME
9737 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9738
9739/* ------------------------------ */
9740 .balign 128
9741.L_ALT_op_int_to_char: /* 0x8e */
9742/* File: arm64/alt_stub.S */
9743/*
9744 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9745 * any interesting requests and then jump to the real instruction
9746 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9747 */
9748 .extern MterpCheckBefore
9749 EXPORT_PC
9750 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9751 adr lr, artMterpAsmInstructionStart + (142 * 128) // Addr of primary handler.
9752 mov x0, xSELF
9753 add x1, xFP, #OFF_FP_SHADOWFRAME
9754 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9755
9756/* ------------------------------ */
9757 .balign 128
9758.L_ALT_op_int_to_short: /* 0x8f */
9759/* File: arm64/alt_stub.S */
9760/*
9761 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9762 * any interesting requests and then jump to the real instruction
9763 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9764 */
9765 .extern MterpCheckBefore
9766 EXPORT_PC
9767 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9768 adr lr, artMterpAsmInstructionStart + (143 * 128) // Addr of primary handler.
9769 mov x0, xSELF
9770 add x1, xFP, #OFF_FP_SHADOWFRAME
9771 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9772
9773/* ------------------------------ */
9774 .balign 128
9775.L_ALT_op_add_int: /* 0x90 */
9776/* File: arm64/alt_stub.S */
9777/*
9778 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9779 * any interesting requests and then jump to the real instruction
9780 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9781 */
9782 .extern MterpCheckBefore
9783 EXPORT_PC
9784 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9785 adr lr, artMterpAsmInstructionStart + (144 * 128) // Addr of primary handler.
9786 mov x0, xSELF
9787 add x1, xFP, #OFF_FP_SHADOWFRAME
9788 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9789
9790/* ------------------------------ */
9791 .balign 128
9792.L_ALT_op_sub_int: /* 0x91 */
9793/* File: arm64/alt_stub.S */
9794/*
9795 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9796 * any interesting requests and then jump to the real instruction
9797 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9798 */
9799 .extern MterpCheckBefore
9800 EXPORT_PC
9801 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9802 adr lr, artMterpAsmInstructionStart + (145 * 128) // Addr of primary handler.
9803 mov x0, xSELF
9804 add x1, xFP, #OFF_FP_SHADOWFRAME
9805 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9806
9807/* ------------------------------ */
9808 .balign 128
9809.L_ALT_op_mul_int: /* 0x92 */
9810/* File: arm64/alt_stub.S */
9811/*
9812 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9813 * any interesting requests and then jump to the real instruction
9814 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9815 */
9816 .extern MterpCheckBefore
9817 EXPORT_PC
9818 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9819 adr lr, artMterpAsmInstructionStart + (146 * 128) // Addr of primary handler.
9820 mov x0, xSELF
9821 add x1, xFP, #OFF_FP_SHADOWFRAME
9822 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9823
9824/* ------------------------------ */
9825 .balign 128
9826.L_ALT_op_div_int: /* 0x93 */
9827/* File: arm64/alt_stub.S */
9828/*
9829 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9830 * any interesting requests and then jump to the real instruction
9831 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9832 */
9833 .extern MterpCheckBefore
9834 EXPORT_PC
9835 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9836 adr lr, artMterpAsmInstructionStart + (147 * 128) // Addr of primary handler.
9837 mov x0, xSELF
9838 add x1, xFP, #OFF_FP_SHADOWFRAME
9839 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9840
9841/* ------------------------------ */
9842 .balign 128
9843.L_ALT_op_rem_int: /* 0x94 */
9844/* File: arm64/alt_stub.S */
9845/*
9846 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9847 * any interesting requests and then jump to the real instruction
9848 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9849 */
9850 .extern MterpCheckBefore
9851 EXPORT_PC
9852 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9853 adr lr, artMterpAsmInstructionStart + (148 * 128) // Addr of primary handler.
9854 mov x0, xSELF
9855 add x1, xFP, #OFF_FP_SHADOWFRAME
9856 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9857
9858/* ------------------------------ */
9859 .balign 128
9860.L_ALT_op_and_int: /* 0x95 */
9861/* File: arm64/alt_stub.S */
9862/*
9863 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9864 * any interesting requests and then jump to the real instruction
9865 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9866 */
9867 .extern MterpCheckBefore
9868 EXPORT_PC
9869 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9870 adr lr, artMterpAsmInstructionStart + (149 * 128) // Addr of primary handler.
9871 mov x0, xSELF
9872 add x1, xFP, #OFF_FP_SHADOWFRAME
9873 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9874
9875/* ------------------------------ */
9876 .balign 128
9877.L_ALT_op_or_int: /* 0x96 */
9878/* File: arm64/alt_stub.S */
9879/*
9880 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9881 * any interesting requests and then jump to the real instruction
9882 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9883 */
9884 .extern MterpCheckBefore
9885 EXPORT_PC
9886 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9887 adr lr, artMterpAsmInstructionStart + (150 * 128) // Addr of primary handler.
9888 mov x0, xSELF
9889 add x1, xFP, #OFF_FP_SHADOWFRAME
9890 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9891
9892/* ------------------------------ */
9893 .balign 128
9894.L_ALT_op_xor_int: /* 0x97 */
9895/* File: arm64/alt_stub.S */
9896/*
9897 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9898 * any interesting requests and then jump to the real instruction
9899 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9900 */
9901 .extern MterpCheckBefore
9902 EXPORT_PC
9903 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9904 adr lr, artMterpAsmInstructionStart + (151 * 128) // Addr of primary handler.
9905 mov x0, xSELF
9906 add x1, xFP, #OFF_FP_SHADOWFRAME
9907 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9908
9909/* ------------------------------ */
9910 .balign 128
9911.L_ALT_op_shl_int: /* 0x98 */
9912/* File: arm64/alt_stub.S */
9913/*
9914 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9915 * any interesting requests and then jump to the real instruction
9916 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9917 */
9918 .extern MterpCheckBefore
9919 EXPORT_PC
9920 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9921 adr lr, artMterpAsmInstructionStart + (152 * 128) // Addr of primary handler.
9922 mov x0, xSELF
9923 add x1, xFP, #OFF_FP_SHADOWFRAME
9924 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9925
9926/* ------------------------------ */
9927 .balign 128
9928.L_ALT_op_shr_int: /* 0x99 */
9929/* File: arm64/alt_stub.S */
9930/*
9931 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9932 * any interesting requests and then jump to the real instruction
9933 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9934 */
9935 .extern MterpCheckBefore
9936 EXPORT_PC
9937 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9938 adr lr, artMterpAsmInstructionStart + (153 * 128) // Addr of primary handler.
9939 mov x0, xSELF
9940 add x1, xFP, #OFF_FP_SHADOWFRAME
9941 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9942
9943/* ------------------------------ */
9944 .balign 128
9945.L_ALT_op_ushr_int: /* 0x9a */
9946/* File: arm64/alt_stub.S */
9947/*
9948 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9949 * any interesting requests and then jump to the real instruction
9950 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9951 */
9952 .extern MterpCheckBefore
9953 EXPORT_PC
9954 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9955 adr lr, artMterpAsmInstructionStart + (154 * 128) // Addr of primary handler.
9956 mov x0, xSELF
9957 add x1, xFP, #OFF_FP_SHADOWFRAME
9958 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9959
9960/* ------------------------------ */
9961 .balign 128
9962.L_ALT_op_add_long: /* 0x9b */
9963/* File: arm64/alt_stub.S */
9964/*
9965 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9966 * any interesting requests and then jump to the real instruction
9967 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9968 */
9969 .extern MterpCheckBefore
9970 EXPORT_PC
9971 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9972 adr lr, artMterpAsmInstructionStart + (155 * 128) // Addr of primary handler.
9973 mov x0, xSELF
9974 add x1, xFP, #OFF_FP_SHADOWFRAME
9975 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9976
9977/* ------------------------------ */
9978 .balign 128
9979.L_ALT_op_sub_long: /* 0x9c */
9980/* File: arm64/alt_stub.S */
9981/*
9982 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9983 * any interesting requests and then jump to the real instruction
9984 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9985 */
9986 .extern MterpCheckBefore
9987 EXPORT_PC
9988 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9989 adr lr, artMterpAsmInstructionStart + (156 * 128) // Addr of primary handler.
9990 mov x0, xSELF
9991 add x1, xFP, #OFF_FP_SHADOWFRAME
9992 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9993
9994/* ------------------------------ */
9995 .balign 128
9996.L_ALT_op_mul_long: /* 0x9d */
9997/* File: arm64/alt_stub.S */
9998/*
9999 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10000 * any interesting requests and then jump to the real instruction
10001 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10002 */
10003 .extern MterpCheckBefore
10004 EXPORT_PC
10005 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10006 adr lr, artMterpAsmInstructionStart + (157 * 128) // Addr of primary handler.
10007 mov x0, xSELF
10008 add x1, xFP, #OFF_FP_SHADOWFRAME
10009 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10010
10011/* ------------------------------ */
10012 .balign 128
10013.L_ALT_op_div_long: /* 0x9e */
10014/* File: arm64/alt_stub.S */
10015/*
10016 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10017 * any interesting requests and then jump to the real instruction
10018 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10019 */
10020 .extern MterpCheckBefore
10021 EXPORT_PC
10022 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10023 adr lr, artMterpAsmInstructionStart + (158 * 128) // Addr of primary handler.
10024 mov x0, xSELF
10025 add x1, xFP, #OFF_FP_SHADOWFRAME
10026 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10027
10028/* ------------------------------ */
10029 .balign 128
10030.L_ALT_op_rem_long: /* 0x9f */
10031/* File: arm64/alt_stub.S */
10032/*
10033 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10034 * any interesting requests and then jump to the real instruction
10035 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10036 */
10037 .extern MterpCheckBefore
10038 EXPORT_PC
10039 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10040 adr lr, artMterpAsmInstructionStart + (159 * 128) // Addr of primary handler.
10041 mov x0, xSELF
10042 add x1, xFP, #OFF_FP_SHADOWFRAME
10043 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10044
10045/* ------------------------------ */
10046 .balign 128
10047.L_ALT_op_and_long: /* 0xa0 */
10048/* File: arm64/alt_stub.S */
10049/*
10050 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10051 * any interesting requests and then jump to the real instruction
10052 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10053 */
10054 .extern MterpCheckBefore
10055 EXPORT_PC
10056 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10057 adr lr, artMterpAsmInstructionStart + (160 * 128) // Addr of primary handler.
10058 mov x0, xSELF
10059 add x1, xFP, #OFF_FP_SHADOWFRAME
10060 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10061
10062/* ------------------------------ */
10063 .balign 128
10064.L_ALT_op_or_long: /* 0xa1 */
10065/* File: arm64/alt_stub.S */
10066/*
10067 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10068 * any interesting requests and then jump to the real instruction
10069 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10070 */
10071 .extern MterpCheckBefore
10072 EXPORT_PC
10073 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10074 adr lr, artMterpAsmInstructionStart + (161 * 128) // Addr of primary handler.
10075 mov x0, xSELF
10076 add x1, xFP, #OFF_FP_SHADOWFRAME
10077 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10078
10079/* ------------------------------ */
10080 .balign 128
10081.L_ALT_op_xor_long: /* 0xa2 */
10082/* File: arm64/alt_stub.S */
10083/*
10084 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10085 * any interesting requests and then jump to the real instruction
10086 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10087 */
10088 .extern MterpCheckBefore
10089 EXPORT_PC
10090 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10091 adr lr, artMterpAsmInstructionStart + (162 * 128) // Addr of primary handler.
10092 mov x0, xSELF
10093 add x1, xFP, #OFF_FP_SHADOWFRAME
10094 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10095
10096/* ------------------------------ */
10097 .balign 128
10098.L_ALT_op_shl_long: /* 0xa3 */
10099/* File: arm64/alt_stub.S */
10100/*
10101 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10102 * any interesting requests and then jump to the real instruction
10103 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10104 */
10105 .extern MterpCheckBefore
10106 EXPORT_PC
10107 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10108 adr lr, artMterpAsmInstructionStart + (163 * 128) // Addr of primary handler.
10109 mov x0, xSELF
10110 add x1, xFP, #OFF_FP_SHADOWFRAME
10111 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10112
10113/* ------------------------------ */
10114 .balign 128
10115.L_ALT_op_shr_long: /* 0xa4 */
10116/* File: arm64/alt_stub.S */
10117/*
10118 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10119 * any interesting requests and then jump to the real instruction
10120 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10121 */
10122 .extern MterpCheckBefore
10123 EXPORT_PC
10124 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10125 adr lr, artMterpAsmInstructionStart + (164 * 128) // Addr of primary handler.
10126 mov x0, xSELF
10127 add x1, xFP, #OFF_FP_SHADOWFRAME
10128 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10129
10130/* ------------------------------ */
10131 .balign 128
10132.L_ALT_op_ushr_long: /* 0xa5 */
10133/* File: arm64/alt_stub.S */
10134/*
10135 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10136 * any interesting requests and then jump to the real instruction
10137 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10138 */
10139 .extern MterpCheckBefore
10140 EXPORT_PC
10141 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10142 adr lr, artMterpAsmInstructionStart + (165 * 128) // Addr of primary handler.
10143 mov x0, xSELF
10144 add x1, xFP, #OFF_FP_SHADOWFRAME
10145 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10146
10147/* ------------------------------ */
10148 .balign 128
10149.L_ALT_op_add_float: /* 0xa6 */
10150/* File: arm64/alt_stub.S */
10151/*
10152 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10153 * any interesting requests and then jump to the real instruction
10154 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10155 */
10156 .extern MterpCheckBefore
10157 EXPORT_PC
10158 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10159 adr lr, artMterpAsmInstructionStart + (166 * 128) // Addr of primary handler.
10160 mov x0, xSELF
10161 add x1, xFP, #OFF_FP_SHADOWFRAME
10162 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10163
10164/* ------------------------------ */
10165 .balign 128
10166.L_ALT_op_sub_float: /* 0xa7 */
10167/* File: arm64/alt_stub.S */
10168/*
10169 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10170 * any interesting requests and then jump to the real instruction
10171 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10172 */
10173 .extern MterpCheckBefore
10174 EXPORT_PC
10175 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10176 adr lr, artMterpAsmInstructionStart + (167 * 128) // Addr of primary handler.
10177 mov x0, xSELF
10178 add x1, xFP, #OFF_FP_SHADOWFRAME
10179 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10180
10181/* ------------------------------ */
10182 .balign 128
10183.L_ALT_op_mul_float: /* 0xa8 */
10184/* File: arm64/alt_stub.S */
10185/*
10186 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10187 * any interesting requests and then jump to the real instruction
10188 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10189 */
10190 .extern MterpCheckBefore
10191 EXPORT_PC
10192 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10193 adr lr, artMterpAsmInstructionStart + (168 * 128) // Addr of primary handler.
10194 mov x0, xSELF
10195 add x1, xFP, #OFF_FP_SHADOWFRAME
10196 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10197
10198/* ------------------------------ */
10199 .balign 128
10200.L_ALT_op_div_float: /* 0xa9 */
10201/* File: arm64/alt_stub.S */
10202/*
10203 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10204 * any interesting requests and then jump to the real instruction
10205 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10206 */
10207 .extern MterpCheckBefore
10208 EXPORT_PC
10209 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10210 adr lr, artMterpAsmInstructionStart + (169 * 128) // Addr of primary handler.
10211 mov x0, xSELF
10212 add x1, xFP, #OFF_FP_SHADOWFRAME
10213 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10214
10215/* ------------------------------ */
10216 .balign 128
10217.L_ALT_op_rem_float: /* 0xaa */
10218/* File: arm64/alt_stub.S */
10219/*
10220 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10221 * any interesting requests and then jump to the real instruction
10222 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10223 */
10224 .extern MterpCheckBefore
10225 EXPORT_PC
10226 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10227 adr lr, artMterpAsmInstructionStart + (170 * 128) // Addr of primary handler.
10228 mov x0, xSELF
10229 add x1, xFP, #OFF_FP_SHADOWFRAME
10230 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10231
10232/* ------------------------------ */
10233 .balign 128
10234.L_ALT_op_add_double: /* 0xab */
10235/* File: arm64/alt_stub.S */
10236/*
10237 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10238 * any interesting requests and then jump to the real instruction
10239 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10240 */
10241 .extern MterpCheckBefore
10242 EXPORT_PC
10243 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10244 adr lr, artMterpAsmInstructionStart + (171 * 128) // Addr of primary handler.
10245 mov x0, xSELF
10246 add x1, xFP, #OFF_FP_SHADOWFRAME
10247 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10248
10249/* ------------------------------ */
10250 .balign 128
10251.L_ALT_op_sub_double: /* 0xac */
10252/* File: arm64/alt_stub.S */
10253/*
10254 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10255 * any interesting requests and then jump to the real instruction
10256 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10257 */
10258 .extern MterpCheckBefore
10259 EXPORT_PC
10260 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10261 adr lr, artMterpAsmInstructionStart + (172 * 128) // Addr of primary handler.
10262 mov x0, xSELF
10263 add x1, xFP, #OFF_FP_SHADOWFRAME
10264 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10265
10266/* ------------------------------ */
10267 .balign 128
10268.L_ALT_op_mul_double: /* 0xad */
10269/* File: arm64/alt_stub.S */
10270/*
10271 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10272 * any interesting requests and then jump to the real instruction
10273 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10274 */
10275 .extern MterpCheckBefore
10276 EXPORT_PC
10277 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10278 adr lr, artMterpAsmInstructionStart + (173 * 128) // Addr of primary handler.
10279 mov x0, xSELF
10280 add x1, xFP, #OFF_FP_SHADOWFRAME
10281 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10282
10283/* ------------------------------ */
10284 .balign 128
10285.L_ALT_op_div_double: /* 0xae */
10286/* File: arm64/alt_stub.S */
10287/*
10288 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10289 * any interesting requests and then jump to the real instruction
10290 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10291 */
10292 .extern MterpCheckBefore
10293 EXPORT_PC
10294 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10295 adr lr, artMterpAsmInstructionStart + (174 * 128) // Addr of primary handler.
10296 mov x0, xSELF
10297 add x1, xFP, #OFF_FP_SHADOWFRAME
10298 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10299
10300/* ------------------------------ */
10301 .balign 128
10302.L_ALT_op_rem_double: /* 0xaf */
10303/* File: arm64/alt_stub.S */
10304/*
10305 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10306 * any interesting requests and then jump to the real instruction
10307 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10308 */
10309 .extern MterpCheckBefore
10310 EXPORT_PC
10311 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10312 adr lr, artMterpAsmInstructionStart + (175 * 128) // Addr of primary handler.
10313 mov x0, xSELF
10314 add x1, xFP, #OFF_FP_SHADOWFRAME
10315 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10316
10317/* ------------------------------ */
10318 .balign 128
10319.L_ALT_op_add_int_2addr: /* 0xb0 */
10320/* File: arm64/alt_stub.S */
10321/*
10322 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10323 * any interesting requests and then jump to the real instruction
10324 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10325 */
10326 .extern MterpCheckBefore
10327 EXPORT_PC
10328 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10329 adr lr, artMterpAsmInstructionStart + (176 * 128) // Addr of primary handler.
10330 mov x0, xSELF
10331 add x1, xFP, #OFF_FP_SHADOWFRAME
10332 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10333
10334/* ------------------------------ */
10335 .balign 128
10336.L_ALT_op_sub_int_2addr: /* 0xb1 */
10337/* File: arm64/alt_stub.S */
10338/*
10339 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10340 * any interesting requests and then jump to the real instruction
10341 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10342 */
10343 .extern MterpCheckBefore
10344 EXPORT_PC
10345 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10346 adr lr, artMterpAsmInstructionStart + (177 * 128) // Addr of primary handler.
10347 mov x0, xSELF
10348 add x1, xFP, #OFF_FP_SHADOWFRAME
10349 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10350
10351/* ------------------------------ */
10352 .balign 128
10353.L_ALT_op_mul_int_2addr: /* 0xb2 */
10354/* File: arm64/alt_stub.S */
10355/*
10356 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10357 * any interesting requests and then jump to the real instruction
10358 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10359 */
10360 .extern MterpCheckBefore
10361 EXPORT_PC
10362 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10363 adr lr, artMterpAsmInstructionStart + (178 * 128) // Addr of primary handler.
10364 mov x0, xSELF
10365 add x1, xFP, #OFF_FP_SHADOWFRAME
10366 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10367
10368/* ------------------------------ */
10369 .balign 128
10370.L_ALT_op_div_int_2addr: /* 0xb3 */
10371/* File: arm64/alt_stub.S */
10372/*
10373 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10374 * any interesting requests and then jump to the real instruction
10375 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10376 */
10377 .extern MterpCheckBefore
10378 EXPORT_PC
10379 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10380 adr lr, artMterpAsmInstructionStart + (179 * 128) // Addr of primary handler.
10381 mov x0, xSELF
10382 add x1, xFP, #OFF_FP_SHADOWFRAME
10383 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10384
10385/* ------------------------------ */
10386 .balign 128
10387.L_ALT_op_rem_int_2addr: /* 0xb4 */
10388/* File: arm64/alt_stub.S */
10389/*
10390 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10391 * any interesting requests and then jump to the real instruction
10392 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10393 */
10394 .extern MterpCheckBefore
10395 EXPORT_PC
10396 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10397 adr lr, artMterpAsmInstructionStart + (180 * 128) // Addr of primary handler.
10398 mov x0, xSELF
10399 add x1, xFP, #OFF_FP_SHADOWFRAME
10400 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10401
10402/* ------------------------------ */
10403 .balign 128
10404.L_ALT_op_and_int_2addr: /* 0xb5 */
10405/* File: arm64/alt_stub.S */
10406/*
10407 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10408 * any interesting requests and then jump to the real instruction
10409 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10410 */
10411 .extern MterpCheckBefore
10412 EXPORT_PC
10413 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10414 adr lr, artMterpAsmInstructionStart + (181 * 128) // Addr of primary handler.
10415 mov x0, xSELF
10416 add x1, xFP, #OFF_FP_SHADOWFRAME
10417 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10418
10419/* ------------------------------ */
10420 .balign 128
10421.L_ALT_op_or_int_2addr: /* 0xb6 */
10422/* File: arm64/alt_stub.S */
10423/*
10424 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10425 * any interesting requests and then jump to the real instruction
10426 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10427 */
10428 .extern MterpCheckBefore
10429 EXPORT_PC
10430 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10431 adr lr, artMterpAsmInstructionStart + (182 * 128) // Addr of primary handler.
10432 mov x0, xSELF
10433 add x1, xFP, #OFF_FP_SHADOWFRAME
10434 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10435
10436/* ------------------------------ */
10437 .balign 128
10438.L_ALT_op_xor_int_2addr: /* 0xb7 */
10439/* File: arm64/alt_stub.S */
10440/*
10441 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10442 * any interesting requests and then jump to the real instruction
10443 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10444 */
10445 .extern MterpCheckBefore
10446 EXPORT_PC
10447 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10448 adr lr, artMterpAsmInstructionStart + (183 * 128) // Addr of primary handler.
10449 mov x0, xSELF
10450 add x1, xFP, #OFF_FP_SHADOWFRAME
10451 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10452
10453/* ------------------------------ */
10454 .balign 128
10455.L_ALT_op_shl_int_2addr: /* 0xb8 */
10456/* File: arm64/alt_stub.S */
10457/*
10458 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10459 * any interesting requests and then jump to the real instruction
10460 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10461 */
10462 .extern MterpCheckBefore
10463 EXPORT_PC
10464 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10465 adr lr, artMterpAsmInstructionStart + (184 * 128) // Addr of primary handler.
10466 mov x0, xSELF
10467 add x1, xFP, #OFF_FP_SHADOWFRAME
10468 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10469
10470/* ------------------------------ */
10471 .balign 128
10472.L_ALT_op_shr_int_2addr: /* 0xb9 */
10473/* File: arm64/alt_stub.S */
10474/*
10475 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10476 * any interesting requests and then jump to the real instruction
10477 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10478 */
10479 .extern MterpCheckBefore
10480 EXPORT_PC
10481 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10482 adr lr, artMterpAsmInstructionStart + (185 * 128) // Addr of primary handler.
10483 mov x0, xSELF
10484 add x1, xFP, #OFF_FP_SHADOWFRAME
10485 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10486
10487/* ------------------------------ */
10488 .balign 128
10489.L_ALT_op_ushr_int_2addr: /* 0xba */
10490/* File: arm64/alt_stub.S */
10491/*
10492 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10493 * any interesting requests and then jump to the real instruction
10494 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10495 */
10496 .extern MterpCheckBefore
10497 EXPORT_PC
10498 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10499 adr lr, artMterpAsmInstructionStart + (186 * 128) // Addr of primary handler.
10500 mov x0, xSELF
10501 add x1, xFP, #OFF_FP_SHADOWFRAME
10502 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10503
10504/* ------------------------------ */
10505 .balign 128
10506.L_ALT_op_add_long_2addr: /* 0xbb */
10507/* File: arm64/alt_stub.S */
10508/*
10509 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10510 * any interesting requests and then jump to the real instruction
10511 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10512 */
10513 .extern MterpCheckBefore
10514 EXPORT_PC
10515 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10516 adr lr, artMterpAsmInstructionStart + (187 * 128) // Addr of primary handler.
10517 mov x0, xSELF
10518 add x1, xFP, #OFF_FP_SHADOWFRAME
10519 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10520
10521/* ------------------------------ */
10522 .balign 128
10523.L_ALT_op_sub_long_2addr: /* 0xbc */
10524/* File: arm64/alt_stub.S */
10525/*
10526 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10527 * any interesting requests and then jump to the real instruction
10528 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10529 */
10530 .extern MterpCheckBefore
10531 EXPORT_PC
10532 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10533 adr lr, artMterpAsmInstructionStart + (188 * 128) // Addr of primary handler.
10534 mov x0, xSELF
10535 add x1, xFP, #OFF_FP_SHADOWFRAME
10536 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10537
10538/* ------------------------------ */
10539 .balign 128
10540.L_ALT_op_mul_long_2addr: /* 0xbd */
10541/* File: arm64/alt_stub.S */
10542/*
10543 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10544 * any interesting requests and then jump to the real instruction
10545 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10546 */
10547 .extern MterpCheckBefore
10548 EXPORT_PC
10549 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10550 adr lr, artMterpAsmInstructionStart + (189 * 128) // Addr of primary handler.
10551 mov x0, xSELF
10552 add x1, xFP, #OFF_FP_SHADOWFRAME
10553 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10554
10555/* ------------------------------ */
10556 .balign 128
10557.L_ALT_op_div_long_2addr: /* 0xbe */
10558/* File: arm64/alt_stub.S */
10559/*
10560 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10561 * any interesting requests and then jump to the real instruction
10562 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10563 */
10564 .extern MterpCheckBefore
10565 EXPORT_PC
10566 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10567 adr lr, artMterpAsmInstructionStart + (190 * 128) // Addr of primary handler.
10568 mov x0, xSELF
10569 add x1, xFP, #OFF_FP_SHADOWFRAME
10570 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10571
10572/* ------------------------------ */
10573 .balign 128
10574.L_ALT_op_rem_long_2addr: /* 0xbf */
10575/* File: arm64/alt_stub.S */
10576/*
10577 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10578 * any interesting requests and then jump to the real instruction
10579 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10580 */
10581 .extern MterpCheckBefore
10582 EXPORT_PC
10583 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10584 adr lr, artMterpAsmInstructionStart + (191 * 128) // Addr of primary handler.
10585 mov x0, xSELF
10586 add x1, xFP, #OFF_FP_SHADOWFRAME
10587 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10588
10589/* ------------------------------ */
10590 .balign 128
10591.L_ALT_op_and_long_2addr: /* 0xc0 */
10592/* File: arm64/alt_stub.S */
10593/*
10594 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10595 * any interesting requests and then jump to the real instruction
10596 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10597 */
10598 .extern MterpCheckBefore
10599 EXPORT_PC
10600 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10601 adr lr, artMterpAsmInstructionStart + (192 * 128) // Addr of primary handler.
10602 mov x0, xSELF
10603 add x1, xFP, #OFF_FP_SHADOWFRAME
10604 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10605
10606/* ------------------------------ */
10607 .balign 128
10608.L_ALT_op_or_long_2addr: /* 0xc1 */
10609/* File: arm64/alt_stub.S */
10610/*
10611 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10612 * any interesting requests and then jump to the real instruction
10613 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10614 */
10615 .extern MterpCheckBefore
10616 EXPORT_PC
10617 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10618 adr lr, artMterpAsmInstructionStart + (193 * 128) // Addr of primary handler.
10619 mov x0, xSELF
10620 add x1, xFP, #OFF_FP_SHADOWFRAME
10621 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10622
10623/* ------------------------------ */
10624 .balign 128
10625.L_ALT_op_xor_long_2addr: /* 0xc2 */
10626/* File: arm64/alt_stub.S */
10627/*
10628 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10629 * any interesting requests and then jump to the real instruction
10630 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10631 */
10632 .extern MterpCheckBefore
10633 EXPORT_PC
10634 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10635 adr lr, artMterpAsmInstructionStart + (194 * 128) // Addr of primary handler.
10636 mov x0, xSELF
10637 add x1, xFP, #OFF_FP_SHADOWFRAME
10638 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10639
10640/* ------------------------------ */
10641 .balign 128
10642.L_ALT_op_shl_long_2addr: /* 0xc3 */
10643/* File: arm64/alt_stub.S */
10644/*
10645 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10646 * any interesting requests and then jump to the real instruction
10647 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10648 */
10649 .extern MterpCheckBefore
10650 EXPORT_PC
10651 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10652 adr lr, artMterpAsmInstructionStart + (195 * 128) // Addr of primary handler.
10653 mov x0, xSELF
10654 add x1, xFP, #OFF_FP_SHADOWFRAME
10655 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10656
10657/* ------------------------------ */
10658 .balign 128
10659.L_ALT_op_shr_long_2addr: /* 0xc4 */
10660/* File: arm64/alt_stub.S */
10661/*
10662 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10663 * any interesting requests and then jump to the real instruction
10664 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10665 */
10666 .extern MterpCheckBefore
10667 EXPORT_PC
10668 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10669 adr lr, artMterpAsmInstructionStart + (196 * 128) // Addr of primary handler.
10670 mov x0, xSELF
10671 add x1, xFP, #OFF_FP_SHADOWFRAME
10672 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10673
10674/* ------------------------------ */
10675 .balign 128
10676.L_ALT_op_ushr_long_2addr: /* 0xc5 */
10677/* File: arm64/alt_stub.S */
10678/*
10679 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10680 * any interesting requests and then jump to the real instruction
10681 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10682 */
10683 .extern MterpCheckBefore
10684 EXPORT_PC
10685 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10686 adr lr, artMterpAsmInstructionStart + (197 * 128) // Addr of primary handler.
10687 mov x0, xSELF
10688 add x1, xFP, #OFF_FP_SHADOWFRAME
10689 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10690
10691/* ------------------------------ */
10692 .balign 128
10693.L_ALT_op_add_float_2addr: /* 0xc6 */
10694/* File: arm64/alt_stub.S */
10695/*
10696 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10697 * any interesting requests and then jump to the real instruction
10698 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10699 */
10700 .extern MterpCheckBefore
10701 EXPORT_PC
10702 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10703 adr lr, artMterpAsmInstructionStart + (198 * 128) // Addr of primary handler.
10704 mov x0, xSELF
10705 add x1, xFP, #OFF_FP_SHADOWFRAME
10706 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10707
10708/* ------------------------------ */
10709 .balign 128
10710.L_ALT_op_sub_float_2addr: /* 0xc7 */
10711/* File: arm64/alt_stub.S */
10712/*
10713 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10714 * any interesting requests and then jump to the real instruction
10715 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10716 */
10717 .extern MterpCheckBefore
10718 EXPORT_PC
10719 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10720 adr lr, artMterpAsmInstructionStart + (199 * 128) // Addr of primary handler.
10721 mov x0, xSELF
10722 add x1, xFP, #OFF_FP_SHADOWFRAME
10723 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10724
10725/* ------------------------------ */
10726 .balign 128
10727.L_ALT_op_mul_float_2addr: /* 0xc8 */
10728/* File: arm64/alt_stub.S */
10729/*
10730 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10731 * any interesting requests and then jump to the real instruction
10732 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10733 */
10734 .extern MterpCheckBefore
10735 EXPORT_PC
10736 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10737 adr lr, artMterpAsmInstructionStart + (200 * 128) // Addr of primary handler.
10738 mov x0, xSELF
10739 add x1, xFP, #OFF_FP_SHADOWFRAME
10740 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10741
10742/* ------------------------------ */
10743 .balign 128
10744.L_ALT_op_div_float_2addr: /* 0xc9 */
10745/* File: arm64/alt_stub.S */
10746/*
10747 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10748 * any interesting requests and then jump to the real instruction
10749 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10750 */
10751 .extern MterpCheckBefore
10752 EXPORT_PC
10753 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10754 adr lr, artMterpAsmInstructionStart + (201 * 128) // Addr of primary handler.
10755 mov x0, xSELF
10756 add x1, xFP, #OFF_FP_SHADOWFRAME
10757 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10758
10759/* ------------------------------ */
10760 .balign 128
10761.L_ALT_op_rem_float_2addr: /* 0xca */
10762/* File: arm64/alt_stub.S */
10763/*
10764 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10765 * any interesting requests and then jump to the real instruction
10766 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10767 */
10768 .extern MterpCheckBefore
10769 EXPORT_PC
10770 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10771 adr lr, artMterpAsmInstructionStart + (202 * 128) // Addr of primary handler.
10772 mov x0, xSELF
10773 add x1, xFP, #OFF_FP_SHADOWFRAME
10774 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10775
10776/* ------------------------------ */
10777 .balign 128
10778.L_ALT_op_add_double_2addr: /* 0xcb */
10779/* File: arm64/alt_stub.S */
10780/*
10781 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10782 * any interesting requests and then jump to the real instruction
10783 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10784 */
10785 .extern MterpCheckBefore
10786 EXPORT_PC
10787 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10788 adr lr, artMterpAsmInstructionStart + (203 * 128) // Addr of primary handler.
10789 mov x0, xSELF
10790 add x1, xFP, #OFF_FP_SHADOWFRAME
10791 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10792
10793/* ------------------------------ */
10794 .balign 128
10795.L_ALT_op_sub_double_2addr: /* 0xcc */
10796/* File: arm64/alt_stub.S */
10797/*
10798 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10799 * any interesting requests and then jump to the real instruction
10800 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10801 */
10802 .extern MterpCheckBefore
10803 EXPORT_PC
10804 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10805 adr lr, artMterpAsmInstructionStart + (204 * 128) // Addr of primary handler.
10806 mov x0, xSELF
10807 add x1, xFP, #OFF_FP_SHADOWFRAME
10808 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10809
10810/* ------------------------------ */
10811 .balign 128
10812.L_ALT_op_mul_double_2addr: /* 0xcd */
10813/* File: arm64/alt_stub.S */
10814/*
10815 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10816 * any interesting requests and then jump to the real instruction
10817 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10818 */
10819 .extern MterpCheckBefore
10820 EXPORT_PC
10821 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10822 adr lr, artMterpAsmInstructionStart + (205 * 128) // Addr of primary handler.
10823 mov x0, xSELF
10824 add x1, xFP, #OFF_FP_SHADOWFRAME
10825 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10826
10827/* ------------------------------ */
10828 .balign 128
10829.L_ALT_op_div_double_2addr: /* 0xce */
10830/* File: arm64/alt_stub.S */
10831/*
10832 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10833 * any interesting requests and then jump to the real instruction
10834 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10835 */
10836 .extern MterpCheckBefore
10837 EXPORT_PC
10838 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10839 adr lr, artMterpAsmInstructionStart + (206 * 128) // Addr of primary handler.
10840 mov x0, xSELF
10841 add x1, xFP, #OFF_FP_SHADOWFRAME
10842 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10843
10844/* ------------------------------ */
10845 .balign 128
10846.L_ALT_op_rem_double_2addr: /* 0xcf */
10847/* File: arm64/alt_stub.S */
10848/*
10849 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10850 * any interesting requests and then jump to the real instruction
10851 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10852 */
10853 .extern MterpCheckBefore
10854 EXPORT_PC
10855 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10856 adr lr, artMterpAsmInstructionStart + (207 * 128) // Addr of primary handler.
10857 mov x0, xSELF
10858 add x1, xFP, #OFF_FP_SHADOWFRAME
10859 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10860
10861/* ------------------------------ */
10862 .balign 128
10863.L_ALT_op_add_int_lit16: /* 0xd0 */
10864/* File: arm64/alt_stub.S */
10865/*
10866 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10867 * any interesting requests and then jump to the real instruction
10868 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10869 */
10870 .extern MterpCheckBefore
10871 EXPORT_PC
10872 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10873 adr lr, artMterpAsmInstructionStart + (208 * 128) // Addr of primary handler.
10874 mov x0, xSELF
10875 add x1, xFP, #OFF_FP_SHADOWFRAME
10876 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10877
10878/* ------------------------------ */
10879 .balign 128
10880.L_ALT_op_rsub_int: /* 0xd1 */
10881/* File: arm64/alt_stub.S */
10882/*
10883 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10884 * any interesting requests and then jump to the real instruction
10885 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10886 */
10887 .extern MterpCheckBefore
10888 EXPORT_PC
10889 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10890 adr lr, artMterpAsmInstructionStart + (209 * 128) // Addr of primary handler.
10891 mov x0, xSELF
10892 add x1, xFP, #OFF_FP_SHADOWFRAME
10893 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10894
10895/* ------------------------------ */
10896 .balign 128
10897.L_ALT_op_mul_int_lit16: /* 0xd2 */
10898/* File: arm64/alt_stub.S */
10899/*
10900 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10901 * any interesting requests and then jump to the real instruction
10902 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10903 */
10904 .extern MterpCheckBefore
10905 EXPORT_PC
10906 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10907 adr lr, artMterpAsmInstructionStart + (210 * 128) // Addr of primary handler.
10908 mov x0, xSELF
10909 add x1, xFP, #OFF_FP_SHADOWFRAME
10910 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10911
10912/* ------------------------------ */
10913 .balign 128
10914.L_ALT_op_div_int_lit16: /* 0xd3 */
10915/* File: arm64/alt_stub.S */
10916/*
10917 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10918 * any interesting requests and then jump to the real instruction
10919 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10920 */
10921 .extern MterpCheckBefore
10922 EXPORT_PC
10923 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10924 adr lr, artMterpAsmInstructionStart + (211 * 128) // Addr of primary handler.
10925 mov x0, xSELF
10926 add x1, xFP, #OFF_FP_SHADOWFRAME
10927 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10928
10929/* ------------------------------ */
10930 .balign 128
10931.L_ALT_op_rem_int_lit16: /* 0xd4 */
10932/* File: arm64/alt_stub.S */
10933/*
10934 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10935 * any interesting requests and then jump to the real instruction
10936 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10937 */
10938 .extern MterpCheckBefore
10939 EXPORT_PC
10940 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10941 adr lr, artMterpAsmInstructionStart + (212 * 128) // Addr of primary handler.
10942 mov x0, xSELF
10943 add x1, xFP, #OFF_FP_SHADOWFRAME
10944 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10945
10946/* ------------------------------ */
10947 .balign 128
10948.L_ALT_op_and_int_lit16: /* 0xd5 */
10949/* File: arm64/alt_stub.S */
10950/*
10951 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10952 * any interesting requests and then jump to the real instruction
10953 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10954 */
10955 .extern MterpCheckBefore
10956 EXPORT_PC
10957 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10958 adr lr, artMterpAsmInstructionStart + (213 * 128) // Addr of primary handler.
10959 mov x0, xSELF
10960 add x1, xFP, #OFF_FP_SHADOWFRAME
10961 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10962
10963/* ------------------------------ */
10964 .balign 128
10965.L_ALT_op_or_int_lit16: /* 0xd6 */
10966/* File: arm64/alt_stub.S */
10967/*
10968 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10969 * any interesting requests and then jump to the real instruction
10970 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10971 */
10972 .extern MterpCheckBefore
10973 EXPORT_PC
10974 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10975 adr lr, artMterpAsmInstructionStart + (214 * 128) // Addr of primary handler.
10976 mov x0, xSELF
10977 add x1, xFP, #OFF_FP_SHADOWFRAME
10978 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10979
10980/* ------------------------------ */
10981 .balign 128
10982.L_ALT_op_xor_int_lit16: /* 0xd7 */
10983/* File: arm64/alt_stub.S */
10984/*
10985 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10986 * any interesting requests and then jump to the real instruction
10987 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10988 */
10989 .extern MterpCheckBefore
10990 EXPORT_PC
10991 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10992 adr lr, artMterpAsmInstructionStart + (215 * 128) // Addr of primary handler.
10993 mov x0, xSELF
10994 add x1, xFP, #OFF_FP_SHADOWFRAME
10995 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10996
10997/* ------------------------------ */
10998 .balign 128
10999.L_ALT_op_add_int_lit8: /* 0xd8 */
11000/* File: arm64/alt_stub.S */
11001/*
11002 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11003 * any interesting requests and then jump to the real instruction
11004 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11005 */
11006 .extern MterpCheckBefore
11007 EXPORT_PC
11008 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11009 adr lr, artMterpAsmInstructionStart + (216 * 128) // Addr of primary handler.
11010 mov x0, xSELF
11011 add x1, xFP, #OFF_FP_SHADOWFRAME
11012 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11013
11014/* ------------------------------ */
11015 .balign 128
11016.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11017/* File: arm64/alt_stub.S */
11018/*
11019 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11020 * any interesting requests and then jump to the real instruction
11021 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11022 */
11023 .extern MterpCheckBefore
11024 EXPORT_PC
11025 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11026 adr lr, artMterpAsmInstructionStart + (217 * 128) // Addr of primary handler.
11027 mov x0, xSELF
11028 add x1, xFP, #OFF_FP_SHADOWFRAME
11029 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11030
11031/* ------------------------------ */
11032 .balign 128
11033.L_ALT_op_mul_int_lit8: /* 0xda */
11034/* File: arm64/alt_stub.S */
11035/*
11036 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11037 * any interesting requests and then jump to the real instruction
11038 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11039 */
11040 .extern MterpCheckBefore
11041 EXPORT_PC
11042 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11043 adr lr, artMterpAsmInstructionStart + (218 * 128) // Addr of primary handler.
11044 mov x0, xSELF
11045 add x1, xFP, #OFF_FP_SHADOWFRAME
11046 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11047
11048/* ------------------------------ */
11049 .balign 128
11050.L_ALT_op_div_int_lit8: /* 0xdb */
11051/* File: arm64/alt_stub.S */
11052/*
11053 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11054 * any interesting requests and then jump to the real instruction
11055 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11056 */
11057 .extern MterpCheckBefore
11058 EXPORT_PC
11059 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11060 adr lr, artMterpAsmInstructionStart + (219 * 128) // Addr of primary handler.
11061 mov x0, xSELF
11062 add x1, xFP, #OFF_FP_SHADOWFRAME
11063 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11064
11065/* ------------------------------ */
11066 .balign 128
11067.L_ALT_op_rem_int_lit8: /* 0xdc */
11068/* File: arm64/alt_stub.S */
11069/*
11070 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11071 * any interesting requests and then jump to the real instruction
11072 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11073 */
11074 .extern MterpCheckBefore
11075 EXPORT_PC
11076 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11077 adr lr, artMterpAsmInstructionStart + (220 * 128) // Addr of primary handler.
11078 mov x0, xSELF
11079 add x1, xFP, #OFF_FP_SHADOWFRAME
11080 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11081
11082/* ------------------------------ */
11083 .balign 128
11084.L_ALT_op_and_int_lit8: /* 0xdd */
11085/* File: arm64/alt_stub.S */
11086/*
11087 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11088 * any interesting requests and then jump to the real instruction
11089 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11090 */
11091 .extern MterpCheckBefore
11092 EXPORT_PC
11093 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11094 adr lr, artMterpAsmInstructionStart + (221 * 128) // Addr of primary handler.
11095 mov x0, xSELF
11096 add x1, xFP, #OFF_FP_SHADOWFRAME
11097 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11098
11099/* ------------------------------ */
11100 .balign 128
11101.L_ALT_op_or_int_lit8: /* 0xde */
11102/* File: arm64/alt_stub.S */
11103/*
11104 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11105 * any interesting requests and then jump to the real instruction
11106 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11107 */
11108 .extern MterpCheckBefore
11109 EXPORT_PC
11110 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11111 adr lr, artMterpAsmInstructionStart + (222 * 128) // Addr of primary handler.
11112 mov x0, xSELF
11113 add x1, xFP, #OFF_FP_SHADOWFRAME
11114 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11115
11116/* ------------------------------ */
11117 .balign 128
11118.L_ALT_op_xor_int_lit8: /* 0xdf */
11119/* File: arm64/alt_stub.S */
11120/*
11121 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11122 * any interesting requests and then jump to the real instruction
11123 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11124 */
11125 .extern MterpCheckBefore
11126 EXPORT_PC
11127 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11128 adr lr, artMterpAsmInstructionStart + (223 * 128) // Addr of primary handler.
11129 mov x0, xSELF
11130 add x1, xFP, #OFF_FP_SHADOWFRAME
11131 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11132
11133/* ------------------------------ */
11134 .balign 128
11135.L_ALT_op_shl_int_lit8: /* 0xe0 */
11136/* File: arm64/alt_stub.S */
11137/*
11138 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11139 * any interesting requests and then jump to the real instruction
11140 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11141 */
11142 .extern MterpCheckBefore
11143 EXPORT_PC
11144 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11145 adr lr, artMterpAsmInstructionStart + (224 * 128) // Addr of primary handler.
11146 mov x0, xSELF
11147 add x1, xFP, #OFF_FP_SHADOWFRAME
11148 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11149
11150/* ------------------------------ */
11151 .balign 128
11152.L_ALT_op_shr_int_lit8: /* 0xe1 */
11153/* File: arm64/alt_stub.S */
11154/*
11155 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11156 * any interesting requests and then jump to the real instruction
11157 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11158 */
11159 .extern MterpCheckBefore
11160 EXPORT_PC
11161 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11162 adr lr, artMterpAsmInstructionStart + (225 * 128) // Addr of primary handler.
11163 mov x0, xSELF
11164 add x1, xFP, #OFF_FP_SHADOWFRAME
11165 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11166
11167/* ------------------------------ */
11168 .balign 128
11169.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11170/* File: arm64/alt_stub.S */
11171/*
11172 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11173 * any interesting requests and then jump to the real instruction
11174 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11175 */
11176 .extern MterpCheckBefore
11177 EXPORT_PC
11178 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11179 adr lr, artMterpAsmInstructionStart + (226 * 128) // Addr of primary handler.
11180 mov x0, xSELF
11181 add x1, xFP, #OFF_FP_SHADOWFRAME
11182 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11183
11184/* ------------------------------ */
11185 .balign 128
11186.L_ALT_op_iget_quick: /* 0xe3 */
11187/* File: arm64/alt_stub.S */
11188/*
11189 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11190 * any interesting requests and then jump to the real instruction
11191 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11192 */
11193 .extern MterpCheckBefore
11194 EXPORT_PC
11195 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11196 adr lr, artMterpAsmInstructionStart + (227 * 128) // Addr of primary handler.
11197 mov x0, xSELF
11198 add x1, xFP, #OFF_FP_SHADOWFRAME
11199 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11200
11201/* ------------------------------ */
11202 .balign 128
11203.L_ALT_op_iget_wide_quick: /* 0xe4 */
11204/* File: arm64/alt_stub.S */
11205/*
11206 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11207 * any interesting requests and then jump to the real instruction
11208 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11209 */
11210 .extern MterpCheckBefore
11211 EXPORT_PC
11212 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11213 adr lr, artMterpAsmInstructionStart + (228 * 128) // Addr of primary handler.
11214 mov x0, xSELF
11215 add x1, xFP, #OFF_FP_SHADOWFRAME
11216 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11217
11218/* ------------------------------ */
11219 .balign 128
11220.L_ALT_op_iget_object_quick: /* 0xe5 */
11221/* File: arm64/alt_stub.S */
11222/*
11223 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11224 * any interesting requests and then jump to the real instruction
11225 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11226 */
11227 .extern MterpCheckBefore
11228 EXPORT_PC
11229 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11230 adr lr, artMterpAsmInstructionStart + (229 * 128) // Addr of primary handler.
11231 mov x0, xSELF
11232 add x1, xFP, #OFF_FP_SHADOWFRAME
11233 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11234
11235/* ------------------------------ */
11236 .balign 128
11237.L_ALT_op_iput_quick: /* 0xe6 */
11238/* File: arm64/alt_stub.S */
11239/*
11240 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11241 * any interesting requests and then jump to the real instruction
11242 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11243 */
11244 .extern MterpCheckBefore
11245 EXPORT_PC
11246 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11247 adr lr, artMterpAsmInstructionStart + (230 * 128) // Addr of primary handler.
11248 mov x0, xSELF
11249 add x1, xFP, #OFF_FP_SHADOWFRAME
11250 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11251
11252/* ------------------------------ */
11253 .balign 128
11254.L_ALT_op_iput_wide_quick: /* 0xe7 */
11255/* File: arm64/alt_stub.S */
11256/*
11257 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11258 * any interesting requests and then jump to the real instruction
11259 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11260 */
11261 .extern MterpCheckBefore
11262 EXPORT_PC
11263 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11264 adr lr, artMterpAsmInstructionStart + (231 * 128) // Addr of primary handler.
11265 mov x0, xSELF
11266 add x1, xFP, #OFF_FP_SHADOWFRAME
11267 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11268
11269/* ------------------------------ */
11270 .balign 128
11271.L_ALT_op_iput_object_quick: /* 0xe8 */
11272/* File: arm64/alt_stub.S */
11273/*
11274 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11275 * any interesting requests and then jump to the real instruction
11276 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11277 */
11278 .extern MterpCheckBefore
11279 EXPORT_PC
11280 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11281 adr lr, artMterpAsmInstructionStart + (232 * 128) // Addr of primary handler.
11282 mov x0, xSELF
11283 add x1, xFP, #OFF_FP_SHADOWFRAME
11284 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11285
11286/* ------------------------------ */
11287 .balign 128
11288.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11289/* File: arm64/alt_stub.S */
11290/*
11291 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11292 * any interesting requests and then jump to the real instruction
11293 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11294 */
11295 .extern MterpCheckBefore
11296 EXPORT_PC
11297 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11298 adr lr, artMterpAsmInstructionStart + (233 * 128) // Addr of primary handler.
11299 mov x0, xSELF
11300 add x1, xFP, #OFF_FP_SHADOWFRAME
11301 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11302
11303/* ------------------------------ */
11304 .balign 128
11305.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11306/* File: arm64/alt_stub.S */
11307/*
11308 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11309 * any interesting requests and then jump to the real instruction
11310 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11311 */
11312 .extern MterpCheckBefore
11313 EXPORT_PC
11314 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11315 adr lr, artMterpAsmInstructionStart + (234 * 128) // Addr of primary handler.
11316 mov x0, xSELF
11317 add x1, xFP, #OFF_FP_SHADOWFRAME
11318 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11319
11320/* ------------------------------ */
11321 .balign 128
11322.L_ALT_op_iput_boolean_quick: /* 0xeb */
11323/* File: arm64/alt_stub.S */
11324/*
11325 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11326 * any interesting requests and then jump to the real instruction
11327 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11328 */
11329 .extern MterpCheckBefore
11330 EXPORT_PC
11331 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11332 adr lr, artMterpAsmInstructionStart + (235 * 128) // Addr of primary handler.
11333 mov x0, xSELF
11334 add x1, xFP, #OFF_FP_SHADOWFRAME
11335 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11336
11337/* ------------------------------ */
11338 .balign 128
11339.L_ALT_op_iput_byte_quick: /* 0xec */
11340/* File: arm64/alt_stub.S */
11341/*
11342 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11343 * any interesting requests and then jump to the real instruction
11344 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11345 */
11346 .extern MterpCheckBefore
11347 EXPORT_PC
11348 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11349 adr lr, artMterpAsmInstructionStart + (236 * 128) // Addr of primary handler.
11350 mov x0, xSELF
11351 add x1, xFP, #OFF_FP_SHADOWFRAME
11352 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11353
11354/* ------------------------------ */
11355 .balign 128
11356.L_ALT_op_iput_char_quick: /* 0xed */
11357/* File: arm64/alt_stub.S */
11358/*
11359 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11360 * any interesting requests and then jump to the real instruction
11361 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11362 */
11363 .extern MterpCheckBefore
11364 EXPORT_PC
11365 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11366 adr lr, artMterpAsmInstructionStart + (237 * 128) // Addr of primary handler.
11367 mov x0, xSELF
11368 add x1, xFP, #OFF_FP_SHADOWFRAME
11369 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11370
11371/* ------------------------------ */
11372 .balign 128
11373.L_ALT_op_iput_short_quick: /* 0xee */
11374/* File: arm64/alt_stub.S */
11375/*
11376 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11377 * any interesting requests and then jump to the real instruction
11378 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11379 */
11380 .extern MterpCheckBefore
11381 EXPORT_PC
11382 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11383 adr lr, artMterpAsmInstructionStart + (238 * 128) // Addr of primary handler.
11384 mov x0, xSELF
11385 add x1, xFP, #OFF_FP_SHADOWFRAME
11386 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11387
11388/* ------------------------------ */
11389 .balign 128
11390.L_ALT_op_iget_boolean_quick: /* 0xef */
11391/* File: arm64/alt_stub.S */
11392/*
11393 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11394 * any interesting requests and then jump to the real instruction
11395 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11396 */
11397 .extern MterpCheckBefore
11398 EXPORT_PC
11399 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11400 adr lr, artMterpAsmInstructionStart + (239 * 128) // Addr of primary handler.
11401 mov x0, xSELF
11402 add x1, xFP, #OFF_FP_SHADOWFRAME
11403 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11404
11405/* ------------------------------ */
11406 .balign 128
11407.L_ALT_op_iget_byte_quick: /* 0xf0 */
11408/* File: arm64/alt_stub.S */
11409/*
11410 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11411 * any interesting requests and then jump to the real instruction
11412 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11413 */
11414 .extern MterpCheckBefore
11415 EXPORT_PC
11416 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11417 adr lr, artMterpAsmInstructionStart + (240 * 128) // Addr of primary handler.
11418 mov x0, xSELF
11419 add x1, xFP, #OFF_FP_SHADOWFRAME
11420 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11421
11422/* ------------------------------ */
11423 .balign 128
11424.L_ALT_op_iget_char_quick: /* 0xf1 */
11425/* File: arm64/alt_stub.S */
11426/*
11427 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11428 * any interesting requests and then jump to the real instruction
11429 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11430 */
11431 .extern MterpCheckBefore
11432 EXPORT_PC
11433 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11434 adr lr, artMterpAsmInstructionStart + (241 * 128) // Addr of primary handler.
11435 mov x0, xSELF
11436 add x1, xFP, #OFF_FP_SHADOWFRAME
11437 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11438
11439/* ------------------------------ */
11440 .balign 128
11441.L_ALT_op_iget_short_quick: /* 0xf2 */
11442/* File: arm64/alt_stub.S */
11443/*
11444 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11445 * any interesting requests and then jump to the real instruction
11446 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11447 */
11448 .extern MterpCheckBefore
11449 EXPORT_PC
11450 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11451 adr lr, artMterpAsmInstructionStart + (242 * 128) // Addr of primary handler.
11452 mov x0, xSELF
11453 add x1, xFP, #OFF_FP_SHADOWFRAME
11454 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11455
11456/* ------------------------------ */
11457 .balign 128
11458.L_ALT_op_invoke_lambda: /* 0xf3 */
11459/* File: arm64/alt_stub.S */
11460/*
11461 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11462 * any interesting requests and then jump to the real instruction
11463 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11464 */
11465 .extern MterpCheckBefore
11466 EXPORT_PC
11467 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11468 adr lr, artMterpAsmInstructionStart + (243 * 128) // Addr of primary handler.
11469 mov x0, xSELF
11470 add x1, xFP, #OFF_FP_SHADOWFRAME
11471 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11472
11473/* ------------------------------ */
11474 .balign 128
11475.L_ALT_op_unused_f4: /* 0xf4 */
11476/* File: arm64/alt_stub.S */
11477/*
11478 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11479 * any interesting requests and then jump to the real instruction
11480 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11481 */
11482 .extern MterpCheckBefore
11483 EXPORT_PC
11484 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11485 adr lr, artMterpAsmInstructionStart + (244 * 128) // Addr of primary handler.
11486 mov x0, xSELF
11487 add x1, xFP, #OFF_FP_SHADOWFRAME
11488 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11489
11490/* ------------------------------ */
11491 .balign 128
11492.L_ALT_op_capture_variable: /* 0xf5 */
11493/* File: arm64/alt_stub.S */
11494/*
11495 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11496 * any interesting requests and then jump to the real instruction
11497 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11498 */
11499 .extern MterpCheckBefore
11500 EXPORT_PC
11501 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11502 adr lr, artMterpAsmInstructionStart + (245 * 128) // Addr of primary handler.
11503 mov x0, xSELF
11504 add x1, xFP, #OFF_FP_SHADOWFRAME
11505 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11506
11507/* ------------------------------ */
11508 .balign 128
11509.L_ALT_op_create_lambda: /* 0xf6 */
11510/* File: arm64/alt_stub.S */
11511/*
11512 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11513 * any interesting requests and then jump to the real instruction
11514 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11515 */
11516 .extern MterpCheckBefore
11517 EXPORT_PC
11518 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11519 adr lr, artMterpAsmInstructionStart + (246 * 128) // Addr of primary handler.
11520 mov x0, xSELF
11521 add x1, xFP, #OFF_FP_SHADOWFRAME
11522 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11523
11524/* ------------------------------ */
11525 .balign 128
11526.L_ALT_op_liberate_variable: /* 0xf7 */
11527/* File: arm64/alt_stub.S */
11528/*
11529 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11530 * any interesting requests and then jump to the real instruction
11531 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11532 */
11533 .extern MterpCheckBefore
11534 EXPORT_PC
11535 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11536 adr lr, artMterpAsmInstructionStart + (247 * 128) // Addr of primary handler.
11537 mov x0, xSELF
11538 add x1, xFP, #OFF_FP_SHADOWFRAME
11539 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11540
11541/* ------------------------------ */
11542 .balign 128
11543.L_ALT_op_box_lambda: /* 0xf8 */
11544/* File: arm64/alt_stub.S */
11545/*
11546 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11547 * any interesting requests and then jump to the real instruction
11548 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11549 */
11550 .extern MterpCheckBefore
11551 EXPORT_PC
11552 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11553 adr lr, artMterpAsmInstructionStart + (248 * 128) // Addr of primary handler.
11554 mov x0, xSELF
11555 add x1, xFP, #OFF_FP_SHADOWFRAME
11556 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11557
11558/* ------------------------------ */
11559 .balign 128
11560.L_ALT_op_unbox_lambda: /* 0xf9 */
11561/* File: arm64/alt_stub.S */
11562/*
11563 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11564 * any interesting requests and then jump to the real instruction
11565 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11566 */
11567 .extern MterpCheckBefore
11568 EXPORT_PC
11569 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11570 adr lr, artMterpAsmInstructionStart + (249 * 128) // Addr of primary handler.
11571 mov x0, xSELF
11572 add x1, xFP, #OFF_FP_SHADOWFRAME
11573 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11574
11575/* ------------------------------ */
11576 .balign 128
11577.L_ALT_op_unused_fa: /* 0xfa */
11578/* File: arm64/alt_stub.S */
11579/*
11580 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11581 * any interesting requests and then jump to the real instruction
11582 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11583 */
11584 .extern MterpCheckBefore
11585 EXPORT_PC
11586 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11587 adr lr, artMterpAsmInstructionStart + (250 * 128) // Addr of primary handler.
11588 mov x0, xSELF
11589 add x1, xFP, #OFF_FP_SHADOWFRAME
11590 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11591
11592/* ------------------------------ */
11593 .balign 128
11594.L_ALT_op_unused_fb: /* 0xfb */
11595/* File: arm64/alt_stub.S */
11596/*
11597 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11598 * any interesting requests and then jump to the real instruction
11599 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11600 */
11601 .extern MterpCheckBefore
11602 EXPORT_PC
11603 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11604 adr lr, artMterpAsmInstructionStart + (251 * 128) // Addr of primary handler.
11605 mov x0, xSELF
11606 add x1, xFP, #OFF_FP_SHADOWFRAME
11607 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11608
11609/* ------------------------------ */
11610 .balign 128
11611.L_ALT_op_unused_fc: /* 0xfc */
11612/* File: arm64/alt_stub.S */
11613/*
11614 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11615 * any interesting requests and then jump to the real instruction
11616 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11617 */
11618 .extern MterpCheckBefore
11619 EXPORT_PC
11620 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11621 adr lr, artMterpAsmInstructionStart + (252 * 128) // Addr of primary handler.
11622 mov x0, xSELF
11623 add x1, xFP, #OFF_FP_SHADOWFRAME
11624 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11625
11626/* ------------------------------ */
11627 .balign 128
11628.L_ALT_op_unused_fd: /* 0xfd */
11629/* File: arm64/alt_stub.S */
11630/*
11631 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11632 * any interesting requests and then jump to the real instruction
11633 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11634 */
11635 .extern MterpCheckBefore
11636 EXPORT_PC
11637 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11638 adr lr, artMterpAsmInstructionStart + (253 * 128) // Addr of primary handler.
11639 mov x0, xSELF
11640 add x1, xFP, #OFF_FP_SHADOWFRAME
11641 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11642
11643/* ------------------------------ */
11644 .balign 128
11645.L_ALT_op_unused_fe: /* 0xfe */
11646/* File: arm64/alt_stub.S */
11647/*
11648 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11649 * any interesting requests and then jump to the real instruction
11650 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11651 */
11652 .extern MterpCheckBefore
11653 EXPORT_PC
11654 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11655 adr lr, artMterpAsmInstructionStart + (254 * 128) // Addr of primary handler.
11656 mov x0, xSELF
11657 add x1, xFP, #OFF_FP_SHADOWFRAME
11658 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11659
11660/* ------------------------------ */
11661 .balign 128
11662.L_ALT_op_unused_ff: /* 0xff */
11663/* File: arm64/alt_stub.S */
11664/*
11665 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11666 * any interesting requests and then jump to the real instruction
11667 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11668 */
11669 .extern MterpCheckBefore
11670 EXPORT_PC
11671 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11672 adr lr, artMterpAsmInstructionStart + (255 * 128) // Addr of primary handler.
11673 mov x0, xSELF
11674 add x1, xFP, #OFF_FP_SHADOWFRAME
11675 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11676
11677 .balign 128
11678 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
11679 .global artMterpAsmAltInstructionEnd
11680artMterpAsmAltInstructionEnd:
11681/* File: arm64/footer.S */
11682/*
11683 * ===========================================================================
11684 * Common subroutines and data
11685 * ===========================================================================
11686 */
11687
11688
11689/*
11690 * We've detected a condition that will result in an exception, but the exception
11691 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
11692 * TUNING: for consistency, we may want to just go ahead and handle these here.
11693 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011694common_errDivideByZero:
11695 EXPORT_PC
11696#if MTERP_LOGGING
11697 mov x0, xSELF
11698 add x1, xFP, #OFF_FP_SHADOWFRAME
11699 bl MterpLogDivideByZeroException
11700#endif
11701 b MterpCommonFallback
11702
11703common_errArrayIndex:
11704 EXPORT_PC
11705#if MTERP_LOGGING
11706 mov x0, xSELF
11707 add x1, xFP, #OFF_FP_SHADOWFRAME
11708 bl MterpLogArrayIndexException
11709#endif
11710 b MterpCommonFallback
11711
11712common_errNegativeArraySize:
11713 EXPORT_PC
11714#if MTERP_LOGGING
11715 mov x0, xSELF
11716 add x1, xFP, #OFF_FP_SHADOWFRAME
11717 bl MterpLogNegativeArraySizeException
11718#endif
11719 b MterpCommonFallback
11720
11721common_errNoSuchMethod:
11722 EXPORT_PC
11723#if MTERP_LOGGING
11724 mov x0, xSELF
11725 add x1, xFP, #OFF_FP_SHADOWFRAME
11726 bl MterpLogNoSuchMethodException
11727#endif
11728 b MterpCommonFallback
11729
11730common_errNullObject:
11731 EXPORT_PC
11732#if MTERP_LOGGING
11733 mov x0, xSELF
11734 add x1, xFP, #OFF_FP_SHADOWFRAME
11735 bl MterpLogNullObjectException
11736#endif
11737 b MterpCommonFallback
11738
11739common_exceptionThrown:
11740 EXPORT_PC
11741#if MTERP_LOGGING
11742 mov x0, xSELF
11743 add x1, xFP, #OFF_FP_SHADOWFRAME
11744 bl MterpLogExceptionThrownException
11745#endif
11746 b MterpCommonFallback
11747
11748MterpSuspendFallback:
11749 EXPORT_PC
11750#if MTERP_LOGGING
11751 mov x0, xSELF
11752 add x1, xFP, #OFF_FP_SHADOWFRAME
11753 ldr x2, [xSELF, #THREAD_FLAGS_OFFSET]
11754 bl MterpLogSuspendFallback
11755#endif
11756 b MterpCommonFallback
11757
11758/*
11759 * If we're here, something is out of the ordinary. If there is a pending
11760 * exception, handle it. Otherwise, roll back and retry with the reference
11761 * interpreter.
11762 */
11763MterpPossibleException:
11764 ldr x0, [xSELF, #THREAD_EXCEPTION_OFFSET]
11765 cbz x0, MterpFallback // If not, fall back to reference interpreter.
11766 /* intentional fallthrough - handle pending exception. */
11767/*
11768 * On return from a runtime helper routine, we've found a pending exception.
11769 * Can we handle it here - or need to bail out to caller?
11770 *
11771 */
11772MterpException:
11773 mov x0, xSELF
11774 add x1, xFP, #OFF_FP_SHADOWFRAME
11775 bl MterpHandleException // (self, shadow_frame)
11776 cbz w0, MterpExceptionReturn // no local catch, back to caller.
11777 ldr x0, [xFP, #OFF_FP_CODE_ITEM]
11778 ldr w1, [xFP, #OFF_FP_DEX_PC]
11779 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
11780 add xPC, x0, #CODEITEM_INSNS_OFFSET
11781 add xPC, xPC, x1, lsl #1 // generate new dex_pc_ptr
Bill Buzbeefd522f92016-02-11 22:37:42 +000011782 /* Do we need to switch interpreters? */
11783 bl MterpShouldSwitchInterpreters
11784 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011785 /* resume execution at catch block */
Bill Buzbeefd522f92016-02-11 22:37:42 +000011786 EXPORT_PC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011787 FETCH_INST
11788 GET_INST_OPCODE ip
11789 GOTO_OPCODE ip
11790 /* NOTE: no fallthrough */
11791
11792/*
11793 * Check for suspend check request. Assumes wINST already loaded, xPC advanced and
11794 * still needs to get the opcode and branch to it, and flags are in lr.
11795 */
11796MterpCheckSuspendAndContinue:
11797 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh xIBASE
11798 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
11799 b.ne check1
11800 GET_INST_OPCODE ip // extract opcode from wINST
11801 GOTO_OPCODE ip // jump to next instruction
11802check1:
11803 EXPORT_PC
11804 mov x0, xSELF
11805 bl MterpSuspendCheck // (self)
Bill Buzbeefd522f92016-02-11 22:37:42 +000011806 cbnz x0, MterpFallback // Something in the environment changed, switch interpreters
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011807 GET_INST_OPCODE ip // extract opcode from wINST
11808 GOTO_OPCODE ip // jump to next instruction
11809
11810/*
Bill Buzbeefd522f92016-02-11 22:37:42 +000011811 * On-stack replacement has happened, and now we've returned from the compiled method.
11812 */
11813MterpOnStackReplacement:
11814#if MTERP_LOGGING
11815 mov x0, xSELF
11816 add x1, xFP, #OFF_FP_SHADOWFRAME
11817 sbfm x2, xINST, 0, 31
11818 bl MterpLogOSR
11819#endif
11820 mov x0, #1 // Signal normal return
11821 b MterpDone
11822
11823/*
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011824 * Bail out to reference interpreter.
11825 */
11826MterpFallback:
11827 EXPORT_PC
11828#if MTERP_LOGGING
11829 mov x0, xSELF
11830 add x1, xFP, #OFF_FP_SHADOWFRAME
11831 bl MterpLogFallback
11832#endif
11833MterpCommonFallback:
11834 mov x0, #0 // signal retry with reference interpreter.
11835 b MterpDone
11836
11837/*
11838 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
11839 * SP and LR. Here we restore SP, restore the registers, and then restore
11840 * LR to PC.
11841 *
11842 * On entry:
11843 * uint32_t* xFP (should still be live, pointer to base of vregs)
11844 */
11845MterpExceptionReturn:
11846 mov x0, #1 // signal return to caller.
11847 b MterpDone
11848MterpReturn:
11849 ldr x2, [xFP, #OFF_FP_RESULT_REGISTER]
11850 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
11851 str x0, [x2]
11852 mov x0, xSELF
11853 ands lr, lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
11854 b.eq check2
11855 bl MterpSuspendCheck // (self)
11856check2:
11857 mov x0, #1 // signal return to caller.
11858MterpDone:
11859 ldp fp, lr, [sp, #48]
11860 ldp xPC, xFP, [sp, #32]
11861 ldp xSELF, xINST, [sp, #16]
11862 ldp xIBASE, xREFS, [sp], #64
11863 ret
11864
11865 .cfi_endproc
11866 .size ExecuteMterpImpl, .-ExecuteMterpImpl
11867
11868