blob: c7c0fb5b79aad0b01f19f04fe2e7b9a91cc7ae20 [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 Buzbee3b0b4b92016-02-02 13:45:36 +00001375 lsr w1, wINST, #12 // w1<- B
1376 ubfx w0, wINST, #8, #4 // w0<- A
1377 GET_VREG w3, w1 // w3<- vB
1378 GET_VREG w2, w0 // w2<- vA
1379 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001380 mov w0, #2 // Offset if branch not taken
1381 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001382 csel wINST, w1, w0, eq // Branch if true, stashing result in callee save reg.
buzbeef1dcacc2016-02-24 14:24:24 -08001383#if MTERP_PROFILE_BRANCHES
1384 // TUINING: once measurements are complete, remove #if and hand-schedule.
1385 EXPORT_PC
1386 mov x0, xSELF
1387 add x1, xFP, #OFF_FP_SHADOWFRAME
1388 sbfm x2, xINST, 0, 31 // Sign extend branch offset
1389 bl MterpProfileBranch // (self, shadow_frame, offset)
1390 cbnz w0, MterpOnStackReplacement // Note: offset must be in xINST
1391#endif
Bill Buzbeefd522f92016-02-11 22:37:42 +00001392 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1393 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001394 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1395 b.mi MterpCheckSuspendAndContinue
1396 GET_INST_OPCODE ip // extract opcode from wINST
1397 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001398
1399
1400/* ------------------------------ */
1401 .balign 128
1402.L_op_if_ne: /* 0x33 */
1403/* File: arm64/op_if_ne.S */
1404/* File: arm64/bincmp.S */
1405 /*
1406 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1407 * fragment that specifies the *reverse* comparison to perform, e.g.
1408 * for "if-le" you would use "gt".
1409 *
1410 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1411 */
1412 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001413 lsr w1, wINST, #12 // w1<- B
1414 ubfx w0, wINST, #8, #4 // w0<- A
1415 GET_VREG w3, w1 // w3<- vB
1416 GET_VREG w2, w0 // w2<- vA
1417 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001418 mov w0, #2 // Offset if branch not taken
1419 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001420 csel wINST, w1, w0, ne // Branch if true, stashing result in callee save reg.
buzbeef1dcacc2016-02-24 14:24:24 -08001421#if MTERP_PROFILE_BRANCHES
1422 // TUINING: once measurements are complete, remove #if and hand-schedule.
1423 EXPORT_PC
1424 mov x0, xSELF
1425 add x1, xFP, #OFF_FP_SHADOWFRAME
1426 sbfm x2, xINST, 0, 31 // Sign extend branch offset
1427 bl MterpProfileBranch // (self, shadow_frame, offset)
1428 cbnz w0, MterpOnStackReplacement // Note: offset must be in xINST
1429#endif
Bill Buzbeefd522f92016-02-11 22:37:42 +00001430 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1431 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001432 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1433 b.mi MterpCheckSuspendAndContinue
1434 GET_INST_OPCODE ip // extract opcode from wINST
1435 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001436
1437
1438/* ------------------------------ */
1439 .balign 128
1440.L_op_if_lt: /* 0x34 */
1441/* File: arm64/op_if_lt.S */
1442/* File: arm64/bincmp.S */
1443 /*
1444 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1445 * fragment that specifies the *reverse* comparison to perform, e.g.
1446 * for "if-le" you would use "gt".
1447 *
1448 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1449 */
1450 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001451 lsr w1, wINST, #12 // w1<- B
1452 ubfx w0, wINST, #8, #4 // w0<- A
1453 GET_VREG w3, w1 // w3<- vB
1454 GET_VREG w2, w0 // w2<- vA
1455 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001456 mov w0, #2 // Offset if branch not taken
1457 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001458 csel wINST, w1, w0, lt // Branch if true, stashing result in callee save reg.
buzbeef1dcacc2016-02-24 14:24:24 -08001459#if MTERP_PROFILE_BRANCHES
1460 // TUINING: once measurements are complete, remove #if and hand-schedule.
1461 EXPORT_PC
1462 mov x0, xSELF
1463 add x1, xFP, #OFF_FP_SHADOWFRAME
1464 sbfm x2, xINST, 0, 31 // Sign extend branch offset
1465 bl MterpProfileBranch // (self, shadow_frame, offset)
1466 cbnz w0, MterpOnStackReplacement // Note: offset must be in xINST
1467#endif
Bill Buzbeefd522f92016-02-11 22:37:42 +00001468 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1469 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001470 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1471 b.mi MterpCheckSuspendAndContinue
1472 GET_INST_OPCODE ip // extract opcode from wINST
1473 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001474
1475
1476/* ------------------------------ */
1477 .balign 128
1478.L_op_if_ge: /* 0x35 */
1479/* File: arm64/op_if_ge.S */
1480/* File: arm64/bincmp.S */
1481 /*
1482 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1483 * fragment that specifies the *reverse* comparison to perform, e.g.
1484 * for "if-le" you would use "gt".
1485 *
1486 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1487 */
1488 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001489 lsr w1, wINST, #12 // w1<- B
1490 ubfx w0, wINST, #8, #4 // w0<- A
1491 GET_VREG w3, w1 // w3<- vB
1492 GET_VREG w2, w0 // w2<- vA
1493 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001494 mov w0, #2 // Offset if branch not taken
1495 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001496 csel wINST, w1, w0, ge // Branch if true, stashing result in callee save reg.
buzbeef1dcacc2016-02-24 14:24:24 -08001497#if MTERP_PROFILE_BRANCHES
1498 // TUINING: once measurements are complete, remove #if and hand-schedule.
1499 EXPORT_PC
1500 mov x0, xSELF
1501 add x1, xFP, #OFF_FP_SHADOWFRAME
1502 sbfm x2, xINST, 0, 31 // Sign extend branch offset
1503 bl MterpProfileBranch // (self, shadow_frame, offset)
1504 cbnz w0, MterpOnStackReplacement // Note: offset must be in xINST
1505#endif
Bill Buzbeefd522f92016-02-11 22:37:42 +00001506 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1507 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001508 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1509 b.mi MterpCheckSuspendAndContinue
1510 GET_INST_OPCODE ip // extract opcode from wINST
1511 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001512
1513
1514/* ------------------------------ */
1515 .balign 128
1516.L_op_if_gt: /* 0x36 */
1517/* File: arm64/op_if_gt.S */
1518/* File: arm64/bincmp.S */
1519 /*
1520 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1521 * fragment that specifies the *reverse* comparison to perform, e.g.
1522 * for "if-le" you would use "gt".
1523 *
1524 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1525 */
1526 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001527 lsr w1, wINST, #12 // w1<- B
1528 ubfx w0, wINST, #8, #4 // w0<- A
1529 GET_VREG w3, w1 // w3<- vB
1530 GET_VREG w2, w0 // w2<- vA
1531 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001532 mov w0, #2 // Offset if branch not taken
1533 cmp w2, w3 // compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001534 csel wINST, w1, w0, gt // Branch if true, stashing result in callee save reg.
buzbeef1dcacc2016-02-24 14:24:24 -08001535#if MTERP_PROFILE_BRANCHES
1536 // TUINING: once measurements are complete, remove #if and hand-schedule.
1537 EXPORT_PC
1538 mov x0, xSELF
1539 add x1, xFP, #OFF_FP_SHADOWFRAME
1540 sbfm x2, xINST, 0, 31 // Sign extend branch offset
1541 bl MterpProfileBranch // (self, shadow_frame, offset)
1542 cbnz w0, MterpOnStackReplacement // Note: offset must be in xINST
1543#endif
Bill Buzbeefd522f92016-02-11 22:37:42 +00001544 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1545 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001546 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1547 b.mi MterpCheckSuspendAndContinue
1548 GET_INST_OPCODE ip // extract opcode from wINST
1549 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001550
1551
1552/* ------------------------------ */
1553 .balign 128
1554.L_op_if_le: /* 0x37 */
1555/* File: arm64/op_if_le.S */
1556/* File: arm64/bincmp.S */
1557 /*
1558 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1559 * fragment that specifies the *reverse* comparison to perform, e.g.
1560 * for "if-le" you would use "gt".
1561 *
1562 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1563 */
1564 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001565 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, le // Branch if true, stashing result in callee save reg.
buzbeef1dcacc2016-02-24 14:24:24 -08001573#if MTERP_PROFILE_BRANCHES
1574 // TUINING: once measurements are complete, remove #if and hand-schedule.
1575 EXPORT_PC
1576 mov x0, xSELF
1577 add x1, xFP, #OFF_FP_SHADOWFRAME
1578 sbfm x2, xINST, 0, 31 // Sign extend branch offset
1579 bl MterpProfileBranch // (self, shadow_frame, offset)
1580 cbnz w0, MterpOnStackReplacement // Note: offset must be in xINST
1581#endif
Bill Buzbeefd522f92016-02-11 22:37:42 +00001582 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1583 adds w2, wINST, wINST // convert to bytes, check sign
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001584 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1585 b.mi MterpCheckSuspendAndContinue
1586 GET_INST_OPCODE ip // extract opcode from wINST
1587 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001588
1589
1590/* ------------------------------ */
1591 .balign 128
1592.L_op_if_eqz: /* 0x38 */
1593/* File: arm64/op_if_eqz.S */
1594/* File: arm64/zcmp.S */
1595 /*
1596 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1597 * fragment that specifies the *reverse* comparison to perform, e.g.
1598 * for "if-le" you would use "gt".
1599 *
1600 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1601 */
1602 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001603 lsr w0, wINST, #8 // w0<- AA
1604 GET_VREG w2, w0 // w2<- vAA
1605 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001606 mov w0, #2 // Branch offset if not taken
1607 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001608 csel wINST, w1, w0, eq // Branch if true, stashing result in callee save reg
buzbeef1dcacc2016-02-24 14:24:24 -08001609#if MTERP_PROFILE_BRANCHES
1610 // TUNING: once measurements are complete, remove #if and hand-schedule.
1611 EXPORT_PC
1612 mov x0, xSELF
1613 add x1, xFP, #OFF_FP_SHADOWFRAME
1614 sbfm x2, xINST, 0, 31
1615 bl MterpProfileBranch // (self, shadow_frame, offset)
1616 cbnz w0, MterpOnStackReplacement // Note: offset must be in wINST
1617#endif
Bill Buzbeefd522f92016-02-11 22:37:42 +00001618 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1619 adds w2, wINST, wINST // convert to bytes & set flags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001620 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1621 b.mi MterpCheckSuspendAndContinue
1622 GET_INST_OPCODE ip // extract opcode from wINST
1623 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001624
1625
1626/* ------------------------------ */
1627 .balign 128
1628.L_op_if_nez: /* 0x39 */
1629/* File: arm64/op_if_nez.S */
1630/* File: arm64/zcmp.S */
1631 /*
1632 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1633 * fragment that specifies the *reverse* comparison to perform, e.g.
1634 * for "if-le" you would use "gt".
1635 *
1636 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1637 */
1638 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001639 lsr w0, wINST, #8 // w0<- AA
1640 GET_VREG w2, w0 // w2<- vAA
1641 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001642 mov w0, #2 // Branch offset if not taken
1643 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001644 csel wINST, w1, w0, ne // Branch if true, stashing result in callee save reg
buzbeef1dcacc2016-02-24 14:24:24 -08001645#if MTERP_PROFILE_BRANCHES
1646 // TUNING: once measurements are complete, remove #if and hand-schedule.
1647 EXPORT_PC
1648 mov x0, xSELF
1649 add x1, xFP, #OFF_FP_SHADOWFRAME
1650 sbfm x2, xINST, 0, 31
1651 bl MterpProfileBranch // (self, shadow_frame, offset)
1652 cbnz w0, MterpOnStackReplacement // Note: offset must be in wINST
1653#endif
Bill Buzbeefd522f92016-02-11 22:37:42 +00001654 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1655 adds w2, wINST, wINST // convert to bytes & set flags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001656 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1657 b.mi MterpCheckSuspendAndContinue
1658 GET_INST_OPCODE ip // extract opcode from wINST
1659 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001660
1661
1662/* ------------------------------ */
1663 .balign 128
1664.L_op_if_ltz: /* 0x3a */
1665/* File: arm64/op_if_ltz.S */
1666/* File: arm64/zcmp.S */
1667 /*
1668 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1669 * fragment that specifies the *reverse* comparison to perform, e.g.
1670 * for "if-le" you would use "gt".
1671 *
1672 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1673 */
1674 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001675 lsr w0, wINST, #8 // w0<- AA
1676 GET_VREG w2, w0 // w2<- vAA
1677 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001678 mov w0, #2 // Branch offset if not taken
1679 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001680 csel wINST, w1, w0, lt // Branch if true, stashing result in callee save reg
buzbeef1dcacc2016-02-24 14:24:24 -08001681#if MTERP_PROFILE_BRANCHES
1682 // TUNING: once measurements are complete, remove #if and hand-schedule.
1683 EXPORT_PC
1684 mov x0, xSELF
1685 add x1, xFP, #OFF_FP_SHADOWFRAME
1686 sbfm x2, xINST, 0, 31
1687 bl MterpProfileBranch // (self, shadow_frame, offset)
1688 cbnz w0, MterpOnStackReplacement // Note: offset must be in wINST
1689#endif
Bill Buzbeefd522f92016-02-11 22:37:42 +00001690 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1691 adds w2, wINST, wINST // convert to bytes & set flags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001692 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1693 b.mi MterpCheckSuspendAndContinue
1694 GET_INST_OPCODE ip // extract opcode from wINST
1695 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001696
1697
1698/* ------------------------------ */
1699 .balign 128
1700.L_op_if_gez: /* 0x3b */
1701/* File: arm64/op_if_gez.S */
1702/* File: arm64/zcmp.S */
1703 /*
1704 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1705 * fragment that specifies the *reverse* comparison to perform, e.g.
1706 * for "if-le" you would use "gt".
1707 *
1708 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1709 */
1710 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001711 lsr w0, wINST, #8 // w0<- AA
1712 GET_VREG w2, w0 // w2<- vAA
1713 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001714 mov w0, #2 // Branch offset if not taken
1715 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001716 csel wINST, w1, w0, ge // Branch if true, stashing result in callee save reg
buzbeef1dcacc2016-02-24 14:24:24 -08001717#if MTERP_PROFILE_BRANCHES
1718 // TUNING: once measurements are complete, remove #if and hand-schedule.
1719 EXPORT_PC
1720 mov x0, xSELF
1721 add x1, xFP, #OFF_FP_SHADOWFRAME
1722 sbfm x2, xINST, 0, 31
1723 bl MterpProfileBranch // (self, shadow_frame, offset)
1724 cbnz w0, MterpOnStackReplacement // Note: offset must be in wINST
1725#endif
Bill Buzbeefd522f92016-02-11 22:37:42 +00001726 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1727 adds w2, wINST, wINST // convert to bytes & set flags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001728 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1729 b.mi MterpCheckSuspendAndContinue
1730 GET_INST_OPCODE ip // extract opcode from wINST
1731 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001732
1733
1734/* ------------------------------ */
1735 .balign 128
1736.L_op_if_gtz: /* 0x3c */
1737/* File: arm64/op_if_gtz.S */
1738/* File: arm64/zcmp.S */
1739 /*
1740 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1741 * fragment that specifies the *reverse* comparison to perform, e.g.
1742 * for "if-le" you would use "gt".
1743 *
1744 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1745 */
1746 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001747 lsr w0, wINST, #8 // w0<- AA
1748 GET_VREG w2, w0 // w2<- vAA
1749 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001750 mov w0, #2 // Branch offset if not taken
1751 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001752 csel wINST, w1, w0, gt // Branch if true, stashing result in callee save reg
buzbeef1dcacc2016-02-24 14:24:24 -08001753#if MTERP_PROFILE_BRANCHES
1754 // TUNING: once measurements are complete, remove #if and hand-schedule.
1755 EXPORT_PC
1756 mov x0, xSELF
1757 add x1, xFP, #OFF_FP_SHADOWFRAME
1758 sbfm x2, xINST, 0, 31
1759 bl MterpProfileBranch // (self, shadow_frame, offset)
1760 cbnz w0, MterpOnStackReplacement // Note: offset must be in wINST
1761#endif
Bill Buzbeefd522f92016-02-11 22:37:42 +00001762 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1763 adds w2, wINST, wINST // convert to bytes & set flags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001764 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1765 b.mi MterpCheckSuspendAndContinue
1766 GET_INST_OPCODE ip // extract opcode from wINST
1767 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001768
1769
1770/* ------------------------------ */
1771 .balign 128
1772.L_op_if_lez: /* 0x3d */
1773/* File: arm64/op_if_lez.S */
1774/* File: arm64/zcmp.S */
1775 /*
1776 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1777 * fragment that specifies the *reverse* comparison to perform, e.g.
1778 * for "if-le" you would use "gt".
1779 *
1780 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1781 */
1782 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001783 lsr w0, wINST, #8 // w0<- AA
1784 GET_VREG w2, w0 // w2<- vAA
1785 FETCH_S w1, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001786 mov w0, #2 // Branch offset if not taken
1787 cmp w2, #0 // compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001788 csel wINST, w1, w0, le // Branch if true, stashing result in callee save reg
buzbeef1dcacc2016-02-24 14:24:24 -08001789#if MTERP_PROFILE_BRANCHES
1790 // TUNING: once measurements are complete, remove #if and hand-schedule.
1791 EXPORT_PC
1792 mov x0, xSELF
1793 add x1, xFP, #OFF_FP_SHADOWFRAME
1794 sbfm x2, xINST, 0, 31
1795 bl MterpProfileBranch // (self, shadow_frame, offset)
1796 cbnz w0, MterpOnStackReplacement // Note: offset must be in wINST
1797#endif
Bill Buzbeefd522f92016-02-11 22:37:42 +00001798 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
1799 adds w2, wINST, wINST // convert to bytes & set flags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001800 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
1801 b.mi MterpCheckSuspendAndContinue
1802 GET_INST_OPCODE ip // extract opcode from wINST
1803 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001804
1805
1806/* ------------------------------ */
1807 .balign 128
1808.L_op_unused_3e: /* 0x3e */
1809/* File: arm64/op_unused_3e.S */
1810/* File: arm64/unused.S */
1811/*
1812 * Bail to reference interpreter to throw.
1813 */
1814 b MterpFallback
1815
1816
1817/* ------------------------------ */
1818 .balign 128
1819.L_op_unused_3f: /* 0x3f */
1820/* File: arm64/op_unused_3f.S */
1821/* File: arm64/unused.S */
1822/*
1823 * Bail to reference interpreter to throw.
1824 */
1825 b MterpFallback
1826
1827
1828/* ------------------------------ */
1829 .balign 128
1830.L_op_unused_40: /* 0x40 */
1831/* File: arm64/op_unused_40.S */
1832/* File: arm64/unused.S */
1833/*
1834 * Bail to reference interpreter to throw.
1835 */
1836 b MterpFallback
1837
1838
1839/* ------------------------------ */
1840 .balign 128
1841.L_op_unused_41: /* 0x41 */
1842/* File: arm64/op_unused_41.S */
1843/* File: arm64/unused.S */
1844/*
1845 * Bail to reference interpreter to throw.
1846 */
1847 b MterpFallback
1848
1849
1850/* ------------------------------ */
1851 .balign 128
1852.L_op_unused_42: /* 0x42 */
1853/* File: arm64/op_unused_42.S */
1854/* File: arm64/unused.S */
1855/*
1856 * Bail to reference interpreter to throw.
1857 */
1858 b MterpFallback
1859
1860
1861/* ------------------------------ */
1862 .balign 128
1863.L_op_unused_43: /* 0x43 */
1864/* File: arm64/op_unused_43.S */
1865/* File: arm64/unused.S */
1866/*
1867 * Bail to reference interpreter to throw.
1868 */
1869 b MterpFallback
1870
1871
1872/* ------------------------------ */
1873 .balign 128
1874.L_op_aget: /* 0x44 */
1875/* File: arm64/op_aget.S */
1876 /*
1877 * Array get, 32 bits or less. vAA <- vBB[vCC].
1878 *
1879 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1880 * instructions. We use a pair of FETCH_Bs instead.
1881 *
1882 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1883 *
1884 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1885 * If this changes, specialize.
1886 */
1887 /* op vAA, vBB, vCC */
1888 FETCH_B w2, 1, 0 // w2<- BB
1889 lsr w9, wINST, #8 // w9<- AA
1890 FETCH_B w3, 1, 1 // w3<- CC
1891 GET_VREG w0, w2 // w0<- vBB (array object)
1892 GET_VREG w1, w3 // w1<- vCC (requested index)
1893 cbz x0, common_errNullObject // bail if null array object.
1894 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1895 add x0, x0, w1, uxtw #2 // w0<- arrayObj + index*width
1896 cmp w1, w3 // compare unsigned index, length
1897 bcs common_errArrayIndex // index >= length, bail
1898 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1899 ldr w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1900 GET_INST_OPCODE ip // extract opcode from rINST
1901 SET_VREG w2, w9 // vAA<- w2
1902 GOTO_OPCODE ip // jump to next instruction
1903
1904/* ------------------------------ */
1905 .balign 128
1906.L_op_aget_wide: /* 0x45 */
1907/* File: arm64/op_aget_wide.S */
1908 /*
1909 * Array get, 64 bits. vAA <- vBB[vCC].
1910 *
1911 */
1912 /* aget-wide vAA, vBB, vCC */
1913 FETCH w0, 1 // w0<- CCBB
1914 lsr w4, wINST, #8 // w4<- AA
1915 and w2, w0, #255 // w2<- BB
1916 lsr w3, w0, #8 // w3<- CC
1917 GET_VREG w0, w2 // w0<- vBB (array object)
1918 GET_VREG w1, w3 // w1<- vCC (requested index)
1919 cbz w0, common_errNullObject // yes, bail
1920 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1921 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width
1922 cmp w1, w3 // compare unsigned index, length
1923 bcs common_errArrayIndex // index >= length, bail
1924 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1925 ldr x2, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] // x2<- vBB[vCC]
1926 GET_INST_OPCODE ip // extract opcode from wINST
1927 SET_VREG_WIDE x2, w4
1928 GOTO_OPCODE ip // jump to next instruction
1929
1930/* ------------------------------ */
1931 .balign 128
1932.L_op_aget_object: /* 0x46 */
1933/* File: arm64/op_aget_object.S */
1934 /*
1935 * Array object get. vAA <- vBB[vCC].
1936 *
1937 * for: aget-object
1938 */
1939 /* op vAA, vBB, vCC */
1940 FETCH_B w2, 1, 0 // w2<- BB
1941 FETCH_B w3, 1, 1 // w3<- CC
1942 EXPORT_PC
1943 GET_VREG w0, w2 // w0<- vBB (array object)
1944 GET_VREG w1, w3 // w1<- vCC (requested index)
1945 bl artAGetObjectFromMterp // (array, index)
1946 ldr x1, [xSELF, #THREAD_EXCEPTION_OFFSET]
1947 lsr w2, wINST, #8 // w9<- AA
1948 PREFETCH_INST 2
1949 cbnz w1, MterpException
1950 SET_VREG_OBJECT w0, w2
1951 ADVANCE 2
1952 GET_INST_OPCODE ip
1953 GOTO_OPCODE ip // jump to next instruction
1954
1955/* ------------------------------ */
1956 .balign 128
1957.L_op_aget_boolean: /* 0x47 */
1958/* File: arm64/op_aget_boolean.S */
1959/* File: arm64/op_aget.S */
1960 /*
1961 * Array get, 32 bits or less. vAA <- vBB[vCC].
1962 *
1963 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1964 * instructions. We use a pair of FETCH_Bs instead.
1965 *
1966 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1967 *
1968 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1969 * If this changes, specialize.
1970 */
1971 /* op vAA, vBB, vCC */
1972 FETCH_B w2, 1, 0 // w2<- BB
1973 lsr w9, wINST, #8 // w9<- AA
1974 FETCH_B w3, 1, 1 // w3<- CC
1975 GET_VREG w0, w2 // w0<- vBB (array object)
1976 GET_VREG w1, w3 // w1<- vCC (requested index)
1977 cbz x0, common_errNullObject // bail if null array object.
1978 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1979 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width
1980 cmp w1, w3 // compare unsigned index, length
1981 bcs common_errArrayIndex // index >= length, bail
1982 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1983 ldrb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1984 GET_INST_OPCODE ip // extract opcode from rINST
1985 SET_VREG w2, w9 // vAA<- w2
1986 GOTO_OPCODE ip // jump to next instruction
1987
1988
1989/* ------------------------------ */
1990 .balign 128
1991.L_op_aget_byte: /* 0x48 */
1992/* File: arm64/op_aget_byte.S */
1993/* File: arm64/op_aget.S */
1994 /*
1995 * Array get, 32 bits or less. vAA <- vBB[vCC].
1996 *
1997 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1998 * instructions. We use a pair of FETCH_Bs instead.
1999 *
2000 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2001 *
2002 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2003 * If this changes, specialize.
2004 */
2005 /* op vAA, vBB, vCC */
2006 FETCH_B w2, 1, 0 // w2<- BB
2007 lsr w9, wINST, #8 // w9<- AA
2008 FETCH_B w3, 1, 1 // w3<- CC
2009 GET_VREG w0, w2 // w0<- vBB (array object)
2010 GET_VREG w1, w3 // w1<- vCC (requested index)
2011 cbz x0, common_errNullObject // bail if null array object.
2012 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2013 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width
2014 cmp w1, w3 // compare unsigned index, length
2015 bcs common_errArrayIndex // index >= length, bail
2016 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2017 ldrsb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
2018 GET_INST_OPCODE ip // extract opcode from rINST
2019 SET_VREG w2, w9 // vAA<- w2
2020 GOTO_OPCODE ip // jump to next instruction
2021
2022
2023/* ------------------------------ */
2024 .balign 128
2025.L_op_aget_char: /* 0x49 */
2026/* File: arm64/op_aget_char.S */
2027/* File: arm64/op_aget.S */
2028 /*
2029 * Array get, 32 bits or less. vAA <- vBB[vCC].
2030 *
2031 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2032 * instructions. We use a pair of FETCH_Bs instead.
2033 *
2034 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2035 *
2036 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2037 * If this changes, specialize.
2038 */
2039 /* op vAA, vBB, vCC */
2040 FETCH_B w2, 1, 0 // w2<- BB
2041 lsr w9, wINST, #8 // w9<- AA
2042 FETCH_B w3, 1, 1 // w3<- CC
2043 GET_VREG w0, w2 // w0<- vBB (array object)
2044 GET_VREG w1, w3 // w1<- vCC (requested index)
2045 cbz x0, common_errNullObject // bail if null array object.
2046 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2047 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width
2048 cmp w1, w3 // compare unsigned index, length
2049 bcs common_errArrayIndex // index >= length, bail
2050 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2051 ldrh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
2052 GET_INST_OPCODE ip // extract opcode from rINST
2053 SET_VREG w2, w9 // vAA<- w2
2054 GOTO_OPCODE ip // jump to next instruction
2055
2056
2057/* ------------------------------ */
2058 .balign 128
2059.L_op_aget_short: /* 0x4a */
2060/* File: arm64/op_aget_short.S */
2061/* File: arm64/op_aget.S */
2062 /*
2063 * Array get, 32 bits or less. vAA <- vBB[vCC].
2064 *
2065 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2066 * instructions. We use a pair of FETCH_Bs instead.
2067 *
2068 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
2069 *
2070 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2071 * If this changes, specialize.
2072 */
2073 /* op vAA, vBB, vCC */
2074 FETCH_B w2, 1, 0 // w2<- BB
2075 lsr w9, wINST, #8 // w9<- AA
2076 FETCH_B w3, 1, 1 // w3<- CC
2077 GET_VREG w0, w2 // w0<- vBB (array object)
2078 GET_VREG w1, w3 // w1<- vCC (requested index)
2079 cbz x0, common_errNullObject // bail if null array object.
2080 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2081 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width
2082 cmp w1, w3 // compare unsigned index, length
2083 bcs common_errArrayIndex // index >= length, bail
2084 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2085 ldrsh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
2086 GET_INST_OPCODE ip // extract opcode from rINST
2087 SET_VREG w2, w9 // vAA<- w2
2088 GOTO_OPCODE ip // jump to next instruction
2089
2090
2091/* ------------------------------ */
2092 .balign 128
2093.L_op_aput: /* 0x4b */
2094/* File: arm64/op_aput.S */
2095 /*
2096 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2097 *
2098 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2099 * instructions. We use a pair of FETCH_Bs instead.
2100 *
2101 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2102 *
2103 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2104 * If this changes, specialize.
2105 */
2106 /* op vAA, vBB, vCC */
2107 FETCH_B w2, 1, 0 // w2<- BB
2108 lsr w9, wINST, #8 // w9<- AA
2109 FETCH_B w3, 1, 1 // w3<- CC
2110 GET_VREG w0, w2 // w0<- vBB (array object)
2111 GET_VREG w1, w3 // w1<- vCC (requested index)
2112 cbz w0, common_errNullObject // bail if null
2113 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2114 add x0, x0, w1, lsl #2 // w0<- arrayObj + index*width
2115 cmp w1, w3 // compare unsigned index, length
2116 bcs common_errArrayIndex // index >= length, bail
2117 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2118 GET_VREG w2, w9 // w2<- vAA
2119 GET_INST_OPCODE ip // extract opcode from rINST
2120 str w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2121 GOTO_OPCODE ip // jump to next instruction
2122
2123/* ------------------------------ */
2124 .balign 128
2125.L_op_aput_wide: /* 0x4c */
2126/* File: arm64/op_aput_wide.S */
2127 /*
2128 * Array put, 64 bits. vBB[vCC] <- vAA.
2129 *
2130 */
2131 /* aput-wide vAA, vBB, vCC */
2132 FETCH w0, 1 // w0<- CCBB
2133 lsr w4, wINST, #8 // w4<- AA
2134 and w2, w0, #255 // w2<- BB
2135 lsr w3, w0, #8 // w3<- CC
2136 GET_VREG w0, w2 // w0<- vBB (array object)
2137 GET_VREG w1, w3 // w1<- vCC (requested index)
2138 cbz w0, common_errNullObject // bail if null
2139 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2140 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width
2141 cmp w1, w3 // compare unsigned index, length
2142 bcs common_errArrayIndex // index >= length, bail
2143 GET_VREG_WIDE x1, w4
2144 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
2145 GET_INST_OPCODE ip // extract opcode from wINST
2146 str x1, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET]
2147 GOTO_OPCODE ip // jump to next instruction
2148
2149/* ------------------------------ */
2150 .balign 128
2151.L_op_aput_object: /* 0x4d */
2152/* File: arm64/op_aput_object.S */
2153 /*
2154 * Store an object into an array. vBB[vCC] <- vAA.
2155 */
2156 /* op vAA, vBB, vCC */
2157 EXPORT_PC
2158 add x0, xFP, #OFF_FP_SHADOWFRAME
2159 mov x1, xPC
2160 mov w2, wINST
2161 bl MterpAputObject
2162 cbz w0, MterpPossibleException
2163 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2164 GET_INST_OPCODE ip // extract opcode from rINST
2165 GOTO_OPCODE ip // jump to next instruction
2166
2167/* ------------------------------ */
2168 .balign 128
2169.L_op_aput_boolean: /* 0x4e */
2170/* File: arm64/op_aput_boolean.S */
2171/* File: arm64/op_aput.S */
2172 /*
2173 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2174 *
2175 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2176 * instructions. We use a pair of FETCH_Bs instead.
2177 *
2178 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2179 *
2180 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2181 * If this changes, specialize.
2182 */
2183 /* op vAA, vBB, vCC */
2184 FETCH_B w2, 1, 0 // w2<- BB
2185 lsr w9, wINST, #8 // w9<- AA
2186 FETCH_B w3, 1, 1 // w3<- CC
2187 GET_VREG w0, w2 // w0<- vBB (array object)
2188 GET_VREG w1, w3 // w1<- vCC (requested index)
2189 cbz w0, common_errNullObject // bail if null
2190 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2191 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width
2192 cmp w1, w3 // compare unsigned index, length
2193 bcs common_errArrayIndex // index >= length, bail
2194 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2195 GET_VREG w2, w9 // w2<- vAA
2196 GET_INST_OPCODE ip // extract opcode from rINST
2197 strb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2198 GOTO_OPCODE ip // jump to next instruction
2199
2200
2201/* ------------------------------ */
2202 .balign 128
2203.L_op_aput_byte: /* 0x4f */
2204/* File: arm64/op_aput_byte.S */
2205/* File: arm64/op_aput.S */
2206 /*
2207 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2208 *
2209 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2210 * instructions. We use a pair of FETCH_Bs instead.
2211 *
2212 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2213 *
2214 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2215 * If this changes, specialize.
2216 */
2217 /* op vAA, vBB, vCC */
2218 FETCH_B w2, 1, 0 // w2<- BB
2219 lsr w9, wINST, #8 // w9<- AA
2220 FETCH_B w3, 1, 1 // w3<- CC
2221 GET_VREG w0, w2 // w0<- vBB (array object)
2222 GET_VREG w1, w3 // w1<- vCC (requested index)
2223 cbz w0, common_errNullObject // bail if null
2224 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2225 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width
2226 cmp w1, w3 // compare unsigned index, length
2227 bcs common_errArrayIndex // index >= length, bail
2228 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2229 GET_VREG w2, w9 // w2<- vAA
2230 GET_INST_OPCODE ip // extract opcode from rINST
2231 strb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2232 GOTO_OPCODE ip // jump to next instruction
2233
2234
2235/* ------------------------------ */
2236 .balign 128
2237.L_op_aput_char: /* 0x50 */
2238/* File: arm64/op_aput_char.S */
2239/* File: arm64/op_aput.S */
2240 /*
2241 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2242 *
2243 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2244 * instructions. We use a pair of FETCH_Bs instead.
2245 *
2246 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2247 *
2248 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2249 * If this changes, specialize.
2250 */
2251 /* op vAA, vBB, vCC */
2252 FETCH_B w2, 1, 0 // w2<- BB
2253 lsr w9, wINST, #8 // w9<- AA
2254 FETCH_B w3, 1, 1 // w3<- CC
2255 GET_VREG w0, w2 // w0<- vBB (array object)
2256 GET_VREG w1, w3 // w1<- vCC (requested index)
2257 cbz w0, common_errNullObject // bail if null
2258 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2259 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width
2260 cmp w1, w3 // compare unsigned index, length
2261 bcs common_errArrayIndex // index >= length, bail
2262 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2263 GET_VREG w2, w9 // w2<- vAA
2264 GET_INST_OPCODE ip // extract opcode from rINST
2265 strh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2266 GOTO_OPCODE ip // jump to next instruction
2267
2268
2269/* ------------------------------ */
2270 .balign 128
2271.L_op_aput_short: /* 0x51 */
2272/* File: arm64/op_aput_short.S */
2273/* File: arm64/op_aput.S */
2274 /*
2275 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2276 *
2277 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2278 * instructions. We use a pair of FETCH_Bs instead.
2279 *
2280 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2281 *
2282 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2283 * If this changes, specialize.
2284 */
2285 /* op vAA, vBB, vCC */
2286 FETCH_B w2, 1, 0 // w2<- BB
2287 lsr w9, wINST, #8 // w9<- AA
2288 FETCH_B w3, 1, 1 // w3<- CC
2289 GET_VREG w0, w2 // w0<- vBB (array object)
2290 GET_VREG w1, w3 // w1<- vCC (requested index)
2291 cbz w0, common_errNullObject // bail if null
2292 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2293 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width
2294 cmp w1, w3 // compare unsigned index, length
2295 bcs common_errArrayIndex // index >= length, bail
2296 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2297 GET_VREG w2, w9 // w2<- vAA
2298 GET_INST_OPCODE ip // extract opcode from rINST
2299 strh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2300 GOTO_OPCODE ip // jump to next instruction
2301
2302
2303/* ------------------------------ */
2304 .balign 128
2305.L_op_iget: /* 0x52 */
2306/* File: arm64/op_iget.S */
2307 /*
2308 * General instance field get.
2309 *
2310 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2311 */
2312 EXPORT_PC
2313 FETCH w0, 1 // w0<- field ref CCCC
2314 lsr w1, wINST, #12 // w1<- B
2315 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2316 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2317 mov x3, xSELF // w3<- self
2318 bl artGet32InstanceFromCode
2319 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002320
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002321 ubfx w2, wINST, #8, #4 // w2<- A
2322 PREFETCH_INST 2
2323 cbnz x3, MterpPossibleException // bail out
2324 .if 0
2325 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2326 .else
2327 SET_VREG w0, w2 // fp[A]<- w0
2328 .endif
2329 ADVANCE 2
2330 GET_INST_OPCODE ip // extract opcode from rINST
2331 GOTO_OPCODE ip // jump to next instruction
2332
2333/* ------------------------------ */
2334 .balign 128
2335.L_op_iget_wide: /* 0x53 */
2336/* File: arm64/op_iget_wide.S */
2337 /*
2338 * 64-bit instance field get.
2339 *
2340 * for: iget-wide
2341 */
2342 EXPORT_PC
2343 FETCH w0, 1 // w0<- field ref CCCC
2344 lsr w1, wINST, #12 // w1<- B
2345 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2346 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2347 mov x3, xSELF // w3<- self
2348 bl artGet64InstanceFromCode
2349 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2350 ubfx w2, wINST, #8, #4 // w2<- A
2351 PREFETCH_INST 2
2352 cmp w3, #0
2353 cbnz w3, MterpException // bail out
2354 SET_VREG_WIDE x0, w2
2355 ADVANCE 2
2356 GET_INST_OPCODE ip // extract opcode from wINST
2357 GOTO_OPCODE ip // jump to next instruction
2358
2359/* ------------------------------ */
2360 .balign 128
2361.L_op_iget_object: /* 0x54 */
2362/* File: arm64/op_iget_object.S */
2363/* File: arm64/op_iget.S */
2364 /*
2365 * General instance field get.
2366 *
2367 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2368 */
2369 EXPORT_PC
2370 FETCH w0, 1 // w0<- field ref CCCC
2371 lsr w1, wINST, #12 // w1<- B
2372 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2373 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2374 mov x3, xSELF // w3<- self
2375 bl artGetObjInstanceFromCode
2376 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002377
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002378 ubfx w2, wINST, #8, #4 // w2<- A
2379 PREFETCH_INST 2
2380 cbnz x3, MterpPossibleException // bail out
2381 .if 1
2382 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2383 .else
2384 SET_VREG w0, w2 // fp[A]<- w0
2385 .endif
2386 ADVANCE 2
2387 GET_INST_OPCODE ip // extract opcode from rINST
2388 GOTO_OPCODE ip // jump to next instruction
2389
2390
2391/* ------------------------------ */
2392 .balign 128
2393.L_op_iget_boolean: /* 0x55 */
2394/* File: arm64/op_iget_boolean.S */
2395/* File: arm64/op_iget.S */
2396 /*
2397 * General instance field get.
2398 *
2399 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2400 */
2401 EXPORT_PC
2402 FETCH w0, 1 // w0<- field ref CCCC
2403 lsr w1, wINST, #12 // w1<- B
2404 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2405 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2406 mov x3, xSELF // w3<- self
2407 bl artGetBooleanInstanceFromCode
2408 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002409 uxtb w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002410 ubfx w2, wINST, #8, #4 // w2<- A
2411 PREFETCH_INST 2
2412 cbnz x3, MterpPossibleException // bail out
2413 .if 0
2414 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2415 .else
2416 SET_VREG w0, w2 // fp[A]<- w0
2417 .endif
2418 ADVANCE 2
2419 GET_INST_OPCODE ip // extract opcode from rINST
2420 GOTO_OPCODE ip // jump to next instruction
2421
2422
2423/* ------------------------------ */
2424 .balign 128
2425.L_op_iget_byte: /* 0x56 */
2426/* File: arm64/op_iget_byte.S */
2427/* File: arm64/op_iget.S */
2428 /*
2429 * General instance field get.
2430 *
2431 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2432 */
2433 EXPORT_PC
2434 FETCH w0, 1 // w0<- field ref CCCC
2435 lsr w1, wINST, #12 // w1<- B
2436 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2437 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2438 mov x3, xSELF // w3<- self
2439 bl artGetByteInstanceFromCode
2440 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002441 sxtb w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002442 ubfx w2, wINST, #8, #4 // w2<- A
2443 PREFETCH_INST 2
2444 cbnz x3, MterpPossibleException // bail out
2445 .if 0
2446 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2447 .else
2448 SET_VREG w0, w2 // fp[A]<- w0
2449 .endif
2450 ADVANCE 2
2451 GET_INST_OPCODE ip // extract opcode from rINST
2452 GOTO_OPCODE ip // jump to next instruction
2453
2454
2455/* ------------------------------ */
2456 .balign 128
2457.L_op_iget_char: /* 0x57 */
2458/* File: arm64/op_iget_char.S */
2459/* File: arm64/op_iget.S */
2460 /*
2461 * General instance field get.
2462 *
2463 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2464 */
2465 EXPORT_PC
2466 FETCH w0, 1 // w0<- field ref CCCC
2467 lsr w1, wINST, #12 // w1<- B
2468 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2469 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2470 mov x3, xSELF // w3<- self
2471 bl artGetCharInstanceFromCode
2472 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002473 uxth w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002474 ubfx w2, wINST, #8, #4 // w2<- A
2475 PREFETCH_INST 2
2476 cbnz x3, MterpPossibleException // bail out
2477 .if 0
2478 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2479 .else
2480 SET_VREG w0, w2 // fp[A]<- w0
2481 .endif
2482 ADVANCE 2
2483 GET_INST_OPCODE ip // extract opcode from rINST
2484 GOTO_OPCODE ip // jump to next instruction
2485
2486
2487/* ------------------------------ */
2488 .balign 128
2489.L_op_iget_short: /* 0x58 */
2490/* File: arm64/op_iget_short.S */
2491/* File: arm64/op_iget.S */
2492 /*
2493 * General instance field get.
2494 *
2495 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2496 */
2497 EXPORT_PC
2498 FETCH w0, 1 // w0<- field ref CCCC
2499 lsr w1, wINST, #12 // w1<- B
2500 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2501 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2502 mov x3, xSELF // w3<- self
2503 bl artGetShortInstanceFromCode
2504 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002505 sxth w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002506 ubfx w2, wINST, #8, #4 // w2<- A
2507 PREFETCH_INST 2
2508 cbnz x3, MterpPossibleException // bail out
2509 .if 0
2510 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2511 .else
2512 SET_VREG w0, w2 // fp[A]<- w0
2513 .endif
2514 ADVANCE 2
2515 GET_INST_OPCODE ip // extract opcode from rINST
2516 GOTO_OPCODE ip // jump to next instruction
2517
2518
2519/* ------------------------------ */
2520 .balign 128
2521.L_op_iput: /* 0x59 */
2522/* File: arm64/op_iput.S */
2523 /*
2524 * General 32-bit instance field put.
2525 *
2526 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2527 */
2528 /* op vA, vB, field//CCCC */
2529 .extern artSet32InstanceFromMterp
2530 EXPORT_PC
2531 FETCH w0, 1 // w0<- field ref CCCC
2532 lsr w1, wINST, #12 // w1<- B
2533 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2534 ubfx w2, wINST, #8, #4 // w2<- A
2535 GET_VREG w2, w2 // w2<- fp[A]
2536 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2537 PREFETCH_INST 2
2538 bl artSet32InstanceFromMterp
2539 cbnz w0, MterpPossibleException
2540 ADVANCE 2 // advance rPC
2541 GET_INST_OPCODE ip // extract opcode from rINST
2542 GOTO_OPCODE ip // jump to next instruction
2543
2544/* ------------------------------ */
2545 .balign 128
2546.L_op_iput_wide: /* 0x5a */
2547/* File: arm64/op_iput_wide.S */
2548 /* iput-wide vA, vB, field//CCCC */
2549 .extern artSet64InstanceFromMterp
2550 EXPORT_PC
2551 FETCH w0, 1 // w0<- field ref CCCC
2552 lsr w1, wINST, #12 // w1<- B
2553 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2554 ubfx w2, wINST, #8, #4 // w2<- A
2555 add x2, xFP, x2, lsl #2 // w2<- &fp[A]
2556 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2557 PREFETCH_INST 2
2558 bl artSet64InstanceFromMterp
2559 cbnz w0, MterpPossibleException
2560 ADVANCE 2 // advance rPC
2561 GET_INST_OPCODE ip // extract opcode from wINST
2562 GOTO_OPCODE ip // jump to next instruction
2563
2564/* ------------------------------ */
2565 .balign 128
2566.L_op_iput_object: /* 0x5b */
2567/* File: arm64/op_iput_object.S */
2568 EXPORT_PC
2569 add x0, xFP, #OFF_FP_SHADOWFRAME
2570 mov x1, xPC
2571 mov w2, wINST
2572 mov x3, xSELF
2573 bl MterpIputObject
2574 cbz w0, MterpException
2575 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2576 GET_INST_OPCODE ip // extract opcode from rINST
2577 GOTO_OPCODE ip // jump to next instruction
2578
2579/* ------------------------------ */
2580 .balign 128
2581.L_op_iput_boolean: /* 0x5c */
2582/* File: arm64/op_iput_boolean.S */
2583/* File: arm64/op_iput.S */
2584 /*
2585 * General 32-bit instance field put.
2586 *
2587 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2588 */
2589 /* op vA, vB, field//CCCC */
2590 .extern artSet8InstanceFromMterp
2591 EXPORT_PC
2592 FETCH w0, 1 // w0<- field ref CCCC
2593 lsr w1, wINST, #12 // w1<- B
2594 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2595 ubfx w2, wINST, #8, #4 // w2<- A
2596 GET_VREG w2, w2 // w2<- fp[A]
2597 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2598 PREFETCH_INST 2
2599 bl artSet8InstanceFromMterp
2600 cbnz w0, MterpPossibleException
2601 ADVANCE 2 // advance rPC
2602 GET_INST_OPCODE ip // extract opcode from rINST
2603 GOTO_OPCODE ip // jump to next instruction
2604
2605
2606/* ------------------------------ */
2607 .balign 128
2608.L_op_iput_byte: /* 0x5d */
2609/* File: arm64/op_iput_byte.S */
2610/* File: arm64/op_iput.S */
2611 /*
2612 * General 32-bit instance field put.
2613 *
2614 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2615 */
2616 /* op vA, vB, field//CCCC */
2617 .extern artSet8InstanceFromMterp
2618 EXPORT_PC
2619 FETCH w0, 1 // w0<- field ref CCCC
2620 lsr w1, wINST, #12 // w1<- B
2621 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2622 ubfx w2, wINST, #8, #4 // w2<- A
2623 GET_VREG w2, w2 // w2<- fp[A]
2624 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2625 PREFETCH_INST 2
2626 bl artSet8InstanceFromMterp
2627 cbnz w0, MterpPossibleException
2628 ADVANCE 2 // advance rPC
2629 GET_INST_OPCODE ip // extract opcode from rINST
2630 GOTO_OPCODE ip // jump to next instruction
2631
2632
2633/* ------------------------------ */
2634 .balign 128
2635.L_op_iput_char: /* 0x5e */
2636/* File: arm64/op_iput_char.S */
2637/* File: arm64/op_iput.S */
2638 /*
2639 * General 32-bit instance field put.
2640 *
2641 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2642 */
2643 /* op vA, vB, field//CCCC */
2644 .extern artSet16InstanceFromMterp
2645 EXPORT_PC
2646 FETCH w0, 1 // w0<- field ref CCCC
2647 lsr w1, wINST, #12 // w1<- B
2648 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2649 ubfx w2, wINST, #8, #4 // w2<- A
2650 GET_VREG w2, w2 // w2<- fp[A]
2651 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2652 PREFETCH_INST 2
2653 bl artSet16InstanceFromMterp
2654 cbnz w0, MterpPossibleException
2655 ADVANCE 2 // advance rPC
2656 GET_INST_OPCODE ip // extract opcode from rINST
2657 GOTO_OPCODE ip // jump to next instruction
2658
2659
2660/* ------------------------------ */
2661 .balign 128
2662.L_op_iput_short: /* 0x5f */
2663/* File: arm64/op_iput_short.S */
2664/* File: arm64/op_iput.S */
2665 /*
2666 * General 32-bit instance field put.
2667 *
2668 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2669 */
2670 /* op vA, vB, field//CCCC */
2671 .extern artSet16InstanceFromMterp
2672 EXPORT_PC
2673 FETCH w0, 1 // w0<- field ref CCCC
2674 lsr w1, wINST, #12 // w1<- B
2675 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2676 ubfx w2, wINST, #8, #4 // w2<- A
2677 GET_VREG w2, w2 // w2<- fp[A]
2678 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2679 PREFETCH_INST 2
2680 bl artSet16InstanceFromMterp
2681 cbnz w0, MterpPossibleException
2682 ADVANCE 2 // advance rPC
2683 GET_INST_OPCODE ip // extract opcode from rINST
2684 GOTO_OPCODE ip // jump to next instruction
2685
2686
2687/* ------------------------------ */
2688 .balign 128
2689.L_op_sget: /* 0x60 */
2690/* File: arm64/op_sget.S */
2691 /*
2692 * General SGET handler wrapper.
2693 *
2694 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2695 */
2696 /* op vAA, field//BBBB */
2697
2698 .extern artGet32StaticFromCode
2699 EXPORT_PC
2700 FETCH w0, 1 // w0<- field ref BBBB
2701 ldr x1, [xFP, #OFF_FP_METHOD]
2702 mov x2, xSELF
2703 bl artGet32StaticFromCode
2704 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2705 lsr w2, wINST, #8 // w2<- AA
2706
2707 PREFETCH_INST 2
2708 cbnz x3, MterpException // bail out
2709.if 0
2710 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2711.else
2712 SET_VREG w0, w2 // fp[AA]<- w0
2713.endif
2714 ADVANCE 2
2715 GET_INST_OPCODE ip // extract opcode from rINST
2716 GOTO_OPCODE ip
2717
2718/* ------------------------------ */
2719 .balign 128
2720.L_op_sget_wide: /* 0x61 */
2721/* File: arm64/op_sget_wide.S */
2722 /*
2723 * SGET_WIDE handler wrapper.
2724 *
2725 */
2726 /* sget-wide vAA, field//BBBB */
2727
2728 .extern artGet64StaticFromCode
2729 EXPORT_PC
2730 FETCH w0, 1 // w0<- field ref BBBB
2731 ldr x1, [xFP, #OFF_FP_METHOD]
2732 mov x2, xSELF
2733 bl artGet64StaticFromCode
2734 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2735 lsr w4, wINST, #8 // w4<- AA
2736 cbnz x3, MterpException // bail out
2737 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
2738 SET_VREG_WIDE x0, w4
2739 GET_INST_OPCODE ip // extract opcode from wINST
2740 GOTO_OPCODE ip // jump to next instruction
2741
2742/* ------------------------------ */
2743 .balign 128
2744.L_op_sget_object: /* 0x62 */
2745/* File: arm64/op_sget_object.S */
2746/* File: arm64/op_sget.S */
2747 /*
2748 * General SGET handler wrapper.
2749 *
2750 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2751 */
2752 /* op vAA, field//BBBB */
2753
2754 .extern artGetObjStaticFromCode
2755 EXPORT_PC
2756 FETCH w0, 1 // w0<- field ref BBBB
2757 ldr x1, [xFP, #OFF_FP_METHOD]
2758 mov x2, xSELF
2759 bl artGetObjStaticFromCode
2760 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2761 lsr w2, wINST, #8 // w2<- AA
2762
2763 PREFETCH_INST 2
2764 cbnz x3, MterpException // bail out
2765.if 1
2766 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2767.else
2768 SET_VREG w0, w2 // fp[AA]<- w0
2769.endif
2770 ADVANCE 2
2771 GET_INST_OPCODE ip // extract opcode from rINST
2772 GOTO_OPCODE ip
2773
2774
2775/* ------------------------------ */
2776 .balign 128
2777.L_op_sget_boolean: /* 0x63 */
2778/* File: arm64/op_sget_boolean.S */
2779/* File: arm64/op_sget.S */
2780 /*
2781 * General SGET handler wrapper.
2782 *
2783 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2784 */
2785 /* op vAA, field//BBBB */
2786
2787 .extern artGetBooleanStaticFromCode
2788 EXPORT_PC
2789 FETCH w0, 1 // w0<- field ref BBBB
2790 ldr x1, [xFP, #OFF_FP_METHOD]
2791 mov x2, xSELF
2792 bl artGetBooleanStaticFromCode
2793 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2794 lsr w2, wINST, #8 // w2<- AA
2795 uxtb w0, w0
2796 PREFETCH_INST 2
2797 cbnz x3, MterpException // bail out
2798.if 0
2799 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2800.else
2801 SET_VREG w0, w2 // fp[AA]<- w0
2802.endif
2803 ADVANCE 2
2804 GET_INST_OPCODE ip // extract opcode from rINST
2805 GOTO_OPCODE ip
2806
2807
2808/* ------------------------------ */
2809 .balign 128
2810.L_op_sget_byte: /* 0x64 */
2811/* File: arm64/op_sget_byte.S */
2812/* File: arm64/op_sget.S */
2813 /*
2814 * General SGET handler wrapper.
2815 *
2816 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2817 */
2818 /* op vAA, field//BBBB */
2819
2820 .extern artGetByteStaticFromCode
2821 EXPORT_PC
2822 FETCH w0, 1 // w0<- field ref BBBB
2823 ldr x1, [xFP, #OFF_FP_METHOD]
2824 mov x2, xSELF
2825 bl artGetByteStaticFromCode
2826 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2827 lsr w2, wINST, #8 // w2<- AA
2828 sxtb w0, w0
2829 PREFETCH_INST 2
2830 cbnz x3, MterpException // bail out
2831.if 0
2832 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2833.else
2834 SET_VREG w0, w2 // fp[AA]<- w0
2835.endif
2836 ADVANCE 2
2837 GET_INST_OPCODE ip // extract opcode from rINST
2838 GOTO_OPCODE ip
2839
2840
2841/* ------------------------------ */
2842 .balign 128
2843.L_op_sget_char: /* 0x65 */
2844/* File: arm64/op_sget_char.S */
2845/* File: arm64/op_sget.S */
2846 /*
2847 * General SGET handler wrapper.
2848 *
2849 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2850 */
2851 /* op vAA, field//BBBB */
2852
2853 .extern artGetCharStaticFromCode
2854 EXPORT_PC
2855 FETCH w0, 1 // w0<- field ref BBBB
2856 ldr x1, [xFP, #OFF_FP_METHOD]
2857 mov x2, xSELF
2858 bl artGetCharStaticFromCode
2859 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2860 lsr w2, wINST, #8 // w2<- AA
2861 uxth w0, w0
2862 PREFETCH_INST 2
2863 cbnz x3, MterpException // bail out
2864.if 0
2865 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2866.else
2867 SET_VREG w0, w2 // fp[AA]<- w0
2868.endif
2869 ADVANCE 2
2870 GET_INST_OPCODE ip // extract opcode from rINST
2871 GOTO_OPCODE ip
2872
2873
2874/* ------------------------------ */
2875 .balign 128
2876.L_op_sget_short: /* 0x66 */
2877/* File: arm64/op_sget_short.S */
2878/* File: arm64/op_sget.S */
2879 /*
2880 * General SGET handler wrapper.
2881 *
2882 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2883 */
2884 /* op vAA, field//BBBB */
2885
2886 .extern artGetShortStaticFromCode
2887 EXPORT_PC
2888 FETCH w0, 1 // w0<- field ref BBBB
2889 ldr x1, [xFP, #OFF_FP_METHOD]
2890 mov x2, xSELF
2891 bl artGetShortStaticFromCode
2892 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2893 lsr w2, wINST, #8 // w2<- AA
2894 sxth w0, w0
2895 PREFETCH_INST 2
2896 cbnz x3, MterpException // bail out
2897.if 0
2898 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2899.else
2900 SET_VREG w0, w2 // fp[AA]<- w0
2901.endif
2902 ADVANCE 2
2903 GET_INST_OPCODE ip // extract opcode from rINST
2904 GOTO_OPCODE ip
2905
2906
2907/* ------------------------------ */
2908 .balign 128
2909.L_op_sput: /* 0x67 */
2910/* File: arm64/op_sput.S */
2911 /*
2912 * General SPUT handler wrapper.
2913 *
2914 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2915 */
2916 /* op vAA, field//BBBB */
2917 EXPORT_PC
2918 FETCH w0, 1 // r0<- field ref BBBB
2919 lsr w3, wINST, #8 // r3<- AA
2920 GET_VREG w1, w3 // r1<= fp[AA]
2921 ldr x2, [xFP, #OFF_FP_METHOD]
2922 mov x3, xSELF
2923 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2924 bl artSet32StaticFromCode
2925 cbnz w0, MterpException // 0 on success
2926 ADVANCE 2 // Past exception point - now advance rPC
2927 GET_INST_OPCODE ip // extract opcode from rINST
2928 GOTO_OPCODE ip // jump to next instruction
2929
2930/* ------------------------------ */
2931 .balign 128
2932.L_op_sput_wide: /* 0x68 */
2933/* File: arm64/op_sput_wide.S */
2934 /*
2935 * SPUT_WIDE handler wrapper.
2936 *
2937 */
2938 /* sput-wide vAA, field//BBBB */
2939 .extern artSet64IndirectStaticFromMterp
2940 EXPORT_PC
2941 FETCH w0, 1 // w0<- field ref BBBB
2942 ldr x1, [xFP, #OFF_FP_METHOD]
2943 lsr w2, wINST, #8 // w3<- AA
2944 add x2, xFP, w2, lsl #2
2945 mov x3, xSELF
2946 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2947 bl artSet64IndirectStaticFromMterp
2948 cbnz w0, MterpException // 0 on success, -1 on failure
2949 ADVANCE 2 // Past exception point - now advance rPC
2950 GET_INST_OPCODE ip // extract opcode from wINST
2951 GOTO_OPCODE ip // jump to next instruction
2952
2953/* ------------------------------ */
2954 .balign 128
2955.L_op_sput_object: /* 0x69 */
2956/* File: arm64/op_sput_object.S */
2957 EXPORT_PC
2958 add x0, xFP, #OFF_FP_SHADOWFRAME
2959 mov x1, xPC
2960 mov x2, xINST
2961 mov x3, xSELF
2962 bl MterpSputObject
2963 cbz w0, MterpException
2964 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2965 GET_INST_OPCODE ip // extract opcode from rINST
2966 GOTO_OPCODE ip // jump to next instruction
2967
2968/* ------------------------------ */
2969 .balign 128
2970.L_op_sput_boolean: /* 0x6a */
2971/* File: arm64/op_sput_boolean.S */
2972/* File: arm64/op_sput.S */
2973 /*
2974 * General SPUT handler wrapper.
2975 *
2976 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2977 */
2978 /* op vAA, field//BBBB */
2979 EXPORT_PC
2980 FETCH w0, 1 // r0<- field ref BBBB
2981 lsr w3, wINST, #8 // r3<- AA
2982 GET_VREG w1, w3 // r1<= fp[AA]
2983 ldr x2, [xFP, #OFF_FP_METHOD]
2984 mov x3, xSELF
2985 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2986 bl artSet8StaticFromCode
2987 cbnz w0, MterpException // 0 on success
2988 ADVANCE 2 // Past exception point - now advance rPC
2989 GET_INST_OPCODE ip // extract opcode from rINST
2990 GOTO_OPCODE ip // jump to next instruction
2991
2992
2993/* ------------------------------ */
2994 .balign 128
2995.L_op_sput_byte: /* 0x6b */
2996/* File: arm64/op_sput_byte.S */
2997/* File: arm64/op_sput.S */
2998 /*
2999 * General SPUT handler wrapper.
3000 *
3001 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3002 */
3003 /* op vAA, field//BBBB */
3004 EXPORT_PC
3005 FETCH w0, 1 // r0<- field ref BBBB
3006 lsr w3, wINST, #8 // r3<- AA
3007 GET_VREG w1, w3 // r1<= fp[AA]
3008 ldr x2, [xFP, #OFF_FP_METHOD]
3009 mov x3, xSELF
3010 PREFETCH_INST 2 // Get next inst, but don't advance rPC
3011 bl artSet8StaticFromCode
3012 cbnz w0, MterpException // 0 on success
3013 ADVANCE 2 // Past exception point - now advance rPC
3014 GET_INST_OPCODE ip // extract opcode from rINST
3015 GOTO_OPCODE ip // jump to next instruction
3016
3017
3018/* ------------------------------ */
3019 .balign 128
3020.L_op_sput_char: /* 0x6c */
3021/* File: arm64/op_sput_char.S */
3022/* File: arm64/op_sput.S */
3023 /*
3024 * General SPUT handler wrapper.
3025 *
3026 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3027 */
3028 /* op vAA, field//BBBB */
3029 EXPORT_PC
3030 FETCH w0, 1 // r0<- field ref BBBB
3031 lsr w3, wINST, #8 // r3<- AA
3032 GET_VREG w1, w3 // r1<= fp[AA]
3033 ldr x2, [xFP, #OFF_FP_METHOD]
3034 mov x3, xSELF
3035 PREFETCH_INST 2 // Get next inst, but don't advance rPC
3036 bl artSet16StaticFromCode
3037 cbnz w0, MterpException // 0 on success
3038 ADVANCE 2 // Past exception point - now advance rPC
3039 GET_INST_OPCODE ip // extract opcode from rINST
3040 GOTO_OPCODE ip // jump to next instruction
3041
3042
3043/* ------------------------------ */
3044 .balign 128
3045.L_op_sput_short: /* 0x6d */
3046/* File: arm64/op_sput_short.S */
3047/* File: arm64/op_sput.S */
3048 /*
3049 * General SPUT handler wrapper.
3050 *
3051 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3052 */
3053 /* op vAA, field//BBBB */
3054 EXPORT_PC
3055 FETCH w0, 1 // r0<- field ref BBBB
3056 lsr w3, wINST, #8 // r3<- AA
3057 GET_VREG w1, w3 // r1<= fp[AA]
3058 ldr x2, [xFP, #OFF_FP_METHOD]
3059 mov x3, xSELF
3060 PREFETCH_INST 2 // Get next inst, but don't advance rPC
3061 bl artSet16StaticFromCode
3062 cbnz w0, MterpException // 0 on success
3063 ADVANCE 2 // Past exception point - now advance rPC
3064 GET_INST_OPCODE ip // extract opcode from rINST
3065 GOTO_OPCODE ip // jump to next instruction
3066
3067
3068/* ------------------------------ */
3069 .balign 128
3070.L_op_invoke_virtual: /* 0x6e */
3071/* File: arm64/op_invoke_virtual.S */
3072/* File: arm64/invoke.S */
3073 /*
3074 * Generic invoke handler wrapper.
3075 */
3076 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3077 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3078 .extern MterpInvokeVirtual
3079 EXPORT_PC
3080 mov x0, xSELF
3081 add x1, xFP, #OFF_FP_SHADOWFRAME
3082 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003083 mov x3, xINST
3084 bl MterpInvokeVirtual
3085 cbz w0, MterpException
3086 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003087 bl MterpShouldSwitchInterpreters
3088 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003089 GET_INST_OPCODE ip
3090 GOTO_OPCODE ip
3091
3092
3093 /*
3094 * Handle a virtual method call.
3095 *
3096 * for: invoke-virtual, invoke-virtual/range
3097 */
3098 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3099 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3100
3101/* ------------------------------ */
3102 .balign 128
3103.L_op_invoke_super: /* 0x6f */
3104/* File: arm64/op_invoke_super.S */
3105/* File: arm64/invoke.S */
3106 /*
3107 * Generic invoke handler wrapper.
3108 */
3109 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3110 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3111 .extern MterpInvokeSuper
3112 EXPORT_PC
3113 mov x0, xSELF
3114 add x1, xFP, #OFF_FP_SHADOWFRAME
3115 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003116 mov x3, xINST
3117 bl MterpInvokeSuper
3118 cbz w0, MterpException
3119 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003120 bl MterpShouldSwitchInterpreters
3121 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003122 GET_INST_OPCODE ip
3123 GOTO_OPCODE ip
3124
3125
3126 /*
3127 * Handle a "super" method call.
3128 *
3129 * for: invoke-super, invoke-super/range
3130 */
3131 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3132 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3133
3134/* ------------------------------ */
3135 .balign 128
3136.L_op_invoke_direct: /* 0x70 */
3137/* File: arm64/op_invoke_direct.S */
3138/* File: arm64/invoke.S */
3139 /*
3140 * Generic invoke handler wrapper.
3141 */
3142 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3143 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3144 .extern MterpInvokeDirect
3145 EXPORT_PC
3146 mov x0, xSELF
3147 add x1, xFP, #OFF_FP_SHADOWFRAME
3148 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003149 mov x3, xINST
3150 bl MterpInvokeDirect
3151 cbz w0, MterpException
3152 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003153 bl MterpShouldSwitchInterpreters
3154 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003155 GET_INST_OPCODE ip
3156 GOTO_OPCODE ip
3157
3158
3159
3160/* ------------------------------ */
3161 .balign 128
3162.L_op_invoke_static: /* 0x71 */
3163/* File: arm64/op_invoke_static.S */
3164/* File: arm64/invoke.S */
3165 /*
3166 * Generic invoke handler wrapper.
3167 */
3168 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3169 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3170 .extern MterpInvokeStatic
3171 EXPORT_PC
3172 mov x0, xSELF
3173 add x1, xFP, #OFF_FP_SHADOWFRAME
3174 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003175 mov x3, xINST
3176 bl MterpInvokeStatic
3177 cbz w0, MterpException
3178 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003179 bl MterpShouldSwitchInterpreters
3180 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003181 GET_INST_OPCODE ip
3182 GOTO_OPCODE ip
3183
3184
3185
3186
3187/* ------------------------------ */
3188 .balign 128
3189.L_op_invoke_interface: /* 0x72 */
3190/* File: arm64/op_invoke_interface.S */
3191/* File: arm64/invoke.S */
3192 /*
3193 * Generic invoke handler wrapper.
3194 */
3195 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3196 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3197 .extern MterpInvokeInterface
3198 EXPORT_PC
3199 mov x0, xSELF
3200 add x1, xFP, #OFF_FP_SHADOWFRAME
3201 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003202 mov x3, xINST
3203 bl MterpInvokeInterface
3204 cbz w0, MterpException
3205 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003206 bl MterpShouldSwitchInterpreters
3207 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003208 GET_INST_OPCODE ip
3209 GOTO_OPCODE ip
3210
3211
3212 /*
3213 * Handle an interface method call.
3214 *
3215 * for: invoke-interface, invoke-interface/range
3216 */
3217 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3218 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3219
3220/* ------------------------------ */
3221 .balign 128
3222.L_op_return_void_no_barrier: /* 0x73 */
3223/* File: arm64/op_return_void_no_barrier.S */
3224 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
3225 mov x0, xSELF
3226 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3227 b.ne .Lop_return_void_no_barrier_check
3228.Lop_return_void_no_barrier_return:
3229 mov x0, #0
3230 b MterpReturn
3231.Lop_return_void_no_barrier_check:
3232 bl MterpSuspendCheck // (self)
3233 b .Lop_return_void_no_barrier_return
3234
3235/* ------------------------------ */
3236 .balign 128
3237.L_op_invoke_virtual_range: /* 0x74 */
3238/* File: arm64/op_invoke_virtual_range.S */
3239/* File: arm64/invoke.S */
3240 /*
3241 * Generic invoke handler wrapper.
3242 */
3243 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3244 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3245 .extern MterpInvokeVirtualRange
3246 EXPORT_PC
3247 mov x0, xSELF
3248 add x1, xFP, #OFF_FP_SHADOWFRAME
3249 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003250 mov x3, xINST
3251 bl MterpInvokeVirtualRange
3252 cbz w0, MterpException
3253 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003254 bl MterpShouldSwitchInterpreters
3255 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003256 GET_INST_OPCODE ip
3257 GOTO_OPCODE ip
3258
3259
3260
3261/* ------------------------------ */
3262 .balign 128
3263.L_op_invoke_super_range: /* 0x75 */
3264/* File: arm64/op_invoke_super_range.S */
3265/* File: arm64/invoke.S */
3266 /*
3267 * Generic invoke handler wrapper.
3268 */
3269 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3270 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3271 .extern MterpInvokeSuperRange
3272 EXPORT_PC
3273 mov x0, xSELF
3274 add x1, xFP, #OFF_FP_SHADOWFRAME
3275 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003276 mov x3, xINST
3277 bl MterpInvokeSuperRange
3278 cbz w0, MterpException
3279 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003280 bl MterpShouldSwitchInterpreters
3281 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003282 GET_INST_OPCODE ip
3283 GOTO_OPCODE ip
3284
3285
3286
3287/* ------------------------------ */
3288 .balign 128
3289.L_op_invoke_direct_range: /* 0x76 */
3290/* File: arm64/op_invoke_direct_range.S */
3291/* File: arm64/invoke.S */
3292 /*
3293 * Generic invoke handler wrapper.
3294 */
3295 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3296 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3297 .extern MterpInvokeDirectRange
3298 EXPORT_PC
3299 mov x0, xSELF
3300 add x1, xFP, #OFF_FP_SHADOWFRAME
3301 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003302 mov x3, xINST
3303 bl MterpInvokeDirectRange
3304 cbz w0, MterpException
3305 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003306 bl MterpShouldSwitchInterpreters
3307 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003308 GET_INST_OPCODE ip
3309 GOTO_OPCODE ip
3310
3311
3312
3313/* ------------------------------ */
3314 .balign 128
3315.L_op_invoke_static_range: /* 0x77 */
3316/* File: arm64/op_invoke_static_range.S */
3317/* File: arm64/invoke.S */
3318 /*
3319 * Generic invoke handler wrapper.
3320 */
3321 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3322 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3323 .extern MterpInvokeStaticRange
3324 EXPORT_PC
3325 mov x0, xSELF
3326 add x1, xFP, #OFF_FP_SHADOWFRAME
3327 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003328 mov x3, xINST
3329 bl MterpInvokeStaticRange
3330 cbz w0, MterpException
3331 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003332 bl MterpShouldSwitchInterpreters
3333 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003334 GET_INST_OPCODE ip
3335 GOTO_OPCODE ip
3336
3337
3338
3339/* ------------------------------ */
3340 .balign 128
3341.L_op_invoke_interface_range: /* 0x78 */
3342/* File: arm64/op_invoke_interface_range.S */
3343/* File: arm64/invoke.S */
3344 /*
3345 * Generic invoke handler wrapper.
3346 */
3347 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3348 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3349 .extern MterpInvokeInterfaceRange
3350 EXPORT_PC
3351 mov x0, xSELF
3352 add x1, xFP, #OFF_FP_SHADOWFRAME
3353 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003354 mov x3, xINST
3355 bl MterpInvokeInterfaceRange
3356 cbz w0, MterpException
3357 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003358 bl MterpShouldSwitchInterpreters
3359 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003360 GET_INST_OPCODE ip
3361 GOTO_OPCODE ip
3362
3363
3364
3365/* ------------------------------ */
3366 .balign 128
3367.L_op_unused_79: /* 0x79 */
3368/* File: arm64/op_unused_79.S */
3369/* File: arm64/unused.S */
3370/*
3371 * Bail to reference interpreter to throw.
3372 */
3373 b MterpFallback
3374
3375
3376/* ------------------------------ */
3377 .balign 128
3378.L_op_unused_7a: /* 0x7a */
3379/* File: arm64/op_unused_7a.S */
3380/* File: arm64/unused.S */
3381/*
3382 * Bail to reference interpreter to throw.
3383 */
3384 b MterpFallback
3385
3386
3387/* ------------------------------ */
3388 .balign 128
3389.L_op_neg_int: /* 0x7b */
3390/* File: arm64/op_neg_int.S */
3391/* File: arm64/unop.S */
3392 /*
3393 * Generic 32-bit unary operation. Provide an "instr" line that
3394 * specifies an instruction that performs "result = op w0".
3395 * This could be an ARM instruction or a function call.
3396 *
3397 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3398 * int-to-byte, int-to-char, int-to-short
3399 */
3400 /* unop vA, vB */
3401 lsr w3, wINST, #12 // w3<- B
3402 GET_VREG w0, w3 // w0<- vB
3403 ubfx w9, wINST, #8, #4 // w9<- A
3404 // optional op; may set condition codes
3405 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3406 sub w0, wzr, w0 // w0<- op, w0-w3 changed
3407 GET_INST_OPCODE ip // extract opcode from rINST
3408 SET_VREG w0, w9 // vAA<- w0
3409 GOTO_OPCODE ip // jump to next instruction
3410 /* 8-9 instructions */
3411
3412
3413/* ------------------------------ */
3414 .balign 128
3415.L_op_not_int: /* 0x7c */
3416/* File: arm64/op_not_int.S */
3417/* File: arm64/unop.S */
3418 /*
3419 * Generic 32-bit unary operation. Provide an "instr" line that
3420 * specifies an instruction that performs "result = op w0".
3421 * This could be an ARM instruction or a function call.
3422 *
3423 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3424 * int-to-byte, int-to-char, int-to-short
3425 */
3426 /* unop vA, vB */
3427 lsr w3, wINST, #12 // w3<- B
3428 GET_VREG w0, w3 // w0<- vB
3429 ubfx w9, wINST, #8, #4 // w9<- A
3430 // optional op; may set condition codes
3431 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3432 mvn w0, w0 // w0<- op, w0-w3 changed
3433 GET_INST_OPCODE ip // extract opcode from rINST
3434 SET_VREG w0, w9 // vAA<- w0
3435 GOTO_OPCODE ip // jump to next instruction
3436 /* 8-9 instructions */
3437
3438
3439/* ------------------------------ */
3440 .balign 128
3441.L_op_neg_long: /* 0x7d */
3442/* File: arm64/op_neg_long.S */
3443/* File: arm64/unopWide.S */
3444 /*
3445 * Generic 64-bit unary operation. Provide an "instr" line that
3446 * specifies an instruction that performs "result = op x0".
3447 *
3448 * For: neg-long, not-long
3449 */
3450 /* unop vA, vB */
3451 lsr w3, wINST, #12 // w3<- B
3452 ubfx w4, wINST, #8, #4 // w4<- A
3453 GET_VREG_WIDE x0, w3
3454 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3455
3456 sub x0, xzr, x0
3457 GET_INST_OPCODE ip // extract opcode from wINST
3458 SET_VREG_WIDE x0, w4
3459 GOTO_OPCODE ip // jump to next instruction
3460 /* 10-11 instructions */
3461
3462
3463/* ------------------------------ */
3464 .balign 128
3465.L_op_not_long: /* 0x7e */
3466/* File: arm64/op_not_long.S */
3467/* File: arm64/unopWide.S */
3468 /*
3469 * Generic 64-bit unary operation. Provide an "instr" line that
3470 * specifies an instruction that performs "result = op x0".
3471 *
3472 * For: neg-long, not-long
3473 */
3474 /* unop vA, vB */
3475 lsr w3, wINST, #12 // w3<- B
3476 ubfx w4, wINST, #8, #4 // w4<- A
3477 GET_VREG_WIDE x0, w3
3478 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3479
3480 mvn x0, x0
3481 GET_INST_OPCODE ip // extract opcode from wINST
3482 SET_VREG_WIDE x0, w4
3483 GOTO_OPCODE ip // jump to next instruction
3484 /* 10-11 instructions */
3485
3486
3487/* ------------------------------ */
3488 .balign 128
3489.L_op_neg_float: /* 0x7f */
3490/* File: arm64/op_neg_float.S */
3491/* File: arm64/unop.S */
3492 /*
3493 * Generic 32-bit unary operation. Provide an "instr" line that
3494 * specifies an instruction that performs "result = op w0".
3495 * This could be an ARM instruction or a function call.
3496 *
3497 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3498 * int-to-byte, int-to-char, int-to-short
3499 */
3500 /* unop vA, vB */
3501 lsr w3, wINST, #12 // w3<- B
3502 GET_VREG w0, w3 // w0<- vB
3503 ubfx w9, wINST, #8, #4 // w9<- A
3504 mov w4, #0x80000000 // optional op; may set condition codes
3505 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3506 add w0, w0, w4 // w0<- op, w0-w3 changed
3507 GET_INST_OPCODE ip // extract opcode from rINST
3508 SET_VREG w0, w9 // vAA<- w0
3509 GOTO_OPCODE ip // jump to next instruction
3510 /* 8-9 instructions */
3511
3512
3513/* ------------------------------ */
3514 .balign 128
3515.L_op_neg_double: /* 0x80 */
3516/* File: arm64/op_neg_double.S */
3517/* File: arm64/unopWide.S */
3518 /*
3519 * Generic 64-bit unary operation. Provide an "instr" line that
3520 * specifies an instruction that performs "result = op x0".
3521 *
3522 * For: neg-long, not-long
3523 */
3524 /* unop vA, vB */
3525 lsr w3, wINST, #12 // w3<- B
3526 ubfx w4, wINST, #8, #4 // w4<- A
3527 GET_VREG_WIDE x0, w3
3528 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3529 mov x1, #0x8000000000000000
3530 add x0, x0, x1
3531 GET_INST_OPCODE ip // extract opcode from wINST
3532 SET_VREG_WIDE x0, w4
3533 GOTO_OPCODE ip // jump to next instruction
3534 /* 10-11 instructions */
3535
3536
3537/* ------------------------------ */
3538 .balign 128
3539.L_op_int_to_long: /* 0x81 */
3540/* File: arm64/op_int_to_long.S */
3541/* File: arm64/funopWider.S */
3542 /*
3543 * Generic 32bit-to-64bit floating point unary operation. Provide an
3544 * "instr" line that specifies an instruction that performs "x0 = op w0".
3545 *
3546 * For: int-to-double, float-to-double, float-to-long
3547 */
3548 /* unop vA, vB */
3549 lsr w3, wINST, #12 // w3<- B
3550 lsr w4, wINST, #8 // w4<- A+
3551 GET_VREG w0, w3
3552 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3553 and w4, w4, #15 // w4<- A
3554 sbfm x0, x0, 0, 31 // d0<- op
3555 GET_INST_OPCODE ip // extract opcode from wINST
3556 SET_VREG_WIDE x0, w4 // vA<- d0
3557 GOTO_OPCODE ip // jump to next instruction
3558
3559
3560/* ------------------------------ */
3561 .balign 128
3562.L_op_int_to_float: /* 0x82 */
3563/* File: arm64/op_int_to_float.S */
3564/* File: arm64/funopNarrow.S */
3565 /*
3566 * Generic 32bit-to-32bit floating point unary operation. Provide an
3567 * "instr" line that specifies an instruction that performs "s0 = op w0".
3568 *
3569 * For: int-to-float, float-to-int
3570 * TODO: refactor all of the conversions - parameterize width and use same template.
3571 */
3572 /* unop vA, vB */
3573 lsr w3, wINST, #12 // w3<- B
3574 lsr w4, wINST, #8 // w4<- A+
3575 GET_VREG w0, w3
3576 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3577 and w4, w4, #15 // w4<- A
3578 scvtf s0, w0 // d0<- op
3579 GET_INST_OPCODE ip // extract opcode from wINST
3580 SET_VREG s0, w4 // vA<- d0
3581 GOTO_OPCODE ip // jump to next instruction
3582
3583
3584/* ------------------------------ */
3585 .balign 128
3586.L_op_int_to_double: /* 0x83 */
3587/* File: arm64/op_int_to_double.S */
3588/* File: arm64/funopWider.S */
3589 /*
3590 * Generic 32bit-to-64bit floating point unary operation. Provide an
3591 * "instr" line that specifies an instruction that performs "d0 = op w0".
3592 *
3593 * For: int-to-double, float-to-double, float-to-long
3594 */
3595 /* unop vA, vB */
3596 lsr w3, wINST, #12 // w3<- B
3597 lsr w4, wINST, #8 // w4<- A+
3598 GET_VREG w0, w3
3599 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3600 and w4, w4, #15 // w4<- A
3601 scvtf d0, w0 // d0<- op
3602 GET_INST_OPCODE ip // extract opcode from wINST
3603 SET_VREG_WIDE d0, w4 // vA<- d0
3604 GOTO_OPCODE ip // jump to next instruction
3605
3606
3607/* ------------------------------ */
3608 .balign 128
3609.L_op_long_to_int: /* 0x84 */
3610/* File: arm64/op_long_to_int.S */
3611/* File: arm64/funopNarrower.S */
3612 /*
3613 * Generic 64bit-to-32bit floating point unary operation. Provide an
3614 * "instr" line that specifies an instruction that performs "w0 = op x0".
3615 *
3616 * For: int-to-double, float-to-double, float-to-long
3617 */
3618 /* unop vA, vB */
3619 lsr w3, wINST, #12 // w3<- B
3620 lsr w4, wINST, #8 // w4<- A+
3621 GET_VREG_WIDE x0, w3
3622 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3623 and w4, w4, #15 // w4<- A
3624 // d0<- op
3625 GET_INST_OPCODE ip // extract opcode from wINST
3626 SET_VREG w0, w4 // vA<- d0
3627 GOTO_OPCODE ip // jump to next instruction
3628
3629
3630/* ------------------------------ */
3631 .balign 128
3632.L_op_long_to_float: /* 0x85 */
3633/* File: arm64/op_long_to_float.S */
3634/* File: arm64/funopNarrower.S */
3635 /*
3636 * Generic 64bit-to-32bit floating point unary operation. Provide an
3637 * "instr" line that specifies an instruction that performs "s0 = op x0".
3638 *
3639 * For: int-to-double, float-to-double, float-to-long
3640 */
3641 /* unop vA, vB */
3642 lsr w3, wINST, #12 // w3<- B
3643 lsr w4, wINST, #8 // w4<- A+
3644 GET_VREG_WIDE x0, w3
3645 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3646 and w4, w4, #15 // w4<- A
3647 scvtf s0, x0 // d0<- op
3648 GET_INST_OPCODE ip // extract opcode from wINST
3649 SET_VREG s0, w4 // vA<- d0
3650 GOTO_OPCODE ip // jump to next instruction
3651
3652
3653/* ------------------------------ */
3654 .balign 128
3655.L_op_long_to_double: /* 0x86 */
3656/* File: arm64/op_long_to_double.S */
3657/* File: arm64/funopWide.S */
3658 /*
3659 * Generic 64bit-to-64bit floating point unary operation. Provide an
3660 * "instr" line that specifies an instruction that performs "d0 = op x0".
3661 *
3662 * For: long-to-double, double-to-long
3663 */
3664 /* unop vA, vB */
3665 lsr w3, wINST, #12 // w3<- B
3666 lsr w4, wINST, #8 // w4<- A+
3667 GET_VREG_WIDE x0, w3
3668 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3669 and w4, w4, #15 // w4<- A
3670 scvtf d0, x0 // d0<- op
3671 GET_INST_OPCODE ip // extract opcode from wINST
3672 SET_VREG_WIDE d0, w4 // vA<- d0
3673 GOTO_OPCODE ip // jump to next instruction
3674
3675
3676/* ------------------------------ */
3677 .balign 128
3678.L_op_float_to_int: /* 0x87 */
3679/* File: arm64/op_float_to_int.S */
3680/* File: arm64/funopNarrow.S */
3681 /*
3682 * Generic 32bit-to-32bit floating point unary operation. Provide an
3683 * "instr" line that specifies an instruction that performs "w0 = op s0".
3684 *
3685 * For: int-to-float, float-to-int
3686 * TODO: refactor all of the conversions - parameterize width and use same template.
3687 */
3688 /* unop vA, vB */
3689 lsr w3, wINST, #12 // w3<- B
3690 lsr w4, wINST, #8 // w4<- A+
3691 GET_VREG s0, w3
3692 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3693 and w4, w4, #15 // w4<- A
3694 fcvtzs w0, s0 // d0<- op
3695 GET_INST_OPCODE ip // extract opcode from wINST
3696 SET_VREG w0, w4 // vA<- d0
3697 GOTO_OPCODE ip // jump to next instruction
3698
3699
3700/* ------------------------------ */
3701 .balign 128
3702.L_op_float_to_long: /* 0x88 */
3703/* File: arm64/op_float_to_long.S */
3704/* File: arm64/funopWider.S */
3705 /*
3706 * Generic 32bit-to-64bit floating point unary operation. Provide an
3707 * "instr" line that specifies an instruction that performs "x0 = op s0".
3708 *
3709 * For: int-to-double, float-to-double, float-to-long
3710 */
3711 /* unop vA, vB */
3712 lsr w3, wINST, #12 // w3<- B
3713 lsr w4, wINST, #8 // w4<- A+
3714 GET_VREG s0, w3
3715 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3716 and w4, w4, #15 // w4<- A
3717 fcvtzs x0, s0 // d0<- op
3718 GET_INST_OPCODE ip // extract opcode from wINST
3719 SET_VREG_WIDE x0, w4 // vA<- d0
3720 GOTO_OPCODE ip // jump to next instruction
3721
3722
3723/* ------------------------------ */
3724 .balign 128
3725.L_op_float_to_double: /* 0x89 */
3726/* File: arm64/op_float_to_double.S */
3727/* File: arm64/funopWider.S */
3728 /*
3729 * Generic 32bit-to-64bit floating point unary operation. Provide an
3730 * "instr" line that specifies an instruction that performs "d0 = op s0".
3731 *
3732 * For: int-to-double, float-to-double, float-to-long
3733 */
3734 /* unop vA, vB */
3735 lsr w3, wINST, #12 // w3<- B
3736 lsr w4, wINST, #8 // w4<- A+
3737 GET_VREG s0, w3
3738 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3739 and w4, w4, #15 // w4<- A
3740 fcvt d0, s0 // d0<- op
3741 GET_INST_OPCODE ip // extract opcode from wINST
3742 SET_VREG_WIDE d0, w4 // vA<- d0
3743 GOTO_OPCODE ip // jump to next instruction
3744
3745
3746/* ------------------------------ */
3747 .balign 128
3748.L_op_double_to_int: /* 0x8a */
3749/* File: arm64/op_double_to_int.S */
3750/* File: arm64/funopNarrower.S */
3751 /*
3752 * Generic 64bit-to-32bit floating point unary operation. Provide an
3753 * "instr" line that specifies an instruction that performs "w0 = op d0".
3754 *
3755 * For: int-to-double, float-to-double, float-to-long
3756 */
3757 /* unop vA, vB */
3758 lsr w3, wINST, #12 // w3<- B
3759 lsr w4, wINST, #8 // w4<- A+
3760 GET_VREG_WIDE d0, w3
3761 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3762 and w4, w4, #15 // w4<- A
3763 fcvtzs w0, d0 // d0<- op
3764 GET_INST_OPCODE ip // extract opcode from wINST
3765 SET_VREG w0, w4 // vA<- d0
3766 GOTO_OPCODE ip // jump to next instruction
3767
3768
3769/* ------------------------------ */
3770 .balign 128
3771.L_op_double_to_long: /* 0x8b */
3772/* File: arm64/op_double_to_long.S */
3773/* File: arm64/funopWide.S */
3774 /*
3775 * Generic 64bit-to-64bit floating point unary operation. Provide an
3776 * "instr" line that specifies an instruction that performs "x0 = op d0".
3777 *
3778 * For: long-to-double, double-to-long
3779 */
3780 /* unop vA, vB */
3781 lsr w3, wINST, #12 // w3<- B
3782 lsr w4, wINST, #8 // w4<- A+
3783 GET_VREG_WIDE d0, w3
3784 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3785 and w4, w4, #15 // w4<- A
3786 fcvtzs x0, d0 // d0<- op
3787 GET_INST_OPCODE ip // extract opcode from wINST
3788 SET_VREG_WIDE x0, w4 // vA<- d0
3789 GOTO_OPCODE ip // jump to next instruction
3790
3791
3792/* ------------------------------ */
3793 .balign 128
3794.L_op_double_to_float: /* 0x8c */
3795/* File: arm64/op_double_to_float.S */
3796/* File: arm64/funopNarrower.S */
3797 /*
3798 * Generic 64bit-to-32bit floating point unary operation. Provide an
3799 * "instr" line that specifies an instruction that performs "s0 = op d0".
3800 *
3801 * For: int-to-double, float-to-double, float-to-long
3802 */
3803 /* unop vA, vB */
3804 lsr w3, wINST, #12 // w3<- B
3805 lsr w4, wINST, #8 // w4<- A+
3806 GET_VREG_WIDE d0, w3
3807 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3808 and w4, w4, #15 // w4<- A
3809 fcvt s0, d0 // d0<- op
3810 GET_INST_OPCODE ip // extract opcode from wINST
3811 SET_VREG s0, w4 // vA<- d0
3812 GOTO_OPCODE ip // jump to next instruction
3813
3814
3815/* ------------------------------ */
3816 .balign 128
3817.L_op_int_to_byte: /* 0x8d */
3818/* File: arm64/op_int_to_byte.S */
3819/* File: arm64/unop.S */
3820 /*
3821 * Generic 32-bit unary operation. Provide an "instr" line that
3822 * specifies an instruction that performs "result = op w0".
3823 * This could be an ARM instruction or a function call.
3824 *
3825 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3826 * int-to-byte, int-to-char, int-to-short
3827 */
3828 /* unop vA, vB */
3829 lsr w3, wINST, #12 // w3<- B
3830 GET_VREG w0, w3 // w0<- vB
3831 ubfx w9, wINST, #8, #4 // w9<- A
3832 // optional op; may set condition codes
3833 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3834 sxtb w0, w0 // w0<- op, w0-w3 changed
3835 GET_INST_OPCODE ip // extract opcode from rINST
3836 SET_VREG w0, w9 // vAA<- w0
3837 GOTO_OPCODE ip // jump to next instruction
3838 /* 8-9 instructions */
3839
3840
3841/* ------------------------------ */
3842 .balign 128
3843.L_op_int_to_char: /* 0x8e */
3844/* File: arm64/op_int_to_char.S */
3845/* File: arm64/unop.S */
3846 /*
3847 * Generic 32-bit unary operation. Provide an "instr" line that
3848 * specifies an instruction that performs "result = op w0".
3849 * This could be an ARM instruction or a function call.
3850 *
3851 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3852 * int-to-byte, int-to-char, int-to-short
3853 */
3854 /* unop vA, vB */
3855 lsr w3, wINST, #12 // w3<- B
3856 GET_VREG w0, w3 // w0<- vB
3857 ubfx w9, wINST, #8, #4 // w9<- A
3858 // optional op; may set condition codes
3859 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3860 uxth w0, w0 // w0<- op, w0-w3 changed
3861 GET_INST_OPCODE ip // extract opcode from rINST
3862 SET_VREG w0, w9 // vAA<- w0
3863 GOTO_OPCODE ip // jump to next instruction
3864 /* 8-9 instructions */
3865
3866
3867/* ------------------------------ */
3868 .balign 128
3869.L_op_int_to_short: /* 0x8f */
3870/* File: arm64/op_int_to_short.S */
3871/* File: arm64/unop.S */
3872 /*
3873 * Generic 32-bit unary operation. Provide an "instr" line that
3874 * specifies an instruction that performs "result = op w0".
3875 * This could be an ARM instruction or a function call.
3876 *
3877 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3878 * int-to-byte, int-to-char, int-to-short
3879 */
3880 /* unop vA, vB */
3881 lsr w3, wINST, #12 // w3<- B
3882 GET_VREG w0, w3 // w0<- vB
3883 ubfx w9, wINST, #8, #4 // w9<- A
3884 // optional op; may set condition codes
3885 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3886 sxth w0, w0 // w0<- op, w0-w3 changed
3887 GET_INST_OPCODE ip // extract opcode from rINST
3888 SET_VREG w0, w9 // vAA<- w0
3889 GOTO_OPCODE ip // jump to next instruction
3890 /* 8-9 instructions */
3891
3892
3893/* ------------------------------ */
3894 .balign 128
3895.L_op_add_int: /* 0x90 */
3896/* File: arm64/op_add_int.S */
3897/* File: arm64/binop.S */
3898 /*
3899 * Generic 32-bit binary operation. Provide an "instr" line that
3900 * specifies an instruction that performs "result = w0 op w1".
3901 * This could be an ARM instruction or a function call. (If the result
3902 * comes back in a register other than w0, you can override "result".)
3903 *
3904 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3905 * vCC (w1). Useful for integer division and modulus. Note that we
3906 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3907 * handles it correctly.
3908 *
3909 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3910 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3911 * mul-float, div-float, rem-float
3912 */
3913 /* binop vAA, vBB, vCC */
3914 FETCH w0, 1 // w0<- CCBB
3915 lsr w9, wINST, #8 // w9<- AA
3916 lsr w3, w0, #8 // w3<- CC
3917 and w2, w0, #255 // w2<- BB
3918 GET_VREG w1, w3 // w1<- vCC
3919 GET_VREG w0, w2 // w0<- vBB
3920 .if 0
3921 cbz w1, common_errDivideByZero // is second operand zero?
3922 .endif
3923 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3924 // optional op; may set condition codes
3925 add w0, w0, w1 // w0<- op, w0-w3 changed
3926 GET_INST_OPCODE ip // extract opcode from rINST
3927 SET_VREG w0, w9 // vAA<- w0
3928 GOTO_OPCODE ip // jump to next instruction
3929 /* 11-14 instructions */
3930
3931
3932/* ------------------------------ */
3933 .balign 128
3934.L_op_sub_int: /* 0x91 */
3935/* File: arm64/op_sub_int.S */
3936/* File: arm64/binop.S */
3937 /*
3938 * Generic 32-bit binary operation. Provide an "instr" line that
3939 * specifies an instruction that performs "result = w0 op w1".
3940 * This could be an ARM instruction or a function call. (If the result
3941 * comes back in a register other than w0, you can override "result".)
3942 *
3943 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3944 * vCC (w1). Useful for integer division and modulus. Note that we
3945 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3946 * handles it correctly.
3947 *
3948 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3949 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3950 * mul-float, div-float, rem-float
3951 */
3952 /* binop vAA, vBB, vCC */
3953 FETCH w0, 1 // w0<- CCBB
3954 lsr w9, wINST, #8 // w9<- AA
3955 lsr w3, w0, #8 // w3<- CC
3956 and w2, w0, #255 // w2<- BB
3957 GET_VREG w1, w3 // w1<- vCC
3958 GET_VREG w0, w2 // w0<- vBB
3959 .if 0
3960 cbz w1, common_errDivideByZero // is second operand zero?
3961 .endif
3962 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3963 // optional op; may set condition codes
3964 sub w0, w0, w1 // w0<- op, w0-w3 changed
3965 GET_INST_OPCODE ip // extract opcode from rINST
3966 SET_VREG w0, w9 // vAA<- w0
3967 GOTO_OPCODE ip // jump to next instruction
3968 /* 11-14 instructions */
3969
3970
3971/* ------------------------------ */
3972 .balign 128
3973.L_op_mul_int: /* 0x92 */
3974/* File: arm64/op_mul_int.S */
3975/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
3976/* File: arm64/binop.S */
3977 /*
3978 * Generic 32-bit binary operation. Provide an "instr" line that
3979 * specifies an instruction that performs "result = w0 op w1".
3980 * This could be an ARM instruction or a function call. (If the result
3981 * comes back in a register other than w0, you can override "result".)
3982 *
3983 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3984 * vCC (w1). Useful for integer division and modulus. Note that we
3985 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3986 * handles it correctly.
3987 *
3988 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3989 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3990 * mul-float, div-float, rem-float
3991 */
3992 /* binop vAA, vBB, vCC */
3993 FETCH w0, 1 // w0<- CCBB
3994 lsr w9, wINST, #8 // w9<- AA
3995 lsr w3, w0, #8 // w3<- CC
3996 and w2, w0, #255 // w2<- BB
3997 GET_VREG w1, w3 // w1<- vCC
3998 GET_VREG w0, w2 // w0<- vBB
3999 .if 0
4000 cbz w1, common_errDivideByZero // is second operand zero?
4001 .endif
4002 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4003 // optional op; may set condition codes
4004 mul w0, w1, w0 // w0<- op, w0-w3 changed
4005 GET_INST_OPCODE ip // extract opcode from rINST
4006 SET_VREG w0, w9 // vAA<- w0
4007 GOTO_OPCODE ip // jump to next instruction
4008 /* 11-14 instructions */
4009
4010
4011/* ------------------------------ */
4012 .balign 128
4013.L_op_div_int: /* 0x93 */
4014/* File: arm64/op_div_int.S */
4015/* File: arm64/binop.S */
4016 /*
4017 * Generic 32-bit binary operation. Provide an "instr" line that
4018 * specifies an instruction that performs "result = w0 op w1".
4019 * This could be an ARM instruction or a function call. (If the result
4020 * comes back in a register other than w0, you can override "result".)
4021 *
4022 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4023 * vCC (w1). Useful for integer division and modulus. Note that we
4024 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4025 * handles it correctly.
4026 *
4027 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4028 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4029 * mul-float, div-float, rem-float
4030 */
4031 /* binop vAA, vBB, vCC */
4032 FETCH w0, 1 // w0<- CCBB
4033 lsr w9, wINST, #8 // w9<- AA
4034 lsr w3, w0, #8 // w3<- CC
4035 and w2, w0, #255 // w2<- BB
4036 GET_VREG w1, w3 // w1<- vCC
4037 GET_VREG w0, w2 // w0<- vBB
4038 .if 1
4039 cbz w1, common_errDivideByZero // is second operand zero?
4040 .endif
4041 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4042 // optional op; may set condition codes
4043 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
4044 GET_INST_OPCODE ip // extract opcode from rINST
4045 SET_VREG w0, w9 // vAA<- w0
4046 GOTO_OPCODE ip // jump to next instruction
4047 /* 11-14 instructions */
4048
4049
4050/* ------------------------------ */
4051 .balign 128
4052.L_op_rem_int: /* 0x94 */
4053/* File: arm64/op_rem_int.S */
4054/* File: arm64/binop.S */
4055 /*
4056 * Generic 32-bit binary operation. Provide an "instr" line that
4057 * specifies an instruction that performs "result = w0 op w1".
4058 * This could be an ARM instruction or a function call. (If the result
4059 * comes back in a register other than w0, you can override "result".)
4060 *
4061 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4062 * vCC (w1). Useful for integer division and modulus. Note that we
4063 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4064 * handles it correctly.
4065 *
4066 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4067 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4068 * mul-float, div-float, rem-float
4069 */
4070 /* binop vAA, vBB, vCC */
4071 FETCH w0, 1 // w0<- CCBB
4072 lsr w9, wINST, #8 // w9<- AA
4073 lsr w3, w0, #8 // w3<- CC
4074 and w2, w0, #255 // w2<- BB
4075 GET_VREG w1, w3 // w1<- vCC
4076 GET_VREG w0, w2 // w0<- vBB
4077 .if 1
4078 cbz w1, common_errDivideByZero // is second operand zero?
4079 .endif
4080 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4081 sdiv w2, w0, w1 // optional op; may set condition codes
4082 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
4083 GET_INST_OPCODE ip // extract opcode from rINST
4084 SET_VREG w0, w9 // vAA<- w0
4085 GOTO_OPCODE ip // jump to next instruction
4086 /* 11-14 instructions */
4087
4088
4089/* ------------------------------ */
4090 .balign 128
4091.L_op_and_int: /* 0x95 */
4092/* File: arm64/op_and_int.S */
4093/* File: arm64/binop.S */
4094 /*
4095 * Generic 32-bit binary operation. Provide an "instr" line that
4096 * specifies an instruction that performs "result = w0 op w1".
4097 * This could be an ARM instruction or a function call. (If the result
4098 * comes back in a register other than w0, you can override "result".)
4099 *
4100 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4101 * vCC (w1). Useful for integer division and modulus. Note that we
4102 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4103 * handles it correctly.
4104 *
4105 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4106 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4107 * mul-float, div-float, rem-float
4108 */
4109 /* binop vAA, vBB, vCC */
4110 FETCH w0, 1 // w0<- CCBB
4111 lsr w9, wINST, #8 // w9<- AA
4112 lsr w3, w0, #8 // w3<- CC
4113 and w2, w0, #255 // w2<- BB
4114 GET_VREG w1, w3 // w1<- vCC
4115 GET_VREG w0, w2 // w0<- vBB
4116 .if 0
4117 cbz w1, common_errDivideByZero // is second operand zero?
4118 .endif
4119 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4120 // optional op; may set condition codes
4121 and w0, w0, w1 // w0<- op, w0-w3 changed
4122 GET_INST_OPCODE ip // extract opcode from rINST
4123 SET_VREG w0, w9 // vAA<- w0
4124 GOTO_OPCODE ip // jump to next instruction
4125 /* 11-14 instructions */
4126
4127
4128/* ------------------------------ */
4129 .balign 128
4130.L_op_or_int: /* 0x96 */
4131/* File: arm64/op_or_int.S */
4132/* File: arm64/binop.S */
4133 /*
4134 * Generic 32-bit binary operation. Provide an "instr" line that
4135 * specifies an instruction that performs "result = w0 op w1".
4136 * This could be an ARM instruction or a function call. (If the result
4137 * comes back in a register other than w0, you can override "result".)
4138 *
4139 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4140 * vCC (w1). Useful for integer division and modulus. Note that we
4141 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4142 * handles it correctly.
4143 *
4144 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4145 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4146 * mul-float, div-float, rem-float
4147 */
4148 /* binop vAA, vBB, vCC */
4149 FETCH w0, 1 // w0<- CCBB
4150 lsr w9, wINST, #8 // w9<- AA
4151 lsr w3, w0, #8 // w3<- CC
4152 and w2, w0, #255 // w2<- BB
4153 GET_VREG w1, w3 // w1<- vCC
4154 GET_VREG w0, w2 // w0<- vBB
4155 .if 0
4156 cbz w1, common_errDivideByZero // is second operand zero?
4157 .endif
4158 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4159 // optional op; may set condition codes
4160 orr w0, w0, w1 // w0<- op, w0-w3 changed
4161 GET_INST_OPCODE ip // extract opcode from rINST
4162 SET_VREG w0, w9 // vAA<- w0
4163 GOTO_OPCODE ip // jump to next instruction
4164 /* 11-14 instructions */
4165
4166
4167/* ------------------------------ */
4168 .balign 128
4169.L_op_xor_int: /* 0x97 */
4170/* File: arm64/op_xor_int.S */
4171/* File: arm64/binop.S */
4172 /*
4173 * Generic 32-bit binary operation. Provide an "instr" line that
4174 * specifies an instruction that performs "result = w0 op w1".
4175 * This could be an ARM instruction or a function call. (If the result
4176 * comes back in a register other than w0, you can override "result".)
4177 *
4178 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4179 * vCC (w1). Useful for integer division and modulus. Note that we
4180 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4181 * handles it correctly.
4182 *
4183 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4184 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4185 * mul-float, div-float, rem-float
4186 */
4187 /* binop vAA, vBB, vCC */
4188 FETCH w0, 1 // w0<- CCBB
4189 lsr w9, wINST, #8 // w9<- AA
4190 lsr w3, w0, #8 // w3<- CC
4191 and w2, w0, #255 // w2<- BB
4192 GET_VREG w1, w3 // w1<- vCC
4193 GET_VREG w0, w2 // w0<- vBB
4194 .if 0
4195 cbz w1, common_errDivideByZero // is second operand zero?
4196 .endif
4197 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4198 // optional op; may set condition codes
4199 eor w0, w0, w1 // w0<- op, w0-w3 changed
4200 GET_INST_OPCODE ip // extract opcode from rINST
4201 SET_VREG w0, w9 // vAA<- w0
4202 GOTO_OPCODE ip // jump to next instruction
4203 /* 11-14 instructions */
4204
4205
4206/* ------------------------------ */
4207 .balign 128
4208.L_op_shl_int: /* 0x98 */
4209/* File: arm64/op_shl_int.S */
4210/* File: arm64/binop.S */
4211 /*
4212 * Generic 32-bit binary operation. Provide an "instr" line that
4213 * specifies an instruction that performs "result = w0 op w1".
4214 * This could be an ARM instruction or a function call. (If the result
4215 * comes back in a register other than w0, you can override "result".)
4216 *
4217 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4218 * vCC (w1). Useful for integer division and modulus. Note that we
4219 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4220 * handles it correctly.
4221 *
4222 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4223 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4224 * mul-float, div-float, rem-float
4225 */
4226 /* binop vAA, vBB, vCC */
4227 FETCH w0, 1 // w0<- CCBB
4228 lsr w9, wINST, #8 // w9<- AA
4229 lsr w3, w0, #8 // w3<- CC
4230 and w2, w0, #255 // w2<- BB
4231 GET_VREG w1, w3 // w1<- vCC
4232 GET_VREG w0, w2 // w0<- vBB
4233 .if 0
4234 cbz w1, common_errDivideByZero // is second operand zero?
4235 .endif
4236 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4237 and w1, w1, #31 // optional op; may set condition codes
4238 lsl w0, w0, w1 // w0<- op, w0-w3 changed
4239 GET_INST_OPCODE ip // extract opcode from rINST
4240 SET_VREG w0, w9 // vAA<- w0
4241 GOTO_OPCODE ip // jump to next instruction
4242 /* 11-14 instructions */
4243
4244
4245/* ------------------------------ */
4246 .balign 128
4247.L_op_shr_int: /* 0x99 */
4248/* File: arm64/op_shr_int.S */
4249/* File: arm64/binop.S */
4250 /*
4251 * Generic 32-bit binary operation. Provide an "instr" line that
4252 * specifies an instruction that performs "result = w0 op w1".
4253 * This could be an ARM instruction or a function call. (If the result
4254 * comes back in a register other than w0, you can override "result".)
4255 *
4256 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4257 * vCC (w1). Useful for integer division and modulus. Note that we
4258 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4259 * handles it correctly.
4260 *
4261 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4262 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4263 * mul-float, div-float, rem-float
4264 */
4265 /* binop vAA, vBB, vCC */
4266 FETCH w0, 1 // w0<- CCBB
4267 lsr w9, wINST, #8 // w9<- AA
4268 lsr w3, w0, #8 // w3<- CC
4269 and w2, w0, #255 // w2<- BB
4270 GET_VREG w1, w3 // w1<- vCC
4271 GET_VREG w0, w2 // w0<- vBB
4272 .if 0
4273 cbz w1, common_errDivideByZero // is second operand zero?
4274 .endif
4275 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4276 and w1, w1, #31 // optional op; may set condition codes
4277 asr w0, w0, w1 // w0<- op, w0-w3 changed
4278 GET_INST_OPCODE ip // extract opcode from rINST
4279 SET_VREG w0, w9 // vAA<- w0
4280 GOTO_OPCODE ip // jump to next instruction
4281 /* 11-14 instructions */
4282
4283
4284/* ------------------------------ */
4285 .balign 128
4286.L_op_ushr_int: /* 0x9a */
4287/* File: arm64/op_ushr_int.S */
4288/* File: arm64/binop.S */
4289 /*
4290 * Generic 32-bit binary operation. Provide an "instr" line that
4291 * specifies an instruction that performs "result = w0 op w1".
4292 * This could be an ARM instruction or a function call. (If the result
4293 * comes back in a register other than w0, you can override "result".)
4294 *
4295 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4296 * vCC (w1). Useful for integer division and modulus. Note that we
4297 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4298 * handles it correctly.
4299 *
4300 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4301 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4302 * mul-float, div-float, rem-float
4303 */
4304 /* binop vAA, vBB, vCC */
4305 FETCH w0, 1 // w0<- CCBB
4306 lsr w9, wINST, #8 // w9<- AA
4307 lsr w3, w0, #8 // w3<- CC
4308 and w2, w0, #255 // w2<- BB
4309 GET_VREG w1, w3 // w1<- vCC
4310 GET_VREG w0, w2 // w0<- vBB
4311 .if 0
4312 cbz w1, common_errDivideByZero // is second operand zero?
4313 .endif
4314 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4315 and w1, w1, #31 // optional op; may set condition codes
4316 lsr w0, w0, w1 // w0<- op, w0-w3 changed
4317 GET_INST_OPCODE ip // extract opcode from rINST
4318 SET_VREG w0, w9 // vAA<- w0
4319 GOTO_OPCODE ip // jump to next instruction
4320 /* 11-14 instructions */
4321
4322
4323/* ------------------------------ */
4324 .balign 128
4325.L_op_add_long: /* 0x9b */
4326/* File: arm64/op_add_long.S */
4327/* File: arm64/binopWide.S */
4328 /*
4329 * Generic 64-bit binary operation. Provide an "instr" line that
4330 * specifies an instruction that performs "result = x1 op x2".
4331 * This could be an ARM instruction or a function call. (If the result
4332 * comes back in a register other than x0, you can override "result".)
4333 *
4334 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4335 * vCC (w1). Useful for integer division and modulus.
4336 *
4337 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4338 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4339 */
4340 /* binop vAA, vBB, vCC */
4341 FETCH w0, 1 // w0<- CCBB
4342 lsr w4, wINST, #8 // w4<- AA
4343 lsr w2, w0, #8 // w2<- CC
4344 and w1, w0, #255 // w1<- BB
4345 GET_VREG_WIDE x2, w2 // w2<- vCC
4346 GET_VREG_WIDE x1, w1 // w1<- vBB
4347 .if 0
4348 cbz x2, common_errDivideByZero // is second operand zero?
4349 .endif
4350 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4351
4352 add x0, x1, x2 // x0<- op, w0-w4 changed
4353 GET_INST_OPCODE ip // extract opcode from rINST
4354 SET_VREG_WIDE x0, w4 // vAA<- x0
4355 GOTO_OPCODE ip // jump to next instruction
4356 /* 11-14 instructions */
4357
4358
4359/* ------------------------------ */
4360 .balign 128
4361.L_op_sub_long: /* 0x9c */
4362/* File: arm64/op_sub_long.S */
4363/* File: arm64/binopWide.S */
4364 /*
4365 * Generic 64-bit binary operation. Provide an "instr" line that
4366 * specifies an instruction that performs "result = x1 op x2".
4367 * This could be an ARM instruction or a function call. (If the result
4368 * comes back in a register other than x0, 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.
4372 *
4373 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4374 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4375 */
4376 /* binop vAA, vBB, vCC */
4377 FETCH w0, 1 // w0<- CCBB
4378 lsr w4, wINST, #8 // w4<- AA
4379 lsr w2, w0, #8 // w2<- CC
4380 and w1, w0, #255 // w1<- BB
4381 GET_VREG_WIDE x2, w2 // w2<- vCC
4382 GET_VREG_WIDE x1, w1 // w1<- vBB
4383 .if 0
4384 cbz x2, common_errDivideByZero // is second operand zero?
4385 .endif
4386 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4387
4388 sub x0, x1, x2 // x0<- op, w0-w4 changed
4389 GET_INST_OPCODE ip // extract opcode from rINST
4390 SET_VREG_WIDE x0, w4 // vAA<- x0
4391 GOTO_OPCODE ip // jump to next instruction
4392 /* 11-14 instructions */
4393
4394
4395/* ------------------------------ */
4396 .balign 128
4397.L_op_mul_long: /* 0x9d */
4398/* File: arm64/op_mul_long.S */
4399/* File: arm64/binopWide.S */
4400 /*
4401 * Generic 64-bit binary operation. Provide an "instr" line that
4402 * specifies an instruction that performs "result = x1 op x2".
4403 * This could be an ARM instruction or a function call. (If the result
4404 * comes back in a register other than x0, you can override "result".)
4405 *
4406 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4407 * vCC (w1). Useful for integer division and modulus.
4408 *
4409 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4410 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4411 */
4412 /* binop vAA, vBB, vCC */
4413 FETCH w0, 1 // w0<- CCBB
4414 lsr w4, wINST, #8 // w4<- AA
4415 lsr w2, w0, #8 // w2<- CC
4416 and w1, w0, #255 // w1<- BB
4417 GET_VREG_WIDE x2, w2 // w2<- vCC
4418 GET_VREG_WIDE x1, w1 // w1<- vBB
4419 .if 0
4420 cbz x2, common_errDivideByZero // is second operand zero?
4421 .endif
4422 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4423
4424 mul x0, x1, x2 // x0<- op, w0-w4 changed
4425 GET_INST_OPCODE ip // extract opcode from rINST
4426 SET_VREG_WIDE x0, w4 // vAA<- x0
4427 GOTO_OPCODE ip // jump to next instruction
4428 /* 11-14 instructions */
4429
4430
4431/* ------------------------------ */
4432 .balign 128
4433.L_op_div_long: /* 0x9e */
4434/* File: arm64/op_div_long.S */
4435/* File: arm64/binopWide.S */
4436 /*
4437 * Generic 64-bit binary operation. Provide an "instr" line that
4438 * specifies an instruction that performs "result = x1 op x2".
4439 * This could be an ARM instruction or a function call. (If the result
4440 * comes back in a register other than x0, you can override "result".)
4441 *
4442 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4443 * vCC (w1). Useful for integer division and modulus.
4444 *
4445 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4446 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4447 */
4448 /* binop vAA, vBB, vCC */
4449 FETCH w0, 1 // w0<- CCBB
4450 lsr w4, wINST, #8 // w4<- AA
4451 lsr w2, w0, #8 // w2<- CC
4452 and w1, w0, #255 // w1<- BB
4453 GET_VREG_WIDE x2, w2 // w2<- vCC
4454 GET_VREG_WIDE x1, w1 // w1<- vBB
4455 .if 1
4456 cbz x2, common_errDivideByZero // is second operand zero?
4457 .endif
4458 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4459
4460 sdiv x0, x1, x2 // x0<- op, w0-w4 changed
4461 GET_INST_OPCODE ip // extract opcode from rINST
4462 SET_VREG_WIDE x0, w4 // vAA<- x0
4463 GOTO_OPCODE ip // jump to next instruction
4464 /* 11-14 instructions */
4465
4466
4467/* ------------------------------ */
4468 .balign 128
4469.L_op_rem_long: /* 0x9f */
4470/* File: arm64/op_rem_long.S */
4471/* File: arm64/binopWide.S */
4472 /*
4473 * Generic 64-bit binary operation. Provide an "instr" line that
4474 * specifies an instruction that performs "result = x1 op x2".
4475 * This could be an ARM instruction or a function call. (If the result
4476 * comes back in a register other than x0, you can override "result".)
4477 *
4478 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4479 * vCC (w1). Useful for integer division and modulus.
4480 *
4481 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4482 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4483 */
4484 /* binop vAA, vBB, vCC */
4485 FETCH w0, 1 // w0<- CCBB
4486 lsr w4, wINST, #8 // w4<- AA
4487 lsr w2, w0, #8 // w2<- CC
4488 and w1, w0, #255 // w1<- BB
4489 GET_VREG_WIDE x2, w2 // w2<- vCC
4490 GET_VREG_WIDE x1, w1 // w1<- vBB
4491 .if 1
4492 cbz x2, common_errDivideByZero // is second operand zero?
4493 .endif
4494 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4495 sdiv x3, x1, x2
4496 msub x0, x3, x2, x1 // x0<- op, w0-w4 changed
4497 GET_INST_OPCODE ip // extract opcode from rINST
4498 SET_VREG_WIDE x0, w4 // vAA<- x0
4499 GOTO_OPCODE ip // jump to next instruction
4500 /* 11-14 instructions */
4501
4502
4503/* ------------------------------ */
4504 .balign 128
4505.L_op_and_long: /* 0xa0 */
4506/* File: arm64/op_and_long.S */
4507/* File: arm64/binopWide.S */
4508 /*
4509 * Generic 64-bit binary operation. Provide an "instr" line that
4510 * specifies an instruction that performs "result = x1 op x2".
4511 * This could be an ARM instruction or a function call. (If the result
4512 * comes back in a register other than x0, you can override "result".)
4513 *
4514 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4515 * vCC (w1). Useful for integer division and modulus.
4516 *
4517 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4518 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4519 */
4520 /* binop vAA, vBB, vCC */
4521 FETCH w0, 1 // w0<- CCBB
4522 lsr w4, wINST, #8 // w4<- AA
4523 lsr w2, w0, #8 // w2<- CC
4524 and w1, w0, #255 // w1<- BB
4525 GET_VREG_WIDE x2, w2 // w2<- vCC
4526 GET_VREG_WIDE x1, w1 // w1<- vBB
4527 .if 0
4528 cbz x2, common_errDivideByZero // is second operand zero?
4529 .endif
4530 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4531
4532 and x0, x1, x2 // x0<- op, w0-w4 changed
4533 GET_INST_OPCODE ip // extract opcode from rINST
4534 SET_VREG_WIDE x0, w4 // vAA<- x0
4535 GOTO_OPCODE ip // jump to next instruction
4536 /* 11-14 instructions */
4537
4538
4539/* ------------------------------ */
4540 .balign 128
4541.L_op_or_long: /* 0xa1 */
4542/* File: arm64/op_or_long.S */
4543/* File: arm64/binopWide.S */
4544 /*
4545 * Generic 64-bit binary operation. Provide an "instr" line that
4546 * specifies an instruction that performs "result = x1 op x2".
4547 * This could be an ARM instruction or a function call. (If the result
4548 * comes back in a register other than x0, you can override "result".)
4549 *
4550 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4551 * vCC (w1). Useful for integer division and modulus.
4552 *
4553 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4554 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4555 */
4556 /* binop vAA, vBB, vCC */
4557 FETCH w0, 1 // w0<- CCBB
4558 lsr w4, wINST, #8 // w4<- AA
4559 lsr w2, w0, #8 // w2<- CC
4560 and w1, w0, #255 // w1<- BB
4561 GET_VREG_WIDE x2, w2 // w2<- vCC
4562 GET_VREG_WIDE x1, w1 // w1<- vBB
4563 .if 0
4564 cbz x2, common_errDivideByZero // is second operand zero?
4565 .endif
4566 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4567
4568 orr x0, x1, x2 // x0<- op, w0-w4 changed
4569 GET_INST_OPCODE ip // extract opcode from rINST
4570 SET_VREG_WIDE x0, w4 // vAA<- x0
4571 GOTO_OPCODE ip // jump to next instruction
4572 /* 11-14 instructions */
4573
4574
4575/* ------------------------------ */
4576 .balign 128
4577.L_op_xor_long: /* 0xa2 */
4578/* File: arm64/op_xor_long.S */
4579/* File: arm64/binopWide.S */
4580 /*
4581 * Generic 64-bit binary operation. Provide an "instr" line that
4582 * specifies an instruction that performs "result = x1 op x2".
4583 * This could be an ARM instruction or a function call. (If the result
4584 * comes back in a register other than x0, you can override "result".)
4585 *
4586 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4587 * vCC (w1). Useful for integer division and modulus.
4588 *
4589 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4590 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4591 */
4592 /* binop vAA, vBB, vCC */
4593 FETCH w0, 1 // w0<- CCBB
4594 lsr w4, wINST, #8 // w4<- AA
4595 lsr w2, w0, #8 // w2<- CC
4596 and w1, w0, #255 // w1<- BB
4597 GET_VREG_WIDE x2, w2 // w2<- vCC
4598 GET_VREG_WIDE x1, w1 // w1<- vBB
4599 .if 0
4600 cbz x2, common_errDivideByZero // is second operand zero?
4601 .endif
4602 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4603
4604 eor x0, x1, x2 // x0<- op, w0-w4 changed
4605 GET_INST_OPCODE ip // extract opcode from rINST
4606 SET_VREG_WIDE x0, w4 // vAA<- x0
4607 GOTO_OPCODE ip // jump to next instruction
4608 /* 11-14 instructions */
4609
4610
4611/* ------------------------------ */
4612 .balign 128
4613.L_op_shl_long: /* 0xa3 */
4614/* File: arm64/op_shl_long.S */
4615/* File: arm64/shiftWide.S */
4616 /*
4617 * 64-bit shift operation.
4618 *
4619 * For: shl-long, shr-long, ushr-long
4620 */
4621 /* binop vAA, vBB, vCC */
4622 FETCH w0, 1 // w0<- CCBB
4623 lsr w3, wINST, #8 // w3<- AA
4624 lsr w2, w0, #8 // w2<- CC
4625 GET_VREG w2, w2 // w2<- vCC (shift count)
4626 and w1, w0, #255 // w1<- BB
4627 GET_VREG_WIDE x1, w1 // x1<- vBB
4628 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4629 and x2, x2, #63 // Mask low 6
4630 lsl x0, x1, x2 // Do the shift.
4631 GET_INST_OPCODE ip // extract opcode from rINST
4632 SET_VREG_WIDE x0, w3 // vAA<- x0
4633 GOTO_OPCODE ip // jump to next instruction
4634 /* 11-14 instructions */
4635
4636
4637/* ------------------------------ */
4638 .balign 128
4639.L_op_shr_long: /* 0xa4 */
4640/* File: arm64/op_shr_long.S */
4641/* File: arm64/shiftWide.S */
4642 /*
4643 * 64-bit shift operation.
4644 *
4645 * For: shl-long, shr-long, ushr-long
4646 */
4647 /* binop vAA, vBB, vCC */
4648 FETCH w0, 1 // w0<- CCBB
4649 lsr w3, wINST, #8 // w3<- AA
4650 lsr w2, w0, #8 // w2<- CC
4651 GET_VREG w2, w2 // w2<- vCC (shift count)
4652 and w1, w0, #255 // w1<- BB
4653 GET_VREG_WIDE x1, w1 // x1<- vBB
4654 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4655 and x2, x2, #63 // Mask low 6
4656 asr x0, x1, x2 // Do the shift.
4657 GET_INST_OPCODE ip // extract opcode from rINST
4658 SET_VREG_WIDE x0, w3 // vAA<- x0
4659 GOTO_OPCODE ip // jump to next instruction
4660 /* 11-14 instructions */
4661
4662
4663/* ------------------------------ */
4664 .balign 128
4665.L_op_ushr_long: /* 0xa5 */
4666/* File: arm64/op_ushr_long.S */
4667/* File: arm64/shiftWide.S */
4668 /*
4669 * 64-bit shift operation.
4670 *
4671 * For: shl-long, shr-long, ushr-long
4672 */
4673 /* binop vAA, vBB, vCC */
4674 FETCH w0, 1 // w0<- CCBB
4675 lsr w3, wINST, #8 // w3<- AA
4676 lsr w2, w0, #8 // w2<- CC
4677 GET_VREG w2, w2 // w2<- vCC (shift count)
4678 and w1, w0, #255 // w1<- BB
4679 GET_VREG_WIDE x1, w1 // x1<- vBB
4680 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4681 and x2, x2, #63 // Mask low 6
4682 lsr x0, x1, x2 // Do the shift.
4683 GET_INST_OPCODE ip // extract opcode from rINST
4684 SET_VREG_WIDE x0, w3 // vAA<- x0
4685 GOTO_OPCODE ip // jump to next instruction
4686 /* 11-14 instructions */
4687
4688
4689/* ------------------------------ */
4690 .balign 128
4691.L_op_add_float: /* 0xa6 */
4692/* File: arm64/op_add_float.S */
4693/* File: arm64/fbinop.S */
4694 /*:
4695 * Generic 32-bit floating-point operation.
4696 *
4697 * For: add-float, sub-float, mul-float, div-float
4698 * form: <op> s0, s0, s1
4699 */
4700 /* floatop vAA, vBB, vCC */
4701 FETCH w0, 1 // r0<- CCBB
4702 lsr w1, w0, #8 // r2<- CC
4703 and w0, w0, #255 // r1<- BB
4704 GET_VREG s1, w1
4705 GET_VREG s0, w0
4706 fadd s0, s0, s1 // s0<- op
4707 lsr w1, wINST, #8 // r1<- AA
4708 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4709 GET_INST_OPCODE ip // extract opcode from rINST
4710 SET_VREG s0, w1
4711 GOTO_OPCODE ip // jump to next instruction
4712
4713
4714/* ------------------------------ */
4715 .balign 128
4716.L_op_sub_float: /* 0xa7 */
4717/* File: arm64/op_sub_float.S */
4718/* File: arm64/fbinop.S */
4719 /*:
4720 * Generic 32-bit floating-point operation.
4721 *
4722 * For: add-float, sub-float, mul-float, div-float
4723 * form: <op> s0, s0, s1
4724 */
4725 /* floatop vAA, vBB, vCC */
4726 FETCH w0, 1 // r0<- CCBB
4727 lsr w1, w0, #8 // r2<- CC
4728 and w0, w0, #255 // r1<- BB
4729 GET_VREG s1, w1
4730 GET_VREG s0, w0
4731 fsub s0, s0, s1 // s0<- op
4732 lsr w1, wINST, #8 // r1<- AA
4733 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4734 GET_INST_OPCODE ip // extract opcode from rINST
4735 SET_VREG s0, w1
4736 GOTO_OPCODE ip // jump to next instruction
4737
4738
4739/* ------------------------------ */
4740 .balign 128
4741.L_op_mul_float: /* 0xa8 */
4742/* File: arm64/op_mul_float.S */
4743/* File: arm64/fbinop.S */
4744 /*:
4745 * Generic 32-bit floating-point operation.
4746 *
4747 * For: add-float, sub-float, mul-float, div-float
4748 * form: <op> s0, s0, s1
4749 */
4750 /* floatop vAA, vBB, vCC */
4751 FETCH w0, 1 // r0<- CCBB
4752 lsr w1, w0, #8 // r2<- CC
4753 and w0, w0, #255 // r1<- BB
4754 GET_VREG s1, w1
4755 GET_VREG s0, w0
4756 fmul s0, s0, s1 // s0<- op
4757 lsr w1, wINST, #8 // r1<- AA
4758 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4759 GET_INST_OPCODE ip // extract opcode from rINST
4760 SET_VREG s0, w1
4761 GOTO_OPCODE ip // jump to next instruction
4762
4763
4764/* ------------------------------ */
4765 .balign 128
4766.L_op_div_float: /* 0xa9 */
4767/* File: arm64/op_div_float.S */
4768/* File: arm64/fbinop.S */
4769 /*:
4770 * Generic 32-bit floating-point operation.
4771 *
4772 * For: add-float, sub-float, mul-float, div-float
4773 * form: <op> s0, s0, s1
4774 */
4775 /* floatop vAA, vBB, vCC */
4776 FETCH w0, 1 // r0<- CCBB
4777 lsr w1, w0, #8 // r2<- CC
4778 and w0, w0, #255 // r1<- BB
4779 GET_VREG s1, w1
4780 GET_VREG s0, w0
4781 fdiv s0, s0, s1 // s0<- op
4782 lsr w1, wINST, #8 // r1<- AA
4783 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4784 GET_INST_OPCODE ip // extract opcode from rINST
4785 SET_VREG s0, w1
4786 GOTO_OPCODE ip // jump to next instruction
4787
4788
4789/* ------------------------------ */
4790 .balign 128
4791.L_op_rem_float: /* 0xaa */
4792/* File: arm64/op_rem_float.S */
4793/* EABI doesn't define a float remainder function, but libm does */
4794/* File: arm64/fbinop.S */
4795 /*:
4796 * Generic 32-bit floating-point operation.
4797 *
4798 * For: add-float, sub-float, mul-float, div-float
4799 * form: <op> s0, s0, s1
4800 */
4801 /* floatop vAA, vBB, vCC */
4802 FETCH w0, 1 // r0<- CCBB
4803 lsr w1, w0, #8 // r2<- CC
4804 and w0, w0, #255 // r1<- BB
4805 GET_VREG s1, w1
4806 GET_VREG s0, w0
4807 bl fmodf // s0<- op
4808 lsr w1, wINST, #8 // r1<- AA
4809 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4810 GET_INST_OPCODE ip // extract opcode from rINST
4811 SET_VREG s0, w1
4812 GOTO_OPCODE ip // jump to next instruction
4813
4814
4815/* ------------------------------ */
4816 .balign 128
4817.L_op_add_double: /* 0xab */
4818/* File: arm64/op_add_double.S */
4819/* File: arm64/binopWide.S */
4820 /*
4821 * Generic 64-bit binary operation. Provide an "instr" line that
4822 * specifies an instruction that performs "result = x1 op x2".
4823 * This could be an ARM instruction or a function call. (If the result
4824 * comes back in a register other than x0, you can override "result".)
4825 *
4826 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4827 * vCC (w1). Useful for integer division and modulus.
4828 *
4829 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4830 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4831 */
4832 /* binop vAA, vBB, vCC */
4833 FETCH w0, 1 // w0<- CCBB
4834 lsr w4, wINST, #8 // w4<- AA
4835 lsr w2, w0, #8 // w2<- CC
4836 and w1, w0, #255 // w1<- BB
4837 GET_VREG_WIDE d2, w2 // w2<- vCC
4838 GET_VREG_WIDE d1, w1 // w1<- vBB
4839 .if 0
4840 cbz d2, common_errDivideByZero // is second operand zero?
4841 .endif
4842 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4843
4844 fadd d0, d1, d2 // d0<- op, w0-w4 changed
4845 GET_INST_OPCODE ip // extract opcode from rINST
4846 SET_VREG_WIDE d0, w4 // vAA<- d0
4847 GOTO_OPCODE ip // jump to next instruction
4848 /* 11-14 instructions */
4849
4850
4851/* ------------------------------ */
4852 .balign 128
4853.L_op_sub_double: /* 0xac */
4854/* File: arm64/op_sub_double.S */
4855/* File: arm64/binopWide.S */
4856 /*
4857 * Generic 64-bit binary operation. Provide an "instr" line that
4858 * specifies an instruction that performs "result = x1 op x2".
4859 * This could be an ARM instruction or a function call. (If the result
4860 * comes back in a register other than x0, you can override "result".)
4861 *
4862 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4863 * vCC (w1). Useful for integer division and modulus.
4864 *
4865 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4866 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4867 */
4868 /* binop vAA, vBB, vCC */
4869 FETCH w0, 1 // w0<- CCBB
4870 lsr w4, wINST, #8 // w4<- AA
4871 lsr w2, w0, #8 // w2<- CC
4872 and w1, w0, #255 // w1<- BB
4873 GET_VREG_WIDE d2, w2 // w2<- vCC
4874 GET_VREG_WIDE d1, w1 // w1<- vBB
4875 .if 0
4876 cbz d2, common_errDivideByZero // is second operand zero?
4877 .endif
4878 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4879
4880 fsub d0, d1, d2 // d0<- op, w0-w4 changed
4881 GET_INST_OPCODE ip // extract opcode from rINST
4882 SET_VREG_WIDE d0, w4 // vAA<- d0
4883 GOTO_OPCODE ip // jump to next instruction
4884 /* 11-14 instructions */
4885
4886
4887/* ------------------------------ */
4888 .balign 128
4889.L_op_mul_double: /* 0xad */
4890/* File: arm64/op_mul_double.S */
4891/* File: arm64/binopWide.S */
4892 /*
4893 * Generic 64-bit binary operation. Provide an "instr" line that
4894 * specifies an instruction that performs "result = x1 op x2".
4895 * This could be an ARM instruction or a function call. (If the result
4896 * comes back in a register other than x0, you can override "result".)
4897 *
4898 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4899 * vCC (w1). Useful for integer division and modulus.
4900 *
4901 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4902 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4903 */
4904 /* binop vAA, vBB, vCC */
4905 FETCH w0, 1 // w0<- CCBB
4906 lsr w4, wINST, #8 // w4<- AA
4907 lsr w2, w0, #8 // w2<- CC
4908 and w1, w0, #255 // w1<- BB
4909 GET_VREG_WIDE d2, w2 // w2<- vCC
4910 GET_VREG_WIDE d1, w1 // w1<- vBB
4911 .if 0
4912 cbz d2, common_errDivideByZero // is second operand zero?
4913 .endif
4914 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4915
4916 fmul d0, d1, d2 // d0<- op, w0-w4 changed
4917 GET_INST_OPCODE ip // extract opcode from rINST
4918 SET_VREG_WIDE d0, w4 // vAA<- d0
4919 GOTO_OPCODE ip // jump to next instruction
4920 /* 11-14 instructions */
4921
4922
4923/* ------------------------------ */
4924 .balign 128
4925.L_op_div_double: /* 0xae */
4926/* File: arm64/op_div_double.S */
4927/* File: arm64/binopWide.S */
4928 /*
4929 * Generic 64-bit binary operation. Provide an "instr" line that
4930 * specifies an instruction that performs "result = x1 op x2".
4931 * This could be an ARM instruction or a function call. (If the result
4932 * comes back in a register other than x0, you can override "result".)
4933 *
4934 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4935 * vCC (w1). Useful for integer division and modulus.
4936 *
4937 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4938 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4939 */
4940 /* binop vAA, vBB, vCC */
4941 FETCH w0, 1 // w0<- CCBB
4942 lsr w4, wINST, #8 // w4<- AA
4943 lsr w2, w0, #8 // w2<- CC
4944 and w1, w0, #255 // w1<- BB
4945 GET_VREG_WIDE d2, w2 // w2<- vCC
4946 GET_VREG_WIDE d1, w1 // w1<- vBB
4947 .if 0
4948 cbz d2, common_errDivideByZero // is second operand zero?
4949 .endif
4950 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4951
4952 fdiv d0, d1, d2 // d0<- op, w0-w4 changed
4953 GET_INST_OPCODE ip // extract opcode from rINST
4954 SET_VREG_WIDE d0, w4 // vAA<- d0
4955 GOTO_OPCODE ip // jump to next instruction
4956 /* 11-14 instructions */
4957
4958
4959/* ------------------------------ */
4960 .balign 128
4961.L_op_rem_double: /* 0xaf */
4962/* File: arm64/op_rem_double.S */
4963 /* rem vAA, vBB, vCC */
4964 FETCH w0, 1 // w0<- CCBB
4965 lsr w2, w0, #8 // w2<- CC
4966 and w1, w0, #255 // w1<- BB
4967 GET_VREG_WIDE d1, w2 // d1<- vCC
4968 GET_VREG_WIDE d0, w1 // d0<- vBB
4969 bl fmod
4970 lsr w4, wINST, #8 // w4<- AA
4971 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4972 GET_INST_OPCODE ip // extract opcode from rINST
4973 SET_VREG_WIDE d0, w4 // vAA<- result
4974 GOTO_OPCODE ip // jump to next instruction
4975 /* 11-14 instructions */
4976
4977/* ------------------------------ */
4978 .balign 128
4979.L_op_add_int_2addr: /* 0xb0 */
4980/* File: arm64/op_add_int_2addr.S */
4981/* File: arm64/binop2addr.S */
4982 /*
4983 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4984 * that specifies an instruction that performs "result = w0 op w1".
4985 * This could be an ARM instruction or a function call. (If the result
4986 * comes back in a register other than w0, you can override "result".)
4987 *
4988 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4989 * vCC (w1). Useful for integer division and modulus.
4990 *
4991 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4992 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4993 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4994 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4995 */
4996 /* binop/2addr vA, vB */
4997 lsr w3, wINST, #12 // w3<- B
4998 ubfx w9, wINST, #8, #4 // w9<- A
4999 GET_VREG w1, w3 // w1<- vB
5000 GET_VREG w0, w9 // w0<- vA
5001 .if 0
5002 cbz w1, common_errDivideByZero
5003 .endif
5004 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5005 // optional op; may set condition codes
5006 add w0, w0, w1 // w0<- op, w0-w3 changed
5007 GET_INST_OPCODE ip // extract opcode from rINST
5008 SET_VREG w0, w9 // vAA<- w0
5009 GOTO_OPCODE ip // jump to next instruction
5010 /* 10-13 instructions */
5011
5012
5013/* ------------------------------ */
5014 .balign 128
5015.L_op_sub_int_2addr: /* 0xb1 */
5016/* File: arm64/op_sub_int_2addr.S */
5017/* File: arm64/binop2addr.S */
5018 /*
5019 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5020 * that specifies an instruction that performs "result = w0 op w1".
5021 * This could be an ARM instruction or a function call. (If the result
5022 * comes back in a register other than w0, you can override "result".)
5023 *
5024 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5025 * vCC (w1). Useful for integer division and modulus.
5026 *
5027 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5028 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5029 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5030 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5031 */
5032 /* binop/2addr vA, vB */
5033 lsr w3, wINST, #12 // w3<- B
5034 ubfx w9, wINST, #8, #4 // w9<- A
5035 GET_VREG w1, w3 // w1<- vB
5036 GET_VREG w0, w9 // w0<- vA
5037 .if 0
5038 cbz w1, common_errDivideByZero
5039 .endif
5040 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5041 // optional op; may set condition codes
5042 sub w0, w0, w1 // w0<- op, w0-w3 changed
5043 GET_INST_OPCODE ip // extract opcode from rINST
5044 SET_VREG w0, w9 // vAA<- w0
5045 GOTO_OPCODE ip // jump to next instruction
5046 /* 10-13 instructions */
5047
5048
5049/* ------------------------------ */
5050 .balign 128
5051.L_op_mul_int_2addr: /* 0xb2 */
5052/* File: arm64/op_mul_int_2addr.S */
5053/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
5054/* File: arm64/binop2addr.S */
5055 /*
5056 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5057 * that specifies an instruction that performs "result = w0 op w1".
5058 * This could be an ARM instruction or a function call. (If the result
5059 * comes back in a register other than w0, you can override "result".)
5060 *
5061 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5062 * vCC (w1). Useful for integer division and modulus.
5063 *
5064 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5065 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5066 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5067 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5068 */
5069 /* binop/2addr vA, vB */
5070 lsr w3, wINST, #12 // w3<- B
5071 ubfx w9, wINST, #8, #4 // w9<- A
5072 GET_VREG w1, w3 // w1<- vB
5073 GET_VREG w0, w9 // w0<- vA
5074 .if 0
5075 cbz w1, common_errDivideByZero
5076 .endif
5077 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5078 // optional op; may set condition codes
5079 mul w0, w1, w0 // w0<- op, w0-w3 changed
5080 GET_INST_OPCODE ip // extract opcode from rINST
5081 SET_VREG w0, w9 // vAA<- w0
5082 GOTO_OPCODE ip // jump to next instruction
5083 /* 10-13 instructions */
5084
5085
5086/* ------------------------------ */
5087 .balign 128
5088.L_op_div_int_2addr: /* 0xb3 */
5089/* File: arm64/op_div_int_2addr.S */
5090/* File: arm64/binop2addr.S */
5091 /*
5092 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5093 * that specifies an instruction that performs "result = w0 op w1".
5094 * This could be an ARM instruction or a function call. (If the result
5095 * comes back in a register other than w0, you can override "result".)
5096 *
5097 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5098 * vCC (w1). Useful for integer division and modulus.
5099 *
5100 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5101 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5102 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5103 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5104 */
5105 /* binop/2addr vA, vB */
5106 lsr w3, wINST, #12 // w3<- B
5107 ubfx w9, wINST, #8, #4 // w9<- A
5108 GET_VREG w1, w3 // w1<- vB
5109 GET_VREG w0, w9 // w0<- vA
5110 .if 1
5111 cbz w1, common_errDivideByZero
5112 .endif
5113 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5114 // optional op; may set condition codes
5115 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
5116 GET_INST_OPCODE ip // extract opcode from rINST
5117 SET_VREG w0, w9 // vAA<- w0
5118 GOTO_OPCODE ip // jump to next instruction
5119 /* 10-13 instructions */
5120
5121
5122/* ------------------------------ */
5123 .balign 128
5124.L_op_rem_int_2addr: /* 0xb4 */
5125/* File: arm64/op_rem_int_2addr.S */
5126/* File: arm64/binop2addr.S */
5127 /*
5128 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5129 * that specifies an instruction that performs "result = w0 op w1".
5130 * This could be an ARM instruction or a function call. (If the result
5131 * comes back in a register other than w0, you can override "result".)
5132 *
5133 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5134 * vCC (w1). Useful for integer division and modulus.
5135 *
5136 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5137 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5138 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5139 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5140 */
5141 /* binop/2addr vA, vB */
5142 lsr w3, wINST, #12 // w3<- B
5143 ubfx w9, wINST, #8, #4 // w9<- A
5144 GET_VREG w1, w3 // w1<- vB
5145 GET_VREG w0, w9 // w0<- vA
5146 .if 1
5147 cbz w1, common_errDivideByZero
5148 .endif
5149 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5150 sdiv w2, w0, w1 // optional op; may set condition codes
5151 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
5152 GET_INST_OPCODE ip // extract opcode from rINST
5153 SET_VREG w0, w9 // vAA<- w0
5154 GOTO_OPCODE ip // jump to next instruction
5155 /* 10-13 instructions */
5156
5157
5158/* ------------------------------ */
5159 .balign 128
5160.L_op_and_int_2addr: /* 0xb5 */
5161/* File: arm64/op_and_int_2addr.S */
5162/* File: arm64/binop2addr.S */
5163 /*
5164 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5165 * that specifies an instruction that performs "result = w0 op w1".
5166 * This could be an ARM instruction or a function call. (If the result
5167 * comes back in a register other than w0, you can override "result".)
5168 *
5169 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5170 * vCC (w1). Useful for integer division and modulus.
5171 *
5172 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5173 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5174 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5175 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5176 */
5177 /* binop/2addr vA, vB */
5178 lsr w3, wINST, #12 // w3<- B
5179 ubfx w9, wINST, #8, #4 // w9<- A
5180 GET_VREG w1, w3 // w1<- vB
5181 GET_VREG w0, w9 // w0<- vA
5182 .if 0
5183 cbz w1, common_errDivideByZero
5184 .endif
5185 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5186 // optional op; may set condition codes
5187 and w0, w0, w1 // w0<- op, w0-w3 changed
5188 GET_INST_OPCODE ip // extract opcode from rINST
5189 SET_VREG w0, w9 // vAA<- w0
5190 GOTO_OPCODE ip // jump to next instruction
5191 /* 10-13 instructions */
5192
5193
5194/* ------------------------------ */
5195 .balign 128
5196.L_op_or_int_2addr: /* 0xb6 */
5197/* File: arm64/op_or_int_2addr.S */
5198/* File: arm64/binop2addr.S */
5199 /*
5200 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5201 * that specifies an instruction that performs "result = w0 op w1".
5202 * This could be an ARM instruction or a function call. (If the result
5203 * comes back in a register other than w0, you can override "result".)
5204 *
5205 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5206 * vCC (w1). Useful for integer division and modulus.
5207 *
5208 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5209 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5210 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5211 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5212 */
5213 /* binop/2addr vA, vB */
5214 lsr w3, wINST, #12 // w3<- B
5215 ubfx w9, wINST, #8, #4 // w9<- A
5216 GET_VREG w1, w3 // w1<- vB
5217 GET_VREG w0, w9 // w0<- vA
5218 .if 0
5219 cbz w1, common_errDivideByZero
5220 .endif
5221 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5222 // optional op; may set condition codes
5223 orr w0, w0, w1 // w0<- op, w0-w3 changed
5224 GET_INST_OPCODE ip // extract opcode from rINST
5225 SET_VREG w0, w9 // vAA<- w0
5226 GOTO_OPCODE ip // jump to next instruction
5227 /* 10-13 instructions */
5228
5229
5230/* ------------------------------ */
5231 .balign 128
5232.L_op_xor_int_2addr: /* 0xb7 */
5233/* File: arm64/op_xor_int_2addr.S */
5234/* File: arm64/binop2addr.S */
5235 /*
5236 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5237 * that specifies an instruction that performs "result = w0 op w1".
5238 * This could be an ARM instruction or a function call. (If the result
5239 * comes back in a register other than w0, you can override "result".)
5240 *
5241 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5242 * vCC (w1). Useful for integer division and modulus.
5243 *
5244 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5245 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5246 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5247 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5248 */
5249 /* binop/2addr vA, vB */
5250 lsr w3, wINST, #12 // w3<- B
5251 ubfx w9, wINST, #8, #4 // w9<- A
5252 GET_VREG w1, w3 // w1<- vB
5253 GET_VREG w0, w9 // w0<- vA
5254 .if 0
5255 cbz w1, common_errDivideByZero
5256 .endif
5257 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5258 // optional op; may set condition codes
5259 eor w0, w0, w1 // w0<- op, w0-w3 changed
5260 GET_INST_OPCODE ip // extract opcode from rINST
5261 SET_VREG w0, w9 // vAA<- w0
5262 GOTO_OPCODE ip // jump to next instruction
5263 /* 10-13 instructions */
5264
5265
5266/* ------------------------------ */
5267 .balign 128
5268.L_op_shl_int_2addr: /* 0xb8 */
5269/* File: arm64/op_shl_int_2addr.S */
5270/* File: arm64/binop2addr.S */
5271 /*
5272 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5273 * that specifies an instruction that performs "result = w0 op w1".
5274 * This could be an ARM instruction or a function call. (If the result
5275 * comes back in a register other than w0, you can override "result".)
5276 *
5277 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5278 * vCC (w1). Useful for integer division and modulus.
5279 *
5280 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5281 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5282 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5283 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5284 */
5285 /* binop/2addr vA, vB */
5286 lsr w3, wINST, #12 // w3<- B
5287 ubfx w9, wINST, #8, #4 // w9<- A
5288 GET_VREG w1, w3 // w1<- vB
5289 GET_VREG w0, w9 // w0<- vA
5290 .if 0
5291 cbz w1, common_errDivideByZero
5292 .endif
5293 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5294 and w1, w1, #31 // optional op; may set condition codes
5295 lsl w0, w0, w1 // w0<- op, w0-w3 changed
5296 GET_INST_OPCODE ip // extract opcode from rINST
5297 SET_VREG w0, w9 // vAA<- w0
5298 GOTO_OPCODE ip // jump to next instruction
5299 /* 10-13 instructions */
5300
5301
5302/* ------------------------------ */
5303 .balign 128
5304.L_op_shr_int_2addr: /* 0xb9 */
5305/* File: arm64/op_shr_int_2addr.S */
5306/* File: arm64/binop2addr.S */
5307 /*
5308 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5309 * that specifies an instruction that performs "result = w0 op w1".
5310 * This could be an ARM instruction or a function call. (If the result
5311 * comes back in a register other than w0, you can override "result".)
5312 *
5313 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5314 * vCC (w1). Useful for integer division and modulus.
5315 *
5316 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5317 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5318 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5319 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5320 */
5321 /* binop/2addr vA, vB */
5322 lsr w3, wINST, #12 // w3<- B
5323 ubfx w9, wINST, #8, #4 // w9<- A
5324 GET_VREG w1, w3 // w1<- vB
5325 GET_VREG w0, w9 // w0<- vA
5326 .if 0
5327 cbz w1, common_errDivideByZero
5328 .endif
5329 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5330 and w1, w1, #31 // optional op; may set condition codes
5331 asr w0, w0, w1 // w0<- op, w0-w3 changed
5332 GET_INST_OPCODE ip // extract opcode from rINST
5333 SET_VREG w0, w9 // vAA<- w0
5334 GOTO_OPCODE ip // jump to next instruction
5335 /* 10-13 instructions */
5336
5337
5338/* ------------------------------ */
5339 .balign 128
5340.L_op_ushr_int_2addr: /* 0xba */
5341/* File: arm64/op_ushr_int_2addr.S */
5342/* File: arm64/binop2addr.S */
5343 /*
5344 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5345 * that specifies an instruction that performs "result = w0 op w1".
5346 * This could be an ARM instruction or a function call. (If the result
5347 * comes back in a register other than w0, you can override "result".)
5348 *
5349 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5350 * vCC (w1). Useful for integer division and modulus.
5351 *
5352 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5353 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5354 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5355 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5356 */
5357 /* binop/2addr vA, vB */
5358 lsr w3, wINST, #12 // w3<- B
5359 ubfx w9, wINST, #8, #4 // w9<- A
5360 GET_VREG w1, w3 // w1<- vB
5361 GET_VREG w0, w9 // w0<- vA
5362 .if 0
5363 cbz w1, common_errDivideByZero
5364 .endif
5365 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5366 and w1, w1, #31 // optional op; may set condition codes
5367 lsr w0, w0, w1 // w0<- op, w0-w3 changed
5368 GET_INST_OPCODE ip // extract opcode from rINST
5369 SET_VREG w0, w9 // vAA<- w0
5370 GOTO_OPCODE ip // jump to next instruction
5371 /* 10-13 instructions */
5372
5373
5374/* ------------------------------ */
5375 .balign 128
5376.L_op_add_long_2addr: /* 0xbb */
5377/* File: arm64/op_add_long_2addr.S */
5378/* File: arm64/binopWide2addr.S */
5379 /*
5380 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5381 * that specifies an instruction that performs "x0 = x0 op x1".
5382 * This must not be a function call, as we keep w2 live across it.
5383 *
5384 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5385 * vCC (w1). Useful for integer division and modulus.
5386 *
5387 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5388 * and-long/2addr, or-long/2addr, xor-long/2addr,
5389 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5390 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5391 */
5392 /* binop/2addr vA, vB */
5393 lsr w1, wINST, #12 // w1<- B
5394 ubfx w2, wINST, #8, #4 // w2<- A
5395 GET_VREG_WIDE x1, w1 // x1<- vB
5396 GET_VREG_WIDE x0, w2 // x0<- vA
5397 .if 0
5398 cbz x1, common_errDivideByZero
5399 .endif
5400 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5401
5402 add x0, x0, x1 // result<- op
5403 GET_INST_OPCODE ip // extract opcode from rINST
5404 SET_VREG_WIDE x0, w2 // vAA<- result
5405 GOTO_OPCODE ip // jump to next instruction
5406 /* 10-13 instructions */
5407
5408
5409/* ------------------------------ */
5410 .balign 128
5411.L_op_sub_long_2addr: /* 0xbc */
5412/* File: arm64/op_sub_long_2addr.S */
5413/* File: arm64/binopWide2addr.S */
5414 /*
5415 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5416 * that specifies an instruction that performs "x0 = x0 op x1".
5417 * This must not be a function call, as we keep w2 live across it.
5418 *
5419 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5420 * vCC (w1). Useful for integer division and modulus.
5421 *
5422 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5423 * and-long/2addr, or-long/2addr, xor-long/2addr,
5424 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5425 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5426 */
5427 /* binop/2addr vA, vB */
5428 lsr w1, wINST, #12 // w1<- B
5429 ubfx w2, wINST, #8, #4 // w2<- A
5430 GET_VREG_WIDE x1, w1 // x1<- vB
5431 GET_VREG_WIDE x0, w2 // x0<- vA
5432 .if 0
5433 cbz x1, common_errDivideByZero
5434 .endif
5435 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5436
5437 sub x0, x0, x1 // result<- op
5438 GET_INST_OPCODE ip // extract opcode from rINST
5439 SET_VREG_WIDE x0, w2 // vAA<- result
5440 GOTO_OPCODE ip // jump to next instruction
5441 /* 10-13 instructions */
5442
5443
5444/* ------------------------------ */
5445 .balign 128
5446.L_op_mul_long_2addr: /* 0xbd */
5447/* File: arm64/op_mul_long_2addr.S */
5448/* File: arm64/binopWide2addr.S */
5449 /*
5450 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5451 * that specifies an instruction that performs "x0 = x0 op x1".
5452 * This must not be a function call, as we keep w2 live across it.
5453 *
5454 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5455 * vCC (w1). Useful for integer division and modulus.
5456 *
5457 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5458 * and-long/2addr, or-long/2addr, xor-long/2addr,
5459 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5460 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5461 */
5462 /* binop/2addr vA, vB */
5463 lsr w1, wINST, #12 // w1<- B
5464 ubfx w2, wINST, #8, #4 // w2<- A
5465 GET_VREG_WIDE x1, w1 // x1<- vB
5466 GET_VREG_WIDE x0, w2 // x0<- vA
5467 .if 0
5468 cbz x1, common_errDivideByZero
5469 .endif
5470 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5471
5472 mul x0, x0, x1 // result<- op
5473 GET_INST_OPCODE ip // extract opcode from rINST
5474 SET_VREG_WIDE x0, w2 // vAA<- result
5475 GOTO_OPCODE ip // jump to next instruction
5476 /* 10-13 instructions */
5477
5478
5479/* ------------------------------ */
5480 .balign 128
5481.L_op_div_long_2addr: /* 0xbe */
5482/* File: arm64/op_div_long_2addr.S */
5483/* File: arm64/binopWide2addr.S */
5484 /*
5485 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5486 * that specifies an instruction that performs "x0 = x0 op x1".
5487 * This must not be a function call, as we keep w2 live across it.
5488 *
5489 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5490 * vCC (w1). Useful for integer division and modulus.
5491 *
5492 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5493 * and-long/2addr, or-long/2addr, xor-long/2addr,
5494 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5495 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5496 */
5497 /* binop/2addr vA, vB */
5498 lsr w1, wINST, #12 // w1<- B
5499 ubfx w2, wINST, #8, #4 // w2<- A
5500 GET_VREG_WIDE x1, w1 // x1<- vB
5501 GET_VREG_WIDE x0, w2 // x0<- vA
5502 .if 1
5503 cbz x1, common_errDivideByZero
5504 .endif
5505 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5506
5507 sdiv x0, x0, x1 // result<- op
5508 GET_INST_OPCODE ip // extract opcode from rINST
5509 SET_VREG_WIDE x0, w2 // vAA<- result
5510 GOTO_OPCODE ip // jump to next instruction
5511 /* 10-13 instructions */
5512
5513
5514/* ------------------------------ */
5515 .balign 128
5516.L_op_rem_long_2addr: /* 0xbf */
5517/* File: arm64/op_rem_long_2addr.S */
5518/* File: arm64/binopWide2addr.S */
5519 /*
5520 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5521 * that specifies an instruction that performs "x0 = x0 op x1".
5522 * This must not be a function call, as we keep w2 live across it.
5523 *
5524 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5525 * vCC (w1). Useful for integer division and modulus.
5526 *
5527 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5528 * and-long/2addr, or-long/2addr, xor-long/2addr,
5529 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5530 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5531 */
5532 /* binop/2addr vA, vB */
5533 lsr w1, wINST, #12 // w1<- B
5534 ubfx w2, wINST, #8, #4 // w2<- A
5535 GET_VREG_WIDE x1, w1 // x1<- vB
5536 GET_VREG_WIDE x0, w2 // x0<- vA
5537 .if 1
5538 cbz x1, common_errDivideByZero
5539 .endif
5540 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5541 sdiv x3, x0, x1
5542 msub x0, x3, x1, x0 // result<- op
5543 GET_INST_OPCODE ip // extract opcode from rINST
5544 SET_VREG_WIDE x0, w2 // vAA<- result
5545 GOTO_OPCODE ip // jump to next instruction
5546 /* 10-13 instructions */
5547
5548
5549/* ------------------------------ */
5550 .balign 128
5551.L_op_and_long_2addr: /* 0xc0 */
5552/* File: arm64/op_and_long_2addr.S */
5553/* File: arm64/binopWide2addr.S */
5554 /*
5555 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5556 * that specifies an instruction that performs "x0 = x0 op x1".
5557 * This must not be a function call, as we keep w2 live across it.
5558 *
5559 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5560 * vCC (w1). Useful for integer division and modulus.
5561 *
5562 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5563 * and-long/2addr, or-long/2addr, xor-long/2addr,
5564 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5565 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5566 */
5567 /* binop/2addr vA, vB */
5568 lsr w1, wINST, #12 // w1<- B
5569 ubfx w2, wINST, #8, #4 // w2<- A
5570 GET_VREG_WIDE x1, w1 // x1<- vB
5571 GET_VREG_WIDE x0, w2 // x0<- vA
5572 .if 0
5573 cbz x1, common_errDivideByZero
5574 .endif
5575 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5576
5577 and x0, x0, x1 // result<- op
5578 GET_INST_OPCODE ip // extract opcode from rINST
5579 SET_VREG_WIDE x0, w2 // vAA<- result
5580 GOTO_OPCODE ip // jump to next instruction
5581 /* 10-13 instructions */
5582
5583
5584/* ------------------------------ */
5585 .balign 128
5586.L_op_or_long_2addr: /* 0xc1 */
5587/* File: arm64/op_or_long_2addr.S */
5588/* File: arm64/binopWide2addr.S */
5589 /*
5590 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5591 * that specifies an instruction that performs "x0 = x0 op x1".
5592 * This must not be a function call, as we keep w2 live across it.
5593 *
5594 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5595 * vCC (w1). Useful for integer division and modulus.
5596 *
5597 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5598 * and-long/2addr, or-long/2addr, xor-long/2addr,
5599 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5600 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5601 */
5602 /* binop/2addr vA, vB */
5603 lsr w1, wINST, #12 // w1<- B
5604 ubfx w2, wINST, #8, #4 // w2<- A
5605 GET_VREG_WIDE x1, w1 // x1<- vB
5606 GET_VREG_WIDE x0, w2 // x0<- vA
5607 .if 0
5608 cbz x1, common_errDivideByZero
5609 .endif
5610 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5611
5612 orr x0, x0, x1 // result<- op
5613 GET_INST_OPCODE ip // extract opcode from rINST
5614 SET_VREG_WIDE x0, w2 // vAA<- result
5615 GOTO_OPCODE ip // jump to next instruction
5616 /* 10-13 instructions */
5617
5618
5619/* ------------------------------ */
5620 .balign 128
5621.L_op_xor_long_2addr: /* 0xc2 */
5622/* File: arm64/op_xor_long_2addr.S */
5623/* File: arm64/binopWide2addr.S */
5624 /*
5625 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5626 * that specifies an instruction that performs "x0 = x0 op x1".
5627 * This must not be a function call, as we keep w2 live across it.
5628 *
5629 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5630 * vCC (w1). Useful for integer division and modulus.
5631 *
5632 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5633 * and-long/2addr, or-long/2addr, xor-long/2addr,
5634 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5635 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5636 */
5637 /* binop/2addr vA, vB */
5638 lsr w1, wINST, #12 // w1<- B
5639 ubfx w2, wINST, #8, #4 // w2<- A
5640 GET_VREG_WIDE x1, w1 // x1<- vB
5641 GET_VREG_WIDE x0, w2 // x0<- vA
5642 .if 0
5643 cbz x1, common_errDivideByZero
5644 .endif
5645 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5646
5647 eor x0, x0, x1 // result<- op
5648 GET_INST_OPCODE ip // extract opcode from rINST
5649 SET_VREG_WIDE x0, w2 // vAA<- result
5650 GOTO_OPCODE ip // jump to next instruction
5651 /* 10-13 instructions */
5652
5653
5654/* ------------------------------ */
5655 .balign 128
5656.L_op_shl_long_2addr: /* 0xc3 */
5657/* File: arm64/op_shl_long_2addr.S */
5658/* File: arm64/shiftWide2addr.S */
5659 /*
5660 * Generic 64-bit shift operation.
5661 */
5662 /* binop/2addr vA, vB */
5663 lsr w1, wINST, #12 // w1<- B
5664 ubfx w2, wINST, #8, #4 // w2<- A
5665 GET_VREG w1, w1 // x1<- vB
5666 GET_VREG_WIDE x0, w2 // x0<- vA
5667 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5668 and x1, x1, #63 // Mask low 6 bits.
5669 lsl x0, x0, x1
5670 GET_INST_OPCODE ip // extract opcode from rINST
5671 SET_VREG_WIDE x0, w2 // vAA<- result
5672 GOTO_OPCODE ip // jump to next instruction
5673 /* 10-13 instructions */
5674
5675
5676/* ------------------------------ */
5677 .balign 128
5678.L_op_shr_long_2addr: /* 0xc4 */
5679/* File: arm64/op_shr_long_2addr.S */
5680/* File: arm64/shiftWide2addr.S */
5681 /*
5682 * Generic 64-bit shift operation.
5683 */
5684 /* binop/2addr vA, vB */
5685 lsr w1, wINST, #12 // w1<- B
5686 ubfx w2, wINST, #8, #4 // w2<- A
5687 GET_VREG w1, w1 // x1<- vB
5688 GET_VREG_WIDE x0, w2 // x0<- vA
5689 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5690 and x1, x1, #63 // Mask low 6 bits.
5691 asr x0, x0, x1
5692 GET_INST_OPCODE ip // extract opcode from rINST
5693 SET_VREG_WIDE x0, w2 // vAA<- result
5694 GOTO_OPCODE ip // jump to next instruction
5695 /* 10-13 instructions */
5696
5697
5698/* ------------------------------ */
5699 .balign 128
5700.L_op_ushr_long_2addr: /* 0xc5 */
5701/* File: arm64/op_ushr_long_2addr.S */
5702/* File: arm64/shiftWide2addr.S */
5703 /*
5704 * Generic 64-bit shift operation.
5705 */
5706 /* binop/2addr vA, vB */
5707 lsr w1, wINST, #12 // w1<- B
5708 ubfx w2, wINST, #8, #4 // w2<- A
5709 GET_VREG w1, w1 // x1<- vB
5710 GET_VREG_WIDE x0, w2 // x0<- vA
5711 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5712 and x1, x1, #63 // Mask low 6 bits.
5713 lsr x0, x0, x1
5714 GET_INST_OPCODE ip // extract opcode from rINST
5715 SET_VREG_WIDE x0, w2 // vAA<- result
5716 GOTO_OPCODE ip // jump to next instruction
5717 /* 10-13 instructions */
5718
5719
5720/* ------------------------------ */
5721 .balign 128
5722.L_op_add_float_2addr: /* 0xc6 */
5723/* File: arm64/op_add_float_2addr.S */
5724/* File: arm64/fbinop2addr.S */
5725 /*
5726 * Generic 32-bit floating point "/2addr" binary operation. Provide
5727 * an "instr" line that specifies an instruction that performs
5728 * "s2 = s0 op s1".
5729 *
5730 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5731 */
5732 /* binop/2addr vA, vB */
5733 lsr w3, wINST, #12 // w3<- B
5734 lsr w9, wINST, #8 // w9<- A+
5735 and w9, w9, #15 // w9<- A
5736 GET_VREG s1, w3
5737 GET_VREG s0, w9
5738 fadd s2, s0, s1 // s2<- op
5739 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5740 GET_INST_OPCODE ip // extract opcode from rINST
5741 SET_VREG s2, w9
5742 GOTO_OPCODE ip // jump to next instruction
5743
5744
5745/* ------------------------------ */
5746 .balign 128
5747.L_op_sub_float_2addr: /* 0xc7 */
5748/* File: arm64/op_sub_float_2addr.S */
5749/* File: arm64/fbinop2addr.S */
5750 /*
5751 * Generic 32-bit floating point "/2addr" binary operation. Provide
5752 * an "instr" line that specifies an instruction that performs
5753 * "s2 = s0 op s1".
5754 *
5755 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5756 */
5757 /* binop/2addr vA, vB */
5758 lsr w3, wINST, #12 // w3<- B
5759 lsr w9, wINST, #8 // w9<- A+
5760 and w9, w9, #15 // w9<- A
5761 GET_VREG s1, w3
5762 GET_VREG s0, w9
5763 fsub s2, s0, s1 // s2<- op
5764 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5765 GET_INST_OPCODE ip // extract opcode from rINST
5766 SET_VREG s2, w9
5767 GOTO_OPCODE ip // jump to next instruction
5768
5769
5770/* ------------------------------ */
5771 .balign 128
5772.L_op_mul_float_2addr: /* 0xc8 */
5773/* File: arm64/op_mul_float_2addr.S */
5774/* File: arm64/fbinop2addr.S */
5775 /*
5776 * Generic 32-bit floating point "/2addr" binary operation. Provide
5777 * an "instr" line that specifies an instruction that performs
5778 * "s2 = s0 op s1".
5779 *
5780 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5781 */
5782 /* binop/2addr vA, vB */
5783 lsr w3, wINST, #12 // w3<- B
5784 lsr w9, wINST, #8 // w9<- A+
5785 and w9, w9, #15 // w9<- A
5786 GET_VREG s1, w3
5787 GET_VREG s0, w9
5788 fmul s2, s0, s1 // s2<- op
5789 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5790 GET_INST_OPCODE ip // extract opcode from rINST
5791 SET_VREG s2, w9
5792 GOTO_OPCODE ip // jump to next instruction
5793
5794
5795/* ------------------------------ */
5796 .balign 128
5797.L_op_div_float_2addr: /* 0xc9 */
5798/* File: arm64/op_div_float_2addr.S */
5799/* File: arm64/fbinop2addr.S */
5800 /*
5801 * Generic 32-bit floating point "/2addr" binary operation. Provide
5802 * an "instr" line that specifies an instruction that performs
5803 * "s2 = s0 op s1".
5804 *
5805 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5806 */
5807 /* binop/2addr vA, vB */
5808 lsr w3, wINST, #12 // w3<- B
5809 lsr w9, wINST, #8 // w9<- A+
5810 and w9, w9, #15 // w9<- A
5811 GET_VREG s1, w3
5812 GET_VREG s0, w9
5813 fdiv s2, s0, s1 // s2<- op
5814 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5815 GET_INST_OPCODE ip // extract opcode from rINST
5816 SET_VREG s2, w9
5817 GOTO_OPCODE ip // jump to next instruction
5818
5819
5820/* ------------------------------ */
5821 .balign 128
5822.L_op_rem_float_2addr: /* 0xca */
5823/* File: arm64/op_rem_float_2addr.S */
5824 /* rem vA, vB */
5825 lsr w3, wINST, #12 // w3<- B
5826 lsr w9, wINST, #8 // w9<- A+
5827 and w9, w9, #15 // w9<- A
5828 GET_VREG s1, w3
5829 GET_VREG s0, w9
5830 bl fmodf
5831 lsr w9, wINST, #8 // w9<- A+
5832 and w9, w9, #15 // w9<- A
5833 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5834 GET_INST_OPCODE ip // extract opcode from rINST
5835 SET_VREG s0, w9
5836 GOTO_OPCODE ip // jump to next instruction
5837
5838/* ------------------------------ */
5839 .balign 128
5840.L_op_add_double_2addr: /* 0xcb */
5841/* File: arm64/op_add_double_2addr.S */
5842/* File: arm64/binopWide2addr.S */
5843 /*
5844 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5845 * that specifies an instruction that performs "x0 = x0 op x1".
5846 * This must not be a function call, as we keep w2 live across it.
5847 *
5848 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5849 * vCC (w1). Useful for integer division and modulus.
5850 *
5851 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5852 * and-long/2addr, or-long/2addr, xor-long/2addr,
5853 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5854 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5855 */
5856 /* binop/2addr vA, vB */
5857 lsr w1, wINST, #12 // w1<- B
5858 ubfx w2, wINST, #8, #4 // w2<- A
5859 GET_VREG_WIDE d1, w1 // x1<- vB
5860 GET_VREG_WIDE d0, w2 // x0<- vA
5861 .if 0
5862 cbz d1, common_errDivideByZero
5863 .endif
5864 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5865
5866 fadd d0, d0, d1 // result<- op
5867 GET_INST_OPCODE ip // extract opcode from rINST
5868 SET_VREG_WIDE d0, w2 // vAA<- result
5869 GOTO_OPCODE ip // jump to next instruction
5870 /* 10-13 instructions */
5871
5872
5873/* ------------------------------ */
5874 .balign 128
5875.L_op_sub_double_2addr: /* 0xcc */
5876/* File: arm64/op_sub_double_2addr.S */
5877/* File: arm64/binopWide2addr.S */
5878 /*
5879 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5880 * that specifies an instruction that performs "x0 = x0 op x1".
5881 * This must not be a function call, as we keep w2 live across it.
5882 *
5883 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5884 * vCC (w1). Useful for integer division and modulus.
5885 *
5886 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5887 * and-long/2addr, or-long/2addr, xor-long/2addr,
5888 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5889 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5890 */
5891 /* binop/2addr vA, vB */
5892 lsr w1, wINST, #12 // w1<- B
5893 ubfx w2, wINST, #8, #4 // w2<- A
5894 GET_VREG_WIDE d1, w1 // x1<- vB
5895 GET_VREG_WIDE d0, w2 // x0<- vA
5896 .if 0
5897 cbz d1, common_errDivideByZero
5898 .endif
5899 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5900
5901 fsub d0, d0, d1 // result<- op
5902 GET_INST_OPCODE ip // extract opcode from rINST
5903 SET_VREG_WIDE d0, w2 // vAA<- result
5904 GOTO_OPCODE ip // jump to next instruction
5905 /* 10-13 instructions */
5906
5907
5908/* ------------------------------ */
5909 .balign 128
5910.L_op_mul_double_2addr: /* 0xcd */
5911/* File: arm64/op_mul_double_2addr.S */
5912/* File: arm64/binopWide2addr.S */
5913 /*
5914 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5915 * that specifies an instruction that performs "x0 = x0 op x1".
5916 * This must not be a function call, as we keep w2 live across it.
5917 *
5918 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5919 * vCC (w1). Useful for integer division and modulus.
5920 *
5921 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5922 * and-long/2addr, or-long/2addr, xor-long/2addr,
5923 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5924 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5925 */
5926 /* binop/2addr vA, vB */
5927 lsr w1, wINST, #12 // w1<- B
5928 ubfx w2, wINST, #8, #4 // w2<- A
5929 GET_VREG_WIDE d1, w1 // x1<- vB
5930 GET_VREG_WIDE d0, w2 // x0<- vA
5931 .if 0
5932 cbz d1, common_errDivideByZero
5933 .endif
5934 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5935
5936 fmul d0, d0, d1 // result<- op
5937 GET_INST_OPCODE ip // extract opcode from rINST
5938 SET_VREG_WIDE d0, w2 // vAA<- result
5939 GOTO_OPCODE ip // jump to next instruction
5940 /* 10-13 instructions */
5941
5942
5943/* ------------------------------ */
5944 .balign 128
5945.L_op_div_double_2addr: /* 0xce */
5946/* File: arm64/op_div_double_2addr.S */
5947/* File: arm64/binopWide2addr.S */
5948 /*
5949 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5950 * that specifies an instruction that performs "x0 = x0 op x1".
5951 * This must not be a function call, as we keep w2 live across it.
5952 *
5953 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5954 * vCC (w1). Useful for integer division and modulus.
5955 *
5956 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5957 * and-long/2addr, or-long/2addr, xor-long/2addr,
5958 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5959 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5960 */
5961 /* binop/2addr vA, vB */
5962 lsr w1, wINST, #12 // w1<- B
5963 ubfx w2, wINST, #8, #4 // w2<- A
5964 GET_VREG_WIDE d1, w1 // x1<- vB
5965 GET_VREG_WIDE d0, w2 // x0<- vA
5966 .if 0
5967 cbz d1, common_errDivideByZero
5968 .endif
5969 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5970
5971 fdiv d0, d0, d1 // result<- op
5972 GET_INST_OPCODE ip // extract opcode from rINST
5973 SET_VREG_WIDE d0, w2 // vAA<- result
5974 GOTO_OPCODE ip // jump to next instruction
5975 /* 10-13 instructions */
5976
5977
5978/* ------------------------------ */
5979 .balign 128
5980.L_op_rem_double_2addr: /* 0xcf */
5981/* File: arm64/op_rem_double_2addr.S */
5982 /* rem vA, vB */
5983 lsr w1, wINST, #12 // w1<- B
5984 ubfx w2, wINST, #8, #4 // w2<- A
5985 GET_VREG_WIDE d1, w1 // d1<- vB
5986 GET_VREG_WIDE d0, w2 // d0<- vA
5987 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5988 bl fmod
5989 ubfx w2, wINST, #8, #4 // w2<- A (need to reload - killed across call)
5990 GET_INST_OPCODE ip // extract opcode from rINST
5991 SET_VREG_WIDE d0, w2 // vAA<- result
5992 GOTO_OPCODE ip // jump to next instruction
5993 /* 10-13 instructions */
5994
5995/* ------------------------------ */
5996 .balign 128
5997.L_op_add_int_lit16: /* 0xd0 */
5998/* File: arm64/op_add_int_lit16.S */
5999/* File: arm64/binopLit16.S */
6000 /*
6001 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6002 * that specifies an instruction that performs "result = w0 op w1".
6003 * This could be an ARM instruction or a function call. (If the result
6004 * comes back in a register other than w0, you can override "result".)
6005 *
6006 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6007 * vCC (w1). Useful for integer division and modulus.
6008 *
6009 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6010 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6011 */
6012 /* binop/lit16 vA, vB, #+CCCC */
6013 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6014 lsr w2, wINST, #12 // w2<- B
6015 ubfx w9, wINST, #8, #4 // w9<- A
6016 GET_VREG w0, w2 // w0<- vB
6017 .if 0
6018 cbz w1, common_errDivideByZero
6019 .endif
6020 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6021
6022 add w0, w0, w1 // w0<- op, w0-w3 changed
6023 GET_INST_OPCODE ip // extract opcode from rINST
6024 SET_VREG w0, w9 // vAA<- w0
6025 GOTO_OPCODE ip // jump to next instruction
6026 /* 10-13 instructions */
6027
6028
6029/* ------------------------------ */
6030 .balign 128
6031.L_op_rsub_int: /* 0xd1 */
6032/* File: arm64/op_rsub_int.S */
6033/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6034/* File: arm64/binopLit16.S */
6035 /*
6036 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6037 * that specifies an instruction that performs "result = w0 op w1".
6038 * This could be an ARM instruction or a function call. (If the result
6039 * comes back in a register other than w0, you can override "result".)
6040 *
6041 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6042 * vCC (w1). Useful for integer division and modulus.
6043 *
6044 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6045 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6046 */
6047 /* binop/lit16 vA, vB, #+CCCC */
6048 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6049 lsr w2, wINST, #12 // w2<- B
6050 ubfx w9, wINST, #8, #4 // w9<- A
6051 GET_VREG w0, w2 // w0<- vB
6052 .if 0
6053 cbz w1, common_errDivideByZero
6054 .endif
6055 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6056
6057 sub w0, w1, w0 // w0<- op, w0-w3 changed
6058 GET_INST_OPCODE ip // extract opcode from rINST
6059 SET_VREG w0, w9 // vAA<- w0
6060 GOTO_OPCODE ip // jump to next instruction
6061 /* 10-13 instructions */
6062
6063
6064/* ------------------------------ */
6065 .balign 128
6066.L_op_mul_int_lit16: /* 0xd2 */
6067/* File: arm64/op_mul_int_lit16.S */
6068/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
6069/* File: arm64/binopLit16.S */
6070 /*
6071 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6072 * that specifies an instruction that performs "result = w0 op w1".
6073 * This could be an ARM instruction or a function call. (If the result
6074 * comes back in a register other than w0, you can override "result".)
6075 *
6076 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6077 * vCC (w1). Useful for integer division and modulus.
6078 *
6079 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6080 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6081 */
6082 /* binop/lit16 vA, vB, #+CCCC */
6083 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6084 lsr w2, wINST, #12 // w2<- B
6085 ubfx w9, wINST, #8, #4 // w9<- A
6086 GET_VREG w0, w2 // w0<- vB
6087 .if 0
6088 cbz w1, common_errDivideByZero
6089 .endif
6090 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6091
6092 mul w0, w1, w0 // w0<- op, w0-w3 changed
6093 GET_INST_OPCODE ip // extract opcode from rINST
6094 SET_VREG w0, w9 // vAA<- w0
6095 GOTO_OPCODE ip // jump to next instruction
6096 /* 10-13 instructions */
6097
6098
6099/* ------------------------------ */
6100 .balign 128
6101.L_op_div_int_lit16: /* 0xd3 */
6102/* File: arm64/op_div_int_lit16.S */
6103/* File: arm64/binopLit16.S */
6104 /*
6105 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6106 * that specifies an instruction that performs "result = w0 op w1".
6107 * This could be an ARM instruction or a function call. (If the result
6108 * comes back in a register other than w0, you can override "result".)
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-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6114 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6115 */
6116 /* binop/lit16 vA, vB, #+CCCC */
6117 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6118 lsr w2, wINST, #12 // w2<- B
6119 ubfx w9, wINST, #8, #4 // w9<- A
6120 GET_VREG w0, w2 // w0<- vB
6121 .if 1
6122 cbz w1, common_errDivideByZero
6123 .endif
6124 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6125
6126 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
6127 GET_INST_OPCODE ip // extract opcode from rINST
6128 SET_VREG w0, w9 // vAA<- w0
6129 GOTO_OPCODE ip // jump to next instruction
6130 /* 10-13 instructions */
6131
6132
6133/* ------------------------------ */
6134 .balign 128
6135.L_op_rem_int_lit16: /* 0xd4 */
6136/* File: arm64/op_rem_int_lit16.S */
6137/* File: arm64/binopLit16.S */
6138 /*
6139 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6140 * that specifies an instruction that performs "result = w0 op w1".
6141 * This could be an ARM instruction or a function call. (If the result
6142 * comes back in a register other than w0, you can override "result".)
6143 *
6144 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6145 * vCC (w1). Useful for integer division and modulus.
6146 *
6147 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6148 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6149 */
6150 /* binop/lit16 vA, vB, #+CCCC */
6151 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6152 lsr w2, wINST, #12 // w2<- B
6153 ubfx w9, wINST, #8, #4 // w9<- A
6154 GET_VREG w0, w2 // w0<- vB
6155 .if 1
6156 cbz w1, common_errDivideByZero
6157 .endif
6158 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6159 sdiv w3, w0, w1
6160 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
6161 GET_INST_OPCODE ip // extract opcode from rINST
6162 SET_VREG w0, w9 // vAA<- w0
6163 GOTO_OPCODE ip // jump to next instruction
6164 /* 10-13 instructions */
6165
6166
6167/* ------------------------------ */
6168 .balign 128
6169.L_op_and_int_lit16: /* 0xd5 */
6170/* File: arm64/op_and_int_lit16.S */
6171/* File: arm64/binopLit16.S */
6172 /*
6173 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6174 * that specifies an instruction that performs "result = w0 op w1".
6175 * This could be an ARM instruction or a function call. (If the result
6176 * comes back in a register other than w0, you can override "result".)
6177 *
6178 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6179 * vCC (w1). Useful for integer division and modulus.
6180 *
6181 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6182 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6183 */
6184 /* binop/lit16 vA, vB, #+CCCC */
6185 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6186 lsr w2, wINST, #12 // w2<- B
6187 ubfx w9, wINST, #8, #4 // w9<- A
6188 GET_VREG w0, w2 // w0<- vB
6189 .if 0
6190 cbz w1, common_errDivideByZero
6191 .endif
6192 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6193
6194 and w0, w0, w1 // w0<- op, w0-w3 changed
6195 GET_INST_OPCODE ip // extract opcode from rINST
6196 SET_VREG w0, w9 // vAA<- w0
6197 GOTO_OPCODE ip // jump to next instruction
6198 /* 10-13 instructions */
6199
6200
6201/* ------------------------------ */
6202 .balign 128
6203.L_op_or_int_lit16: /* 0xd6 */
6204/* File: arm64/op_or_int_lit16.S */
6205/* File: arm64/binopLit16.S */
6206 /*
6207 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6208 * that specifies an instruction that performs "result = w0 op w1".
6209 * This could be an ARM instruction or a function call. (If the result
6210 * comes back in a register other than w0, you can override "result".)
6211 *
6212 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6213 * vCC (w1). Useful for integer division and modulus.
6214 *
6215 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6216 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6217 */
6218 /* binop/lit16 vA, vB, #+CCCC */
6219 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6220 lsr w2, wINST, #12 // w2<- B
6221 ubfx w9, wINST, #8, #4 // w9<- A
6222 GET_VREG w0, w2 // w0<- vB
6223 .if 0
6224 cbz w1, common_errDivideByZero
6225 .endif
6226 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6227
6228 orr w0, w0, w1 // w0<- op, w0-w3 changed
6229 GET_INST_OPCODE ip // extract opcode from rINST
6230 SET_VREG w0, w9 // vAA<- w0
6231 GOTO_OPCODE ip // jump to next instruction
6232 /* 10-13 instructions */
6233
6234
6235/* ------------------------------ */
6236 .balign 128
6237.L_op_xor_int_lit16: /* 0xd7 */
6238/* File: arm64/op_xor_int_lit16.S */
6239/* File: arm64/binopLit16.S */
6240 /*
6241 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6242 * that specifies an instruction that performs "result = w0 op w1".
6243 * This could be an ARM instruction or a function call. (If the result
6244 * comes back in a register other than w0, you can override "result".)
6245 *
6246 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6247 * vCC (w1). Useful for integer division and modulus.
6248 *
6249 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6250 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6251 */
6252 /* binop/lit16 vA, vB, #+CCCC */
6253 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6254 lsr w2, wINST, #12 // w2<- B
6255 ubfx w9, wINST, #8, #4 // w9<- A
6256 GET_VREG w0, w2 // w0<- vB
6257 .if 0
6258 cbz w1, common_errDivideByZero
6259 .endif
6260 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6261
6262 eor w0, w0, w1 // w0<- op, w0-w3 changed
6263 GET_INST_OPCODE ip // extract opcode from rINST
6264 SET_VREG w0, w9 // vAA<- w0
6265 GOTO_OPCODE ip // jump to next instruction
6266 /* 10-13 instructions */
6267
6268
6269/* ------------------------------ */
6270 .balign 128
6271.L_op_add_int_lit8: /* 0xd8 */
6272/* File: arm64/op_add_int_lit8.S */
6273/* File: arm64/binopLit8.S */
6274 /*
6275 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6276 * that specifies an instruction that performs "result = w0 op w1".
6277 * This could be an ARM instruction or a function call. (If the result
6278 * comes back in a register other than w0, you can override "result".)
6279 *
6280 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6281 * vCC (w1). Useful for integer division and modulus.
6282 *
6283 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6284 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6285 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6286 */
6287 /* binop/lit8 vAA, vBB, #+CC */
6288 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6289 lsr w9, wINST, #8 // w9<- AA
6290 and w2, w3, #255 // w2<- BB
6291 GET_VREG w0, w2 // w0<- vBB
6292 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6293 .if 0
6294 cbz w1, common_errDivideByZero
6295 .endif
6296 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6297 // optional op; may set condition codes
6298 add w0, w0, w1 // w0<- op, w0-w3 changed
6299 GET_INST_OPCODE ip // extract opcode from rINST
6300 SET_VREG w0, w9 // vAA<- w0
6301 GOTO_OPCODE ip // jump to next instruction
6302 /* 10-12 instructions */
6303
6304
6305/* ------------------------------ */
6306 .balign 128
6307.L_op_rsub_int_lit8: /* 0xd9 */
6308/* File: arm64/op_rsub_int_lit8.S */
6309/* File: arm64/binopLit8.S */
6310 /*
6311 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6312 * that specifies an instruction that performs "result = w0 op w1".
6313 * This could be an ARM instruction or a function call. (If the result
6314 * comes back in a register other than w0, you can override "result".)
6315 *
6316 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6317 * vCC (w1). Useful for integer division and modulus.
6318 *
6319 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6320 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6321 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6322 */
6323 /* binop/lit8 vAA, vBB, #+CC */
6324 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6325 lsr w9, wINST, #8 // w9<- AA
6326 and w2, w3, #255 // w2<- BB
6327 GET_VREG w0, w2 // w0<- vBB
6328 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6329 .if 0
6330 cbz w1, common_errDivideByZero
6331 .endif
6332 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6333 // optional op; may set condition codes
6334 sub w0, w1, w0 // w0<- op, w0-w3 changed
6335 GET_INST_OPCODE ip // extract opcode from rINST
6336 SET_VREG w0, w9 // vAA<- w0
6337 GOTO_OPCODE ip // jump to next instruction
6338 /* 10-12 instructions */
6339
6340
6341/* ------------------------------ */
6342 .balign 128
6343.L_op_mul_int_lit8: /* 0xda */
6344/* File: arm64/op_mul_int_lit8.S */
6345/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
6346/* File: arm64/binopLit8.S */
6347 /*
6348 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6349 * that specifies an instruction that performs "result = w0 op w1".
6350 * This could be an ARM instruction or a function call. (If the result
6351 * comes back in a register other than w0, you can override "result".)
6352 *
6353 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6354 * vCC (w1). Useful for integer division and modulus.
6355 *
6356 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6357 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6358 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6359 */
6360 /* binop/lit8 vAA, vBB, #+CC */
6361 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6362 lsr w9, wINST, #8 // w9<- AA
6363 and w2, w3, #255 // w2<- BB
6364 GET_VREG w0, w2 // w0<- vBB
6365 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6366 .if 0
6367 cbz w1, common_errDivideByZero
6368 .endif
6369 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6370 // optional op; may set condition codes
6371 mul w0, w1, w0 // w0<- op, w0-w3 changed
6372 GET_INST_OPCODE ip // extract opcode from rINST
6373 SET_VREG w0, w9 // vAA<- w0
6374 GOTO_OPCODE ip // jump to next instruction
6375 /* 10-12 instructions */
6376
6377
6378/* ------------------------------ */
6379 .balign 128
6380.L_op_div_int_lit8: /* 0xdb */
6381/* File: arm64/op_div_int_lit8.S */
6382/* File: arm64/binopLit8.S */
6383 /*
6384 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6385 * that specifies an instruction that performs "result = w0 op w1".
6386 * This could be an ARM instruction or a function call. (If the result
6387 * comes back in a register other than w0, you can override "result".)
6388 *
6389 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6390 * vCC (w1). Useful for integer division and modulus.
6391 *
6392 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6393 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6394 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6395 */
6396 /* binop/lit8 vAA, vBB, #+CC */
6397 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6398 lsr w9, wINST, #8 // w9<- AA
6399 and w2, w3, #255 // w2<- BB
6400 GET_VREG w0, w2 // w0<- vBB
6401 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6402 .if 1
6403 cbz w1, common_errDivideByZero
6404 .endif
6405 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6406 // optional op; may set condition codes
6407 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
6408 GET_INST_OPCODE ip // extract opcode from rINST
6409 SET_VREG w0, w9 // vAA<- w0
6410 GOTO_OPCODE ip // jump to next instruction
6411 /* 10-12 instructions */
6412
6413
6414/* ------------------------------ */
6415 .balign 128
6416.L_op_rem_int_lit8: /* 0xdc */
6417/* File: arm64/op_rem_int_lit8.S */
6418/* File: arm64/binopLit8.S */
6419 /*
6420 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6421 * that specifies an instruction that performs "result = w0 op w1".
6422 * This could be an ARM instruction or a function call. (If the result
6423 * comes back in a register other than w0, you can override "result".)
6424 *
6425 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6426 * vCC (w1). Useful for integer division and modulus.
6427 *
6428 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6429 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6430 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6431 */
6432 /* binop/lit8 vAA, vBB, #+CC */
6433 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6434 lsr w9, wINST, #8 // w9<- AA
6435 and w2, w3, #255 // w2<- BB
6436 GET_VREG w0, w2 // w0<- vBB
6437 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6438 .if 1
6439 cbz w1, common_errDivideByZero
6440 .endif
6441 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6442 sdiv w3, w0, w1 // optional op; may set condition codes
6443 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
6444 GET_INST_OPCODE ip // extract opcode from rINST
6445 SET_VREG w0, w9 // vAA<- w0
6446 GOTO_OPCODE ip // jump to next instruction
6447 /* 10-12 instructions */
6448
6449
6450/* ------------------------------ */
6451 .balign 128
6452.L_op_and_int_lit8: /* 0xdd */
6453/* File: arm64/op_and_int_lit8.S */
6454/* File: arm64/binopLit8.S */
6455 /*
6456 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6457 * that specifies an instruction that performs "result = w0 op w1".
6458 * This could be an ARM instruction or a function call. (If the result
6459 * comes back in a register other than w0, you can override "result".)
6460 *
6461 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6462 * vCC (w1). Useful for integer division and modulus.
6463 *
6464 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6465 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6466 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6467 */
6468 /* binop/lit8 vAA, vBB, #+CC */
6469 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6470 lsr w9, wINST, #8 // w9<- AA
6471 and w2, w3, #255 // w2<- BB
6472 GET_VREG w0, w2 // w0<- vBB
6473 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6474 .if 0
6475 cbz w1, common_errDivideByZero
6476 .endif
6477 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6478 // optional op; may set condition codes
6479 and w0, w0, w1 // w0<- op, w0-w3 changed
6480 GET_INST_OPCODE ip // extract opcode from rINST
6481 SET_VREG w0, w9 // vAA<- w0
6482 GOTO_OPCODE ip // jump to next instruction
6483 /* 10-12 instructions */
6484
6485
6486/* ------------------------------ */
6487 .balign 128
6488.L_op_or_int_lit8: /* 0xde */
6489/* File: arm64/op_or_int_lit8.S */
6490/* File: arm64/binopLit8.S */
6491 /*
6492 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6493 * that specifies an instruction that performs "result = w0 op w1".
6494 * This could be an ARM instruction or a function call. (If the result
6495 * comes back in a register other than w0, you can override "result".)
6496 *
6497 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6498 * vCC (w1). Useful for integer division and modulus.
6499 *
6500 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6501 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6502 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6503 */
6504 /* binop/lit8 vAA, vBB, #+CC */
6505 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6506 lsr w9, wINST, #8 // w9<- AA
6507 and w2, w3, #255 // w2<- BB
6508 GET_VREG w0, w2 // w0<- vBB
6509 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6510 .if 0
6511 cbz w1, common_errDivideByZero
6512 .endif
6513 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6514 // optional op; may set condition codes
6515 orr w0, w0, w1 // w0<- op, w0-w3 changed
6516 GET_INST_OPCODE ip // extract opcode from rINST
6517 SET_VREG w0, w9 // vAA<- w0
6518 GOTO_OPCODE ip // jump to next instruction
6519 /* 10-12 instructions */
6520
6521
6522/* ------------------------------ */
6523 .balign 128
6524.L_op_xor_int_lit8: /* 0xdf */
6525/* File: arm64/op_xor_int_lit8.S */
6526/* File: arm64/binopLit8.S */
6527 /*
6528 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6529 * that specifies an instruction that performs "result = w0 op w1".
6530 * This could be an ARM instruction or a function call. (If the result
6531 * comes back in a register other than w0, you can override "result".)
6532 *
6533 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6534 * vCC (w1). Useful for integer division and modulus.
6535 *
6536 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6537 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6538 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6539 */
6540 /* binop/lit8 vAA, vBB, #+CC */
6541 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6542 lsr w9, wINST, #8 // w9<- AA
6543 and w2, w3, #255 // w2<- BB
6544 GET_VREG w0, w2 // w0<- vBB
6545 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6546 .if 0
6547 cbz w1, common_errDivideByZero
6548 .endif
6549 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6550 // optional op; may set condition codes
6551 eor w0, w0, w1 // w0<- op, w0-w3 changed
6552 GET_INST_OPCODE ip // extract opcode from rINST
6553 SET_VREG w0, w9 // vAA<- w0
6554 GOTO_OPCODE ip // jump to next instruction
6555 /* 10-12 instructions */
6556
6557
6558/* ------------------------------ */
6559 .balign 128
6560.L_op_shl_int_lit8: /* 0xe0 */
6561/* File: arm64/op_shl_int_lit8.S */
6562/* File: arm64/binopLit8.S */
6563 /*
6564 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6565 * that specifies an instruction that performs "result = w0 op w1".
6566 * This could be an ARM instruction or a function call. (If the result
6567 * comes back in a register other than w0, you can override "result".)
6568 *
6569 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6570 * vCC (w1). Useful for integer division and modulus.
6571 *
6572 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6573 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6574 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6575 */
6576 /* binop/lit8 vAA, vBB, #+CC */
6577 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6578 lsr w9, wINST, #8 // w9<- AA
6579 and w2, w3, #255 // w2<- BB
6580 GET_VREG w0, w2 // w0<- vBB
6581 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6582 .if 0
6583 cbz w1, common_errDivideByZero
6584 .endif
6585 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6586 and w1, w1, #31 // optional op; may set condition codes
6587 lsl w0, w0, w1 // w0<- op, w0-w3 changed
6588 GET_INST_OPCODE ip // extract opcode from rINST
6589 SET_VREG w0, w9 // vAA<- w0
6590 GOTO_OPCODE ip // jump to next instruction
6591 /* 10-12 instructions */
6592
6593
6594/* ------------------------------ */
6595 .balign 128
6596.L_op_shr_int_lit8: /* 0xe1 */
6597/* File: arm64/op_shr_int_lit8.S */
6598/* File: arm64/binopLit8.S */
6599 /*
6600 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6601 * that specifies an instruction that performs "result = w0 op w1".
6602 * This could be an ARM instruction or a function call. (If the result
6603 * comes back in a register other than w0, you can override "result".)
6604 *
6605 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6606 * vCC (w1). Useful for integer division and modulus.
6607 *
6608 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6609 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6610 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6611 */
6612 /* binop/lit8 vAA, vBB, #+CC */
6613 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6614 lsr w9, wINST, #8 // w9<- AA
6615 and w2, w3, #255 // w2<- BB
6616 GET_VREG w0, w2 // w0<- vBB
6617 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6618 .if 0
6619 cbz w1, common_errDivideByZero
6620 .endif
6621 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6622 and w1, w1, #31 // optional op; may set condition codes
6623 asr w0, w0, w1 // w0<- op, w0-w3 changed
6624 GET_INST_OPCODE ip // extract opcode from rINST
6625 SET_VREG w0, w9 // vAA<- w0
6626 GOTO_OPCODE ip // jump to next instruction
6627 /* 10-12 instructions */
6628
6629
6630/* ------------------------------ */
6631 .balign 128
6632.L_op_ushr_int_lit8: /* 0xe2 */
6633/* File: arm64/op_ushr_int_lit8.S */
6634/* File: arm64/binopLit8.S */
6635 /*
6636 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6637 * that specifies an instruction that performs "result = w0 op w1".
6638 * This could be an ARM instruction or a function call. (If the result
6639 * comes back in a register other than w0, you can override "result".)
6640 *
6641 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6642 * vCC (w1). Useful for integer division and modulus.
6643 *
6644 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6645 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6646 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6647 */
6648 /* binop/lit8 vAA, vBB, #+CC */
6649 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6650 lsr w9, wINST, #8 // w9<- AA
6651 and w2, w3, #255 // w2<- BB
6652 GET_VREG w0, w2 // w0<- vBB
6653 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6654 .if 0
6655 cbz w1, common_errDivideByZero
6656 .endif
6657 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6658 and w1, w1, #31 // optional op; may set condition codes
6659 lsr w0, w0, w1 // w0<- op, w0-w3 changed
6660 GET_INST_OPCODE ip // extract opcode from rINST
6661 SET_VREG w0, w9 // vAA<- w0
6662 GOTO_OPCODE ip // jump to next instruction
6663 /* 10-12 instructions */
6664
6665
6666/* ------------------------------ */
6667 .balign 128
6668.L_op_iget_quick: /* 0xe3 */
6669/* File: arm64/op_iget_quick.S */
6670 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6671 /* op vA, vB, offset//CCCC */
6672 lsr w2, wINST, #12 // w2<- B
6673 FETCH w1, 1 // w1<- field byte offset
6674 GET_VREG w3, w2 // w3<- object we're operating on
6675 ubfx w2, wINST, #8, #4 // w2<- A
6676 cmp x3, #0 // check object for null
6677 beq common_errNullObject // object was null
6678 ldr w0, [x3, x1] // w0<- obj.field
6679 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6680
6681 SET_VREG w0, w2 // fp[A]<- w0
6682 GET_INST_OPCODE ip // extract opcode from rINST
6683 GOTO_OPCODE ip // jump to next instruction
6684
6685/* ------------------------------ */
6686 .balign 128
6687.L_op_iget_wide_quick: /* 0xe4 */
6688/* File: arm64/op_iget_wide_quick.S */
6689 /* iget-wide-quick vA, vB, offset//CCCC */
6690 lsr w2, wINST, #12 // w2<- B
6691 FETCH w4, 1 // w4<- field byte offset
6692 GET_VREG w3, w2 // w3<- object we're operating on
6693 ubfx w2, wINST, #8, #4 // w2<- A
6694 cbz w3, common_errNullObject // object was null
6695 add x4, x3, x4 // create direct pointer
6696 ldr x0, [x4]
6697 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
6698 SET_VREG_WIDE x0, w2
6699 GET_INST_OPCODE ip // extract opcode from wINST
6700 GOTO_OPCODE ip // jump to next instruction
6701
6702/* ------------------------------ */
6703 .balign 128
6704.L_op_iget_object_quick: /* 0xe5 */
6705/* File: arm64/op_iget_object_quick.S */
6706 /* For: iget-object-quick */
6707 /* op vA, vB, offset//CCCC */
6708 lsr w2, wINST, #12 // w2<- B
6709 FETCH w1, 1 // w1<- field byte offset
6710 EXPORT_PC
6711 GET_VREG w0, w2 // w0<- object we're operating on
6712 bl artIGetObjectFromMterp // (obj, offset)
6713 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
6714 ubfx w2, wINST, #8, #4 // w2<- A
6715 PREFETCH_INST 2
6716 cbnz w3, MterpPossibleException // bail out
6717 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
6718 ADVANCE 2 // advance rPC
6719 GET_INST_OPCODE ip // extract opcode from wINST
6720 GOTO_OPCODE ip // jump to next instruction
6721
6722/* ------------------------------ */
6723 .balign 128
6724.L_op_iput_quick: /* 0xe6 */
6725/* File: arm64/op_iput_quick.S */
6726 /* For: iput-quick, iput-object-quick */
6727 /* op vA, vB, offset//CCCC */
6728 lsr w2, wINST, #12 // w2<- B
6729 FETCH w1, 1 // w1<- field byte offset
6730 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6731 ubfx w2, wINST, #8, #4 // w2<- A
6732 cmp w3, #0 // check object for null
6733 cbz w3, common_errNullObject // object was null
6734 GET_VREG w0, w2 // w0<- fp[A]
6735 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6736 str w0, [x3, x1] // obj.field<- w0
6737 GET_INST_OPCODE ip // extract opcode from rINST
6738 GOTO_OPCODE ip // jump to next instruction
6739
6740/* ------------------------------ */
6741 .balign 128
6742.L_op_iput_wide_quick: /* 0xe7 */
6743/* File: arm64/op_iput_wide_quick.S */
6744 /* iput-wide-quick vA, vB, offset//CCCC */
6745 lsr w2, wINST, #12 // w2<- B
6746 FETCH w3, 1 // w3<- field byte offset
6747 GET_VREG w2, w2 // w2<- fp[B], the object pointer
6748 ubfx w0, wINST, #8, #4 // w0<- A
6749 cmp w2, #0 // check object for null
6750 beq common_errNullObject // object was null
6751 GET_VREG_WIDE x0, w0 // x0-< fp[A]
6752 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
6753 add x1, x2, x3 // create a direct pointer
6754 str x0, [x1]
6755 GET_INST_OPCODE ip // extract opcode from wINST
6756 GOTO_OPCODE ip // jump to next instruction
6757
6758/* ------------------------------ */
6759 .balign 128
6760.L_op_iput_object_quick: /* 0xe8 */
6761/* File: arm64/op_iput_object_quick.S */
6762 EXPORT_PC
6763 add x0, xFP, #OFF_FP_SHADOWFRAME
6764 mov x1, xPC
6765 mov w2, wINST
6766 bl MterpIputObjectQuick
6767 cbz w0, MterpException
6768 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6769 GET_INST_OPCODE ip // extract opcode from rINST
6770 GOTO_OPCODE ip // jump to next instruction
6771
6772/* ------------------------------ */
6773 .balign 128
6774.L_op_invoke_virtual_quick: /* 0xe9 */
6775/* File: arm64/op_invoke_virtual_quick.S */
6776/* File: arm64/invoke.S */
6777 /*
6778 * Generic invoke handler wrapper.
6779 */
6780 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6781 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6782 .extern MterpInvokeVirtualQuick
6783 EXPORT_PC
6784 mov x0, xSELF
6785 add x1, xFP, #OFF_FP_SHADOWFRAME
6786 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006787 mov x3, xINST
6788 bl MterpInvokeVirtualQuick
6789 cbz w0, MterpException
6790 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006791 bl MterpShouldSwitchInterpreters
6792 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006793 GET_INST_OPCODE ip
6794 GOTO_OPCODE ip
6795
6796
6797
6798/* ------------------------------ */
6799 .balign 128
6800.L_op_invoke_virtual_range_quick: /* 0xea */
6801/* File: arm64/op_invoke_virtual_range_quick.S */
6802/* File: arm64/invoke.S */
6803 /*
6804 * Generic invoke handler wrapper.
6805 */
6806 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6807 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6808 .extern MterpInvokeVirtualQuickRange
6809 EXPORT_PC
6810 mov x0, xSELF
6811 add x1, xFP, #OFF_FP_SHADOWFRAME
6812 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006813 mov x3, xINST
6814 bl MterpInvokeVirtualQuickRange
6815 cbz w0, MterpException
6816 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006817 bl MterpShouldSwitchInterpreters
6818 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006819 GET_INST_OPCODE ip
6820 GOTO_OPCODE ip
6821
6822
6823
6824/* ------------------------------ */
6825 .balign 128
6826.L_op_iput_boolean_quick: /* 0xeb */
6827/* File: arm64/op_iput_boolean_quick.S */
6828/* File: arm64/op_iput_quick.S */
6829 /* For: iput-quick, iput-object-quick */
6830 /* op vA, vB, offset//CCCC */
6831 lsr w2, wINST, #12 // w2<- B
6832 FETCH w1, 1 // w1<- field byte offset
6833 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6834 ubfx w2, wINST, #8, #4 // w2<- A
6835 cmp w3, #0 // check object for null
6836 cbz w3, common_errNullObject // object was null
6837 GET_VREG w0, w2 // w0<- fp[A]
6838 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6839 strb w0, [x3, x1] // obj.field<- w0
6840 GET_INST_OPCODE ip // extract opcode from rINST
6841 GOTO_OPCODE ip // jump to next instruction
6842
6843
6844/* ------------------------------ */
6845 .balign 128
6846.L_op_iput_byte_quick: /* 0xec */
6847/* File: arm64/op_iput_byte_quick.S */
6848/* File: arm64/op_iput_quick.S */
6849 /* For: iput-quick, iput-object-quick */
6850 /* op vA, vB, offset//CCCC */
6851 lsr w2, wINST, #12 // w2<- B
6852 FETCH w1, 1 // w1<- field byte offset
6853 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6854 ubfx w2, wINST, #8, #4 // w2<- A
6855 cmp w3, #0 // check object for null
6856 cbz w3, common_errNullObject // object was null
6857 GET_VREG w0, w2 // w0<- fp[A]
6858 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6859 strb w0, [x3, x1] // obj.field<- w0
6860 GET_INST_OPCODE ip // extract opcode from rINST
6861 GOTO_OPCODE ip // jump to next instruction
6862
6863
6864/* ------------------------------ */
6865 .balign 128
6866.L_op_iput_char_quick: /* 0xed */
6867/* File: arm64/op_iput_char_quick.S */
6868/* File: arm64/op_iput_quick.S */
6869 /* For: iput-quick, iput-object-quick */
6870 /* op vA, vB, offset//CCCC */
6871 lsr w2, wINST, #12 // w2<- B
6872 FETCH w1, 1 // w1<- field byte offset
6873 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6874 ubfx w2, wINST, #8, #4 // w2<- A
6875 cmp w3, #0 // check object for null
6876 cbz w3, common_errNullObject // object was null
6877 GET_VREG w0, w2 // w0<- fp[A]
6878 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6879 strh w0, [x3, x1] // obj.field<- w0
6880 GET_INST_OPCODE ip // extract opcode from rINST
6881 GOTO_OPCODE ip // jump to next instruction
6882
6883
6884/* ------------------------------ */
6885 .balign 128
6886.L_op_iput_short_quick: /* 0xee */
6887/* File: arm64/op_iput_short_quick.S */
6888/* File: arm64/op_iput_quick.S */
6889 /* For: iput-quick, iput-object-quick */
6890 /* op vA, vB, offset//CCCC */
6891 lsr w2, wINST, #12 // w2<- B
6892 FETCH w1, 1 // w1<- field byte offset
6893 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6894 ubfx w2, wINST, #8, #4 // w2<- A
6895 cmp w3, #0 // check object for null
6896 cbz w3, common_errNullObject // object was null
6897 GET_VREG w0, w2 // w0<- fp[A]
6898 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6899 strh w0, [x3, x1] // obj.field<- w0
6900 GET_INST_OPCODE ip // extract opcode from rINST
6901 GOTO_OPCODE ip // jump to next instruction
6902
6903
6904/* ------------------------------ */
6905 .balign 128
6906.L_op_iget_boolean_quick: /* 0xef */
6907/* File: arm64/op_iget_boolean_quick.S */
6908/* File: arm64/op_iget_quick.S */
6909 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6910 /* op vA, vB, offset//CCCC */
6911 lsr w2, wINST, #12 // w2<- B
6912 FETCH w1, 1 // w1<- field byte offset
6913 GET_VREG w3, w2 // w3<- object we're operating on
6914 ubfx w2, wINST, #8, #4 // w2<- A
6915 cmp x3, #0 // check object for null
6916 beq common_errNullObject // object was null
6917 ldrb w0, [x3, x1] // w0<- obj.field
6918 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6919
6920 SET_VREG w0, w2 // fp[A]<- w0
6921 GET_INST_OPCODE ip // extract opcode from rINST
6922 GOTO_OPCODE ip // jump to next instruction
6923
6924
6925/* ------------------------------ */
6926 .balign 128
6927.L_op_iget_byte_quick: /* 0xf0 */
6928/* File: arm64/op_iget_byte_quick.S */
6929/* File: arm64/op_iget_quick.S */
6930 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6931 /* op vA, vB, offset//CCCC */
6932 lsr w2, wINST, #12 // w2<- B
6933 FETCH w1, 1 // w1<- field byte offset
6934 GET_VREG w3, w2 // w3<- object we're operating on
6935 ubfx w2, wINST, #8, #4 // w2<- A
6936 cmp x3, #0 // check object for null
6937 beq common_errNullObject // object was null
6938 ldrsb w0, [x3, x1] // w0<- obj.field
6939 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6940
6941 SET_VREG w0, w2 // fp[A]<- w0
6942 GET_INST_OPCODE ip // extract opcode from rINST
6943 GOTO_OPCODE ip // jump to next instruction
6944
6945
6946/* ------------------------------ */
6947 .balign 128
6948.L_op_iget_char_quick: /* 0xf1 */
6949/* File: arm64/op_iget_char_quick.S */
6950/* File: arm64/op_iget_quick.S */
6951 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6952 /* op vA, vB, offset//CCCC */
6953 lsr w2, wINST, #12 // w2<- B
6954 FETCH w1, 1 // w1<- field byte offset
6955 GET_VREG w3, w2 // w3<- object we're operating on
6956 ubfx w2, wINST, #8, #4 // w2<- A
6957 cmp x3, #0 // check object for null
6958 beq common_errNullObject // object was null
6959 ldrh w0, [x3, x1] // w0<- obj.field
6960 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6961
6962 SET_VREG w0, w2 // fp[A]<- w0
6963 GET_INST_OPCODE ip // extract opcode from rINST
6964 GOTO_OPCODE ip // jump to next instruction
6965
6966
6967/* ------------------------------ */
6968 .balign 128
6969.L_op_iget_short_quick: /* 0xf2 */
6970/* File: arm64/op_iget_short_quick.S */
6971/* File: arm64/op_iget_quick.S */
6972 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6973 /* op vA, vB, offset//CCCC */
6974 lsr w2, wINST, #12 // w2<- B
6975 FETCH w1, 1 // w1<- field byte offset
6976 GET_VREG w3, w2 // w3<- object we're operating on
6977 ubfx w2, wINST, #8, #4 // w2<- A
6978 cmp x3, #0 // check object for null
6979 beq common_errNullObject // object was null
6980 ldrsh w0, [x3, x1] // w0<- obj.field
6981 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6982
6983 SET_VREG w0, w2 // fp[A]<- w0
6984 GET_INST_OPCODE ip // extract opcode from rINST
6985 GOTO_OPCODE ip // jump to next instruction
6986
6987
6988/* ------------------------------ */
6989 .balign 128
6990.L_op_invoke_lambda: /* 0xf3 */
6991/* Transfer stub to alternate interpreter */
6992 b MterpFallback
6993
6994
6995/* ------------------------------ */
6996 .balign 128
6997.L_op_unused_f4: /* 0xf4 */
6998/* File: arm64/op_unused_f4.S */
6999/* File: arm64/unused.S */
7000/*
7001 * Bail to reference interpreter to throw.
7002 */
7003 b MterpFallback
7004
7005
7006/* ------------------------------ */
7007 .balign 128
7008.L_op_capture_variable: /* 0xf5 */
7009/* Transfer stub to alternate interpreter */
7010 b MterpFallback
7011
7012
7013/* ------------------------------ */
7014 .balign 128
7015.L_op_create_lambda: /* 0xf6 */
7016/* Transfer stub to alternate interpreter */
7017 b MterpFallback
7018
7019
7020/* ------------------------------ */
7021 .balign 128
7022.L_op_liberate_variable: /* 0xf7 */
7023/* Transfer stub to alternate interpreter */
7024 b MterpFallback
7025
7026
7027/* ------------------------------ */
7028 .balign 128
7029.L_op_box_lambda: /* 0xf8 */
7030/* Transfer stub to alternate interpreter */
7031 b MterpFallback
7032
7033
7034/* ------------------------------ */
7035 .balign 128
7036.L_op_unbox_lambda: /* 0xf9 */
7037/* Transfer stub to alternate interpreter */
7038 b MterpFallback
7039
7040
7041/* ------------------------------ */
7042 .balign 128
7043.L_op_unused_fa: /* 0xfa */
7044/* File: arm64/op_unused_fa.S */
7045/* File: arm64/unused.S */
7046/*
7047 * Bail to reference interpreter to throw.
7048 */
7049 b MterpFallback
7050
7051
7052/* ------------------------------ */
7053 .balign 128
7054.L_op_unused_fb: /* 0xfb */
7055/* File: arm64/op_unused_fb.S */
7056/* File: arm64/unused.S */
7057/*
7058 * Bail to reference interpreter to throw.
7059 */
7060 b MterpFallback
7061
7062
7063/* ------------------------------ */
7064 .balign 128
7065.L_op_unused_fc: /* 0xfc */
7066/* File: arm64/op_unused_fc.S */
7067/* File: arm64/unused.S */
7068/*
7069 * Bail to reference interpreter to throw.
7070 */
7071 b MterpFallback
7072
7073
7074/* ------------------------------ */
7075 .balign 128
7076.L_op_unused_fd: /* 0xfd */
7077/* File: arm64/op_unused_fd.S */
7078/* File: arm64/unused.S */
7079/*
7080 * Bail to reference interpreter to throw.
7081 */
7082 b MterpFallback
7083
7084
7085/* ------------------------------ */
7086 .balign 128
7087.L_op_unused_fe: /* 0xfe */
7088/* File: arm64/op_unused_fe.S */
7089/* File: arm64/unused.S */
7090/*
7091 * Bail to reference interpreter to throw.
7092 */
7093 b MterpFallback
7094
7095
7096/* ------------------------------ */
7097 .balign 128
7098.L_op_unused_ff: /* 0xff */
7099/* File: arm64/op_unused_ff.S */
7100/* File: arm64/unused.S */
7101/*
7102 * Bail to reference interpreter to throw.
7103 */
7104 b MterpFallback
7105
7106
7107 .balign 128
7108 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7109 .global artMterpAsmInstructionEnd
7110artMterpAsmInstructionEnd:
7111
7112/*
7113 * ===========================================================================
7114 * Sister implementations
7115 * ===========================================================================
7116 */
7117 .global artMterpAsmSisterStart
7118 .type artMterpAsmSisterStart, %function
7119 .text
7120 .balign 4
7121artMterpAsmSisterStart:
7122
7123 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
7124 .global artMterpAsmSisterEnd
7125artMterpAsmSisterEnd:
7126
7127
7128 .global artMterpAsmAltInstructionStart
7129 .type artMterpAsmAltInstructionStart, %function
7130 .text
7131
7132artMterpAsmAltInstructionStart = .L_ALT_op_nop
7133/* ------------------------------ */
7134 .balign 128
7135.L_ALT_op_nop: /* 0x00 */
7136/* File: arm64/alt_stub.S */
7137/*
7138 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7139 * any interesting requests and then jump to the real instruction
7140 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7141 */
7142 .extern MterpCheckBefore
7143 EXPORT_PC
7144 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7145 adr lr, artMterpAsmInstructionStart + (0 * 128) // Addr of primary handler.
7146 mov x0, xSELF
7147 add x1, xFP, #OFF_FP_SHADOWFRAME
7148 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7149
7150/* ------------------------------ */
7151 .balign 128
7152.L_ALT_op_move: /* 0x01 */
7153/* File: arm64/alt_stub.S */
7154/*
7155 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7156 * any interesting requests and then jump to the real instruction
7157 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7158 */
7159 .extern MterpCheckBefore
7160 EXPORT_PC
7161 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7162 adr lr, artMterpAsmInstructionStart + (1 * 128) // Addr of primary handler.
7163 mov x0, xSELF
7164 add x1, xFP, #OFF_FP_SHADOWFRAME
7165 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7166
7167/* ------------------------------ */
7168 .balign 128
7169.L_ALT_op_move_from16: /* 0x02 */
7170/* File: arm64/alt_stub.S */
7171/*
7172 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7173 * any interesting requests and then jump to the real instruction
7174 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7175 */
7176 .extern MterpCheckBefore
7177 EXPORT_PC
7178 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7179 adr lr, artMterpAsmInstructionStart + (2 * 128) // Addr of primary handler.
7180 mov x0, xSELF
7181 add x1, xFP, #OFF_FP_SHADOWFRAME
7182 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7183
7184/* ------------------------------ */
7185 .balign 128
7186.L_ALT_op_move_16: /* 0x03 */
7187/* File: arm64/alt_stub.S */
7188/*
7189 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7190 * any interesting requests and then jump to the real instruction
7191 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7192 */
7193 .extern MterpCheckBefore
7194 EXPORT_PC
7195 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7196 adr lr, artMterpAsmInstructionStart + (3 * 128) // Addr of primary handler.
7197 mov x0, xSELF
7198 add x1, xFP, #OFF_FP_SHADOWFRAME
7199 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7200
7201/* ------------------------------ */
7202 .balign 128
7203.L_ALT_op_move_wide: /* 0x04 */
7204/* File: arm64/alt_stub.S */
7205/*
7206 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7207 * any interesting requests and then jump to the real instruction
7208 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7209 */
7210 .extern MterpCheckBefore
7211 EXPORT_PC
7212 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7213 adr lr, artMterpAsmInstructionStart + (4 * 128) // Addr of primary handler.
7214 mov x0, xSELF
7215 add x1, xFP, #OFF_FP_SHADOWFRAME
7216 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7217
7218/* ------------------------------ */
7219 .balign 128
7220.L_ALT_op_move_wide_from16: /* 0x05 */
7221/* File: arm64/alt_stub.S */
7222/*
7223 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7224 * any interesting requests and then jump to the real instruction
7225 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7226 */
7227 .extern MterpCheckBefore
7228 EXPORT_PC
7229 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7230 adr lr, artMterpAsmInstructionStart + (5 * 128) // Addr of primary handler.
7231 mov x0, xSELF
7232 add x1, xFP, #OFF_FP_SHADOWFRAME
7233 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7234
7235/* ------------------------------ */
7236 .balign 128
7237.L_ALT_op_move_wide_16: /* 0x06 */
7238/* File: arm64/alt_stub.S */
7239/*
7240 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7241 * any interesting requests and then jump to the real instruction
7242 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7243 */
7244 .extern MterpCheckBefore
7245 EXPORT_PC
7246 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7247 adr lr, artMterpAsmInstructionStart + (6 * 128) // Addr of primary handler.
7248 mov x0, xSELF
7249 add x1, xFP, #OFF_FP_SHADOWFRAME
7250 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7251
7252/* ------------------------------ */
7253 .balign 128
7254.L_ALT_op_move_object: /* 0x07 */
7255/* File: arm64/alt_stub.S */
7256/*
7257 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7258 * any interesting requests and then jump to the real instruction
7259 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7260 */
7261 .extern MterpCheckBefore
7262 EXPORT_PC
7263 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7264 adr lr, artMterpAsmInstructionStart + (7 * 128) // Addr of primary handler.
7265 mov x0, xSELF
7266 add x1, xFP, #OFF_FP_SHADOWFRAME
7267 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7268
7269/* ------------------------------ */
7270 .balign 128
7271.L_ALT_op_move_object_from16: /* 0x08 */
7272/* File: arm64/alt_stub.S */
7273/*
7274 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7275 * any interesting requests and then jump to the real instruction
7276 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7277 */
7278 .extern MterpCheckBefore
7279 EXPORT_PC
7280 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7281 adr lr, artMterpAsmInstructionStart + (8 * 128) // Addr of primary handler.
7282 mov x0, xSELF
7283 add x1, xFP, #OFF_FP_SHADOWFRAME
7284 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7285
7286/* ------------------------------ */
7287 .balign 128
7288.L_ALT_op_move_object_16: /* 0x09 */
7289/* File: arm64/alt_stub.S */
7290/*
7291 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7292 * any interesting requests and then jump to the real instruction
7293 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7294 */
7295 .extern MterpCheckBefore
7296 EXPORT_PC
7297 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7298 adr lr, artMterpAsmInstructionStart + (9 * 128) // Addr of primary handler.
7299 mov x0, xSELF
7300 add x1, xFP, #OFF_FP_SHADOWFRAME
7301 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7302
7303/* ------------------------------ */
7304 .balign 128
7305.L_ALT_op_move_result: /* 0x0a */
7306/* File: arm64/alt_stub.S */
7307/*
7308 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7309 * any interesting requests and then jump to the real instruction
7310 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7311 */
7312 .extern MterpCheckBefore
7313 EXPORT_PC
7314 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7315 adr lr, artMterpAsmInstructionStart + (10 * 128) // Addr of primary handler.
7316 mov x0, xSELF
7317 add x1, xFP, #OFF_FP_SHADOWFRAME
7318 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7319
7320/* ------------------------------ */
7321 .balign 128
7322.L_ALT_op_move_result_wide: /* 0x0b */
7323/* File: arm64/alt_stub.S */
7324/*
7325 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7326 * any interesting requests and then jump to the real instruction
7327 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7328 */
7329 .extern MterpCheckBefore
7330 EXPORT_PC
7331 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7332 adr lr, artMterpAsmInstructionStart + (11 * 128) // Addr of primary handler.
7333 mov x0, xSELF
7334 add x1, xFP, #OFF_FP_SHADOWFRAME
7335 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7336
7337/* ------------------------------ */
7338 .balign 128
7339.L_ALT_op_move_result_object: /* 0x0c */
7340/* File: arm64/alt_stub.S */
7341/*
7342 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7343 * any interesting requests and then jump to the real instruction
7344 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7345 */
7346 .extern MterpCheckBefore
7347 EXPORT_PC
7348 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7349 adr lr, artMterpAsmInstructionStart + (12 * 128) // Addr of primary handler.
7350 mov x0, xSELF
7351 add x1, xFP, #OFF_FP_SHADOWFRAME
7352 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7353
7354/* ------------------------------ */
7355 .balign 128
7356.L_ALT_op_move_exception: /* 0x0d */
7357/* File: arm64/alt_stub.S */
7358/*
7359 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7360 * any interesting requests and then jump to the real instruction
7361 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7362 */
7363 .extern MterpCheckBefore
7364 EXPORT_PC
7365 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7366 adr lr, artMterpAsmInstructionStart + (13 * 128) // Addr of primary handler.
7367 mov x0, xSELF
7368 add x1, xFP, #OFF_FP_SHADOWFRAME
7369 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7370
7371/* ------------------------------ */
7372 .balign 128
7373.L_ALT_op_return_void: /* 0x0e */
7374/* File: arm64/alt_stub.S */
7375/*
7376 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7377 * any interesting requests and then jump to the real instruction
7378 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7379 */
7380 .extern MterpCheckBefore
7381 EXPORT_PC
7382 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7383 adr lr, artMterpAsmInstructionStart + (14 * 128) // Addr of primary handler.
7384 mov x0, xSELF
7385 add x1, xFP, #OFF_FP_SHADOWFRAME
7386 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7387
7388/* ------------------------------ */
7389 .balign 128
7390.L_ALT_op_return: /* 0x0f */
7391/* File: arm64/alt_stub.S */
7392/*
7393 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7394 * any interesting requests and then jump to the real instruction
7395 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7396 */
7397 .extern MterpCheckBefore
7398 EXPORT_PC
7399 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7400 adr lr, artMterpAsmInstructionStart + (15 * 128) // Addr of primary handler.
7401 mov x0, xSELF
7402 add x1, xFP, #OFF_FP_SHADOWFRAME
7403 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7404
7405/* ------------------------------ */
7406 .balign 128
7407.L_ALT_op_return_wide: /* 0x10 */
7408/* File: arm64/alt_stub.S */
7409/*
7410 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7411 * any interesting requests and then jump to the real instruction
7412 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7413 */
7414 .extern MterpCheckBefore
7415 EXPORT_PC
7416 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7417 adr lr, artMterpAsmInstructionStart + (16 * 128) // Addr of primary handler.
7418 mov x0, xSELF
7419 add x1, xFP, #OFF_FP_SHADOWFRAME
7420 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7421
7422/* ------------------------------ */
7423 .balign 128
7424.L_ALT_op_return_object: /* 0x11 */
7425/* File: arm64/alt_stub.S */
7426/*
7427 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7428 * any interesting requests and then jump to the real instruction
7429 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7430 */
7431 .extern MterpCheckBefore
7432 EXPORT_PC
7433 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7434 adr lr, artMterpAsmInstructionStart + (17 * 128) // Addr of primary handler.
7435 mov x0, xSELF
7436 add x1, xFP, #OFF_FP_SHADOWFRAME
7437 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7438
7439/* ------------------------------ */
7440 .balign 128
7441.L_ALT_op_const_4: /* 0x12 */
7442/* File: arm64/alt_stub.S */
7443/*
7444 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7445 * any interesting requests and then jump to the real instruction
7446 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7447 */
7448 .extern MterpCheckBefore
7449 EXPORT_PC
7450 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7451 adr lr, artMterpAsmInstructionStart + (18 * 128) // Addr of primary handler.
7452 mov x0, xSELF
7453 add x1, xFP, #OFF_FP_SHADOWFRAME
7454 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7455
7456/* ------------------------------ */
7457 .balign 128
7458.L_ALT_op_const_16: /* 0x13 */
7459/* File: arm64/alt_stub.S */
7460/*
7461 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7462 * any interesting requests and then jump to the real instruction
7463 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7464 */
7465 .extern MterpCheckBefore
7466 EXPORT_PC
7467 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7468 adr lr, artMterpAsmInstructionStart + (19 * 128) // Addr of primary handler.
7469 mov x0, xSELF
7470 add x1, xFP, #OFF_FP_SHADOWFRAME
7471 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7472
7473/* ------------------------------ */
7474 .balign 128
7475.L_ALT_op_const: /* 0x14 */
7476/* File: arm64/alt_stub.S */
7477/*
7478 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7479 * any interesting requests and then jump to the real instruction
7480 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7481 */
7482 .extern MterpCheckBefore
7483 EXPORT_PC
7484 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7485 adr lr, artMterpAsmInstructionStart + (20 * 128) // Addr of primary handler.
7486 mov x0, xSELF
7487 add x1, xFP, #OFF_FP_SHADOWFRAME
7488 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7489
7490/* ------------------------------ */
7491 .balign 128
7492.L_ALT_op_const_high16: /* 0x15 */
7493/* File: arm64/alt_stub.S */
7494/*
7495 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7496 * any interesting requests and then jump to the real instruction
7497 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7498 */
7499 .extern MterpCheckBefore
7500 EXPORT_PC
7501 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7502 adr lr, artMterpAsmInstructionStart + (21 * 128) // Addr of primary handler.
7503 mov x0, xSELF
7504 add x1, xFP, #OFF_FP_SHADOWFRAME
7505 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7506
7507/* ------------------------------ */
7508 .balign 128
7509.L_ALT_op_const_wide_16: /* 0x16 */
7510/* File: arm64/alt_stub.S */
7511/*
7512 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7513 * any interesting requests and then jump to the real instruction
7514 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7515 */
7516 .extern MterpCheckBefore
7517 EXPORT_PC
7518 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7519 adr lr, artMterpAsmInstructionStart + (22 * 128) // Addr of primary handler.
7520 mov x0, xSELF
7521 add x1, xFP, #OFF_FP_SHADOWFRAME
7522 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7523
7524/* ------------------------------ */
7525 .balign 128
7526.L_ALT_op_const_wide_32: /* 0x17 */
7527/* File: arm64/alt_stub.S */
7528/*
7529 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7530 * any interesting requests and then jump to the real instruction
7531 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7532 */
7533 .extern MterpCheckBefore
7534 EXPORT_PC
7535 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7536 adr lr, artMterpAsmInstructionStart + (23 * 128) // Addr of primary handler.
7537 mov x0, xSELF
7538 add x1, xFP, #OFF_FP_SHADOWFRAME
7539 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7540
7541/* ------------------------------ */
7542 .balign 128
7543.L_ALT_op_const_wide: /* 0x18 */
7544/* File: arm64/alt_stub.S */
7545/*
7546 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7547 * any interesting requests and then jump to the real instruction
7548 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7549 */
7550 .extern MterpCheckBefore
7551 EXPORT_PC
7552 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7553 adr lr, artMterpAsmInstructionStart + (24 * 128) // Addr of primary handler.
7554 mov x0, xSELF
7555 add x1, xFP, #OFF_FP_SHADOWFRAME
7556 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7557
7558/* ------------------------------ */
7559 .balign 128
7560.L_ALT_op_const_wide_high16: /* 0x19 */
7561/* File: arm64/alt_stub.S */
7562/*
7563 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7564 * any interesting requests and then jump to the real instruction
7565 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7566 */
7567 .extern MterpCheckBefore
7568 EXPORT_PC
7569 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7570 adr lr, artMterpAsmInstructionStart + (25 * 128) // Addr of primary handler.
7571 mov x0, xSELF
7572 add x1, xFP, #OFF_FP_SHADOWFRAME
7573 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7574
7575/* ------------------------------ */
7576 .balign 128
7577.L_ALT_op_const_string: /* 0x1a */
7578/* File: arm64/alt_stub.S */
7579/*
7580 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7581 * any interesting requests and then jump to the real instruction
7582 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7583 */
7584 .extern MterpCheckBefore
7585 EXPORT_PC
7586 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7587 adr lr, artMterpAsmInstructionStart + (26 * 128) // Addr of primary handler.
7588 mov x0, xSELF
7589 add x1, xFP, #OFF_FP_SHADOWFRAME
7590 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7591
7592/* ------------------------------ */
7593 .balign 128
7594.L_ALT_op_const_string_jumbo: /* 0x1b */
7595/* File: arm64/alt_stub.S */
7596/*
7597 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7598 * any interesting requests and then jump to the real instruction
7599 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7600 */
7601 .extern MterpCheckBefore
7602 EXPORT_PC
7603 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7604 adr lr, artMterpAsmInstructionStart + (27 * 128) // Addr of primary handler.
7605 mov x0, xSELF
7606 add x1, xFP, #OFF_FP_SHADOWFRAME
7607 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7608
7609/* ------------------------------ */
7610 .balign 128
7611.L_ALT_op_const_class: /* 0x1c */
7612/* File: arm64/alt_stub.S */
7613/*
7614 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7615 * any interesting requests and then jump to the real instruction
7616 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7617 */
7618 .extern MterpCheckBefore
7619 EXPORT_PC
7620 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7621 adr lr, artMterpAsmInstructionStart + (28 * 128) // Addr of primary handler.
7622 mov x0, xSELF
7623 add x1, xFP, #OFF_FP_SHADOWFRAME
7624 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7625
7626/* ------------------------------ */
7627 .balign 128
7628.L_ALT_op_monitor_enter: /* 0x1d */
7629/* File: arm64/alt_stub.S */
7630/*
7631 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7632 * any interesting requests and then jump to the real instruction
7633 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7634 */
7635 .extern MterpCheckBefore
7636 EXPORT_PC
7637 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7638 adr lr, artMterpAsmInstructionStart + (29 * 128) // Addr of primary handler.
7639 mov x0, xSELF
7640 add x1, xFP, #OFF_FP_SHADOWFRAME
7641 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7642
7643/* ------------------------------ */
7644 .balign 128
7645.L_ALT_op_monitor_exit: /* 0x1e */
7646/* File: arm64/alt_stub.S */
7647/*
7648 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7649 * any interesting requests and then jump to the real instruction
7650 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7651 */
7652 .extern MterpCheckBefore
7653 EXPORT_PC
7654 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7655 adr lr, artMterpAsmInstructionStart + (30 * 128) // Addr of primary handler.
7656 mov x0, xSELF
7657 add x1, xFP, #OFF_FP_SHADOWFRAME
7658 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7659
7660/* ------------------------------ */
7661 .balign 128
7662.L_ALT_op_check_cast: /* 0x1f */
7663/* File: arm64/alt_stub.S */
7664/*
7665 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7666 * any interesting requests and then jump to the real instruction
7667 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7668 */
7669 .extern MterpCheckBefore
7670 EXPORT_PC
7671 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7672 adr lr, artMterpAsmInstructionStart + (31 * 128) // Addr of primary handler.
7673 mov x0, xSELF
7674 add x1, xFP, #OFF_FP_SHADOWFRAME
7675 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7676
7677/* ------------------------------ */
7678 .balign 128
7679.L_ALT_op_instance_of: /* 0x20 */
7680/* File: arm64/alt_stub.S */
7681/*
7682 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7683 * any interesting requests and then jump to the real instruction
7684 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7685 */
7686 .extern MterpCheckBefore
7687 EXPORT_PC
7688 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7689 adr lr, artMterpAsmInstructionStart + (32 * 128) // Addr of primary handler.
7690 mov x0, xSELF
7691 add x1, xFP, #OFF_FP_SHADOWFRAME
7692 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7693
7694/* ------------------------------ */
7695 .balign 128
7696.L_ALT_op_array_length: /* 0x21 */
7697/* File: arm64/alt_stub.S */
7698/*
7699 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7700 * any interesting requests and then jump to the real instruction
7701 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7702 */
7703 .extern MterpCheckBefore
7704 EXPORT_PC
7705 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7706 adr lr, artMterpAsmInstructionStart + (33 * 128) // Addr of primary handler.
7707 mov x0, xSELF
7708 add x1, xFP, #OFF_FP_SHADOWFRAME
7709 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7710
7711/* ------------------------------ */
7712 .balign 128
7713.L_ALT_op_new_instance: /* 0x22 */
7714/* File: arm64/alt_stub.S */
7715/*
7716 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7717 * any interesting requests and then jump to the real instruction
7718 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7719 */
7720 .extern MterpCheckBefore
7721 EXPORT_PC
7722 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7723 adr lr, artMterpAsmInstructionStart + (34 * 128) // Addr of primary handler.
7724 mov x0, xSELF
7725 add x1, xFP, #OFF_FP_SHADOWFRAME
7726 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7727
7728/* ------------------------------ */
7729 .balign 128
7730.L_ALT_op_new_array: /* 0x23 */
7731/* File: arm64/alt_stub.S */
7732/*
7733 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7734 * any interesting requests and then jump to the real instruction
7735 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7736 */
7737 .extern MterpCheckBefore
7738 EXPORT_PC
7739 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7740 adr lr, artMterpAsmInstructionStart + (35 * 128) // Addr of primary handler.
7741 mov x0, xSELF
7742 add x1, xFP, #OFF_FP_SHADOWFRAME
7743 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7744
7745/* ------------------------------ */
7746 .balign 128
7747.L_ALT_op_filled_new_array: /* 0x24 */
7748/* File: arm64/alt_stub.S */
7749/*
7750 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7751 * any interesting requests and then jump to the real instruction
7752 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7753 */
7754 .extern MterpCheckBefore
7755 EXPORT_PC
7756 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7757 adr lr, artMterpAsmInstructionStart + (36 * 128) // Addr of primary handler.
7758 mov x0, xSELF
7759 add x1, xFP, #OFF_FP_SHADOWFRAME
7760 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7761
7762/* ------------------------------ */
7763 .balign 128
7764.L_ALT_op_filled_new_array_range: /* 0x25 */
7765/* File: arm64/alt_stub.S */
7766/*
7767 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7768 * any interesting requests and then jump to the real instruction
7769 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7770 */
7771 .extern MterpCheckBefore
7772 EXPORT_PC
7773 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7774 adr lr, artMterpAsmInstructionStart + (37 * 128) // Addr of primary handler.
7775 mov x0, xSELF
7776 add x1, xFP, #OFF_FP_SHADOWFRAME
7777 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7778
7779/* ------------------------------ */
7780 .balign 128
7781.L_ALT_op_fill_array_data: /* 0x26 */
7782/* File: arm64/alt_stub.S */
7783/*
7784 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7785 * any interesting requests and then jump to the real instruction
7786 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7787 */
7788 .extern MterpCheckBefore
7789 EXPORT_PC
7790 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7791 adr lr, artMterpAsmInstructionStart + (38 * 128) // Addr of primary handler.
7792 mov x0, xSELF
7793 add x1, xFP, #OFF_FP_SHADOWFRAME
7794 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7795
7796/* ------------------------------ */
7797 .balign 128
7798.L_ALT_op_throw: /* 0x27 */
7799/* File: arm64/alt_stub.S */
7800/*
7801 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7802 * any interesting requests and then jump to the real instruction
7803 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7804 */
7805 .extern MterpCheckBefore
7806 EXPORT_PC
7807 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7808 adr lr, artMterpAsmInstructionStart + (39 * 128) // Addr of primary handler.
7809 mov x0, xSELF
7810 add x1, xFP, #OFF_FP_SHADOWFRAME
7811 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7812
7813/* ------------------------------ */
7814 .balign 128
7815.L_ALT_op_goto: /* 0x28 */
7816/* File: arm64/alt_stub.S */
7817/*
7818 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7819 * any interesting requests and then jump to the real instruction
7820 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7821 */
7822 .extern MterpCheckBefore
7823 EXPORT_PC
7824 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7825 adr lr, artMterpAsmInstructionStart + (40 * 128) // Addr of primary handler.
7826 mov x0, xSELF
7827 add x1, xFP, #OFF_FP_SHADOWFRAME
7828 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7829
7830/* ------------------------------ */
7831 .balign 128
7832.L_ALT_op_goto_16: /* 0x29 */
7833/* File: arm64/alt_stub.S */
7834/*
7835 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7836 * any interesting requests and then jump to the real instruction
7837 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7838 */
7839 .extern MterpCheckBefore
7840 EXPORT_PC
7841 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7842 adr lr, artMterpAsmInstructionStart + (41 * 128) // Addr of primary handler.
7843 mov x0, xSELF
7844 add x1, xFP, #OFF_FP_SHADOWFRAME
7845 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7846
7847/* ------------------------------ */
7848 .balign 128
7849.L_ALT_op_goto_32: /* 0x2a */
7850/* File: arm64/alt_stub.S */
7851/*
7852 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7853 * any interesting requests and then jump to the real instruction
7854 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7855 */
7856 .extern MterpCheckBefore
7857 EXPORT_PC
7858 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7859 adr lr, artMterpAsmInstructionStart + (42 * 128) // Addr of primary handler.
7860 mov x0, xSELF
7861 add x1, xFP, #OFF_FP_SHADOWFRAME
7862 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7863
7864/* ------------------------------ */
7865 .balign 128
7866.L_ALT_op_packed_switch: /* 0x2b */
7867/* File: arm64/alt_stub.S */
7868/*
7869 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7870 * any interesting requests and then jump to the real instruction
7871 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7872 */
7873 .extern MterpCheckBefore
7874 EXPORT_PC
7875 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7876 adr lr, artMterpAsmInstructionStart + (43 * 128) // Addr of primary handler.
7877 mov x0, xSELF
7878 add x1, xFP, #OFF_FP_SHADOWFRAME
7879 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7880
7881/* ------------------------------ */
7882 .balign 128
7883.L_ALT_op_sparse_switch: /* 0x2c */
7884/* File: arm64/alt_stub.S */
7885/*
7886 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7887 * any interesting requests and then jump to the real instruction
7888 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7889 */
7890 .extern MterpCheckBefore
7891 EXPORT_PC
7892 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7893 adr lr, artMterpAsmInstructionStart + (44 * 128) // Addr of primary handler.
7894 mov x0, xSELF
7895 add x1, xFP, #OFF_FP_SHADOWFRAME
7896 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7897
7898/* ------------------------------ */
7899 .balign 128
7900.L_ALT_op_cmpl_float: /* 0x2d */
7901/* File: arm64/alt_stub.S */
7902/*
7903 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7904 * any interesting requests and then jump to the real instruction
7905 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7906 */
7907 .extern MterpCheckBefore
7908 EXPORT_PC
7909 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7910 adr lr, artMterpAsmInstructionStart + (45 * 128) // Addr of primary handler.
7911 mov x0, xSELF
7912 add x1, xFP, #OFF_FP_SHADOWFRAME
7913 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7914
7915/* ------------------------------ */
7916 .balign 128
7917.L_ALT_op_cmpg_float: /* 0x2e */
7918/* File: arm64/alt_stub.S */
7919/*
7920 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7921 * any interesting requests and then jump to the real instruction
7922 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7923 */
7924 .extern MterpCheckBefore
7925 EXPORT_PC
7926 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7927 adr lr, artMterpAsmInstructionStart + (46 * 128) // Addr of primary handler.
7928 mov x0, xSELF
7929 add x1, xFP, #OFF_FP_SHADOWFRAME
7930 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7931
7932/* ------------------------------ */
7933 .balign 128
7934.L_ALT_op_cmpl_double: /* 0x2f */
7935/* File: arm64/alt_stub.S */
7936/*
7937 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7938 * any interesting requests and then jump to the real instruction
7939 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7940 */
7941 .extern MterpCheckBefore
7942 EXPORT_PC
7943 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7944 adr lr, artMterpAsmInstructionStart + (47 * 128) // Addr of primary handler.
7945 mov x0, xSELF
7946 add x1, xFP, #OFF_FP_SHADOWFRAME
7947 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7948
7949/* ------------------------------ */
7950 .balign 128
7951.L_ALT_op_cmpg_double: /* 0x30 */
7952/* File: arm64/alt_stub.S */
7953/*
7954 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7955 * any interesting requests and then jump to the real instruction
7956 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7957 */
7958 .extern MterpCheckBefore
7959 EXPORT_PC
7960 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7961 adr lr, artMterpAsmInstructionStart + (48 * 128) // Addr of primary handler.
7962 mov x0, xSELF
7963 add x1, xFP, #OFF_FP_SHADOWFRAME
7964 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7965
7966/* ------------------------------ */
7967 .balign 128
7968.L_ALT_op_cmp_long: /* 0x31 */
7969/* File: arm64/alt_stub.S */
7970/*
7971 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7972 * any interesting requests and then jump to the real instruction
7973 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7974 */
7975 .extern MterpCheckBefore
7976 EXPORT_PC
7977 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7978 adr lr, artMterpAsmInstructionStart + (49 * 128) // Addr of primary handler.
7979 mov x0, xSELF
7980 add x1, xFP, #OFF_FP_SHADOWFRAME
7981 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7982
7983/* ------------------------------ */
7984 .balign 128
7985.L_ALT_op_if_eq: /* 0x32 */
7986/* File: arm64/alt_stub.S */
7987/*
7988 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7989 * any interesting requests and then jump to the real instruction
7990 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7991 */
7992 .extern MterpCheckBefore
7993 EXPORT_PC
7994 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7995 adr lr, artMterpAsmInstructionStart + (50 * 128) // Addr of primary handler.
7996 mov x0, xSELF
7997 add x1, xFP, #OFF_FP_SHADOWFRAME
7998 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
7999
8000/* ------------------------------ */
8001 .balign 128
8002.L_ALT_op_if_ne: /* 0x33 */
8003/* File: arm64/alt_stub.S */
8004/*
8005 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8006 * any interesting requests and then jump to the real instruction
8007 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8008 */
8009 .extern MterpCheckBefore
8010 EXPORT_PC
8011 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8012 adr lr, artMterpAsmInstructionStart + (51 * 128) // Addr of primary handler.
8013 mov x0, xSELF
8014 add x1, xFP, #OFF_FP_SHADOWFRAME
8015 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8016
8017/* ------------------------------ */
8018 .balign 128
8019.L_ALT_op_if_lt: /* 0x34 */
8020/* File: arm64/alt_stub.S */
8021/*
8022 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8023 * any interesting requests and then jump to the real instruction
8024 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8025 */
8026 .extern MterpCheckBefore
8027 EXPORT_PC
8028 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8029 adr lr, artMterpAsmInstructionStart + (52 * 128) // Addr of primary handler.
8030 mov x0, xSELF
8031 add x1, xFP, #OFF_FP_SHADOWFRAME
8032 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8033
8034/* ------------------------------ */
8035 .balign 128
8036.L_ALT_op_if_ge: /* 0x35 */
8037/* File: arm64/alt_stub.S */
8038/*
8039 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8040 * any interesting requests and then jump to the real instruction
8041 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8042 */
8043 .extern MterpCheckBefore
8044 EXPORT_PC
8045 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8046 adr lr, artMterpAsmInstructionStart + (53 * 128) // Addr of primary handler.
8047 mov x0, xSELF
8048 add x1, xFP, #OFF_FP_SHADOWFRAME
8049 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8050
8051/* ------------------------------ */
8052 .balign 128
8053.L_ALT_op_if_gt: /* 0x36 */
8054/* File: arm64/alt_stub.S */
8055/*
8056 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8057 * any interesting requests and then jump to the real instruction
8058 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8059 */
8060 .extern MterpCheckBefore
8061 EXPORT_PC
8062 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8063 adr lr, artMterpAsmInstructionStart + (54 * 128) // Addr of primary handler.
8064 mov x0, xSELF
8065 add x1, xFP, #OFF_FP_SHADOWFRAME
8066 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8067
8068/* ------------------------------ */
8069 .balign 128
8070.L_ALT_op_if_le: /* 0x37 */
8071/* File: arm64/alt_stub.S */
8072/*
8073 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8074 * any interesting requests and then jump to the real instruction
8075 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8076 */
8077 .extern MterpCheckBefore
8078 EXPORT_PC
8079 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8080 adr lr, artMterpAsmInstructionStart + (55 * 128) // Addr of primary handler.
8081 mov x0, xSELF
8082 add x1, xFP, #OFF_FP_SHADOWFRAME
8083 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8084
8085/* ------------------------------ */
8086 .balign 128
8087.L_ALT_op_if_eqz: /* 0x38 */
8088/* File: arm64/alt_stub.S */
8089/*
8090 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8091 * any interesting requests and then jump to the real instruction
8092 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8093 */
8094 .extern MterpCheckBefore
8095 EXPORT_PC
8096 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8097 adr lr, artMterpAsmInstructionStart + (56 * 128) // Addr of primary handler.
8098 mov x0, xSELF
8099 add x1, xFP, #OFF_FP_SHADOWFRAME
8100 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8101
8102/* ------------------------------ */
8103 .balign 128
8104.L_ALT_op_if_nez: /* 0x39 */
8105/* File: arm64/alt_stub.S */
8106/*
8107 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8108 * any interesting requests and then jump to the real instruction
8109 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8110 */
8111 .extern MterpCheckBefore
8112 EXPORT_PC
8113 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8114 adr lr, artMterpAsmInstructionStart + (57 * 128) // Addr of primary handler.
8115 mov x0, xSELF
8116 add x1, xFP, #OFF_FP_SHADOWFRAME
8117 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8118
8119/* ------------------------------ */
8120 .balign 128
8121.L_ALT_op_if_ltz: /* 0x3a */
8122/* File: arm64/alt_stub.S */
8123/*
8124 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8125 * any interesting requests and then jump to the real instruction
8126 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8127 */
8128 .extern MterpCheckBefore
8129 EXPORT_PC
8130 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8131 adr lr, artMterpAsmInstructionStart + (58 * 128) // Addr of primary handler.
8132 mov x0, xSELF
8133 add x1, xFP, #OFF_FP_SHADOWFRAME
8134 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8135
8136/* ------------------------------ */
8137 .balign 128
8138.L_ALT_op_if_gez: /* 0x3b */
8139/* File: arm64/alt_stub.S */
8140/*
8141 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8142 * any interesting requests and then jump to the real instruction
8143 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8144 */
8145 .extern MterpCheckBefore
8146 EXPORT_PC
8147 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8148 adr lr, artMterpAsmInstructionStart + (59 * 128) // Addr of primary handler.
8149 mov x0, xSELF
8150 add x1, xFP, #OFF_FP_SHADOWFRAME
8151 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8152
8153/* ------------------------------ */
8154 .balign 128
8155.L_ALT_op_if_gtz: /* 0x3c */
8156/* File: arm64/alt_stub.S */
8157/*
8158 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8159 * any interesting requests and then jump to the real instruction
8160 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8161 */
8162 .extern MterpCheckBefore
8163 EXPORT_PC
8164 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8165 adr lr, artMterpAsmInstructionStart + (60 * 128) // Addr of primary handler.
8166 mov x0, xSELF
8167 add x1, xFP, #OFF_FP_SHADOWFRAME
8168 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8169
8170/* ------------------------------ */
8171 .balign 128
8172.L_ALT_op_if_lez: /* 0x3d */
8173/* File: arm64/alt_stub.S */
8174/*
8175 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8176 * any interesting requests and then jump to the real instruction
8177 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8178 */
8179 .extern MterpCheckBefore
8180 EXPORT_PC
8181 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8182 adr lr, artMterpAsmInstructionStart + (61 * 128) // Addr of primary handler.
8183 mov x0, xSELF
8184 add x1, xFP, #OFF_FP_SHADOWFRAME
8185 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8186
8187/* ------------------------------ */
8188 .balign 128
8189.L_ALT_op_unused_3e: /* 0x3e */
8190/* File: arm64/alt_stub.S */
8191/*
8192 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8193 * any interesting requests and then jump to the real instruction
8194 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8195 */
8196 .extern MterpCheckBefore
8197 EXPORT_PC
8198 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8199 adr lr, artMterpAsmInstructionStart + (62 * 128) // Addr of primary handler.
8200 mov x0, xSELF
8201 add x1, xFP, #OFF_FP_SHADOWFRAME
8202 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8203
8204/* ------------------------------ */
8205 .balign 128
8206.L_ALT_op_unused_3f: /* 0x3f */
8207/* File: arm64/alt_stub.S */
8208/*
8209 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8210 * any interesting requests and then jump to the real instruction
8211 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8212 */
8213 .extern MterpCheckBefore
8214 EXPORT_PC
8215 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8216 adr lr, artMterpAsmInstructionStart + (63 * 128) // Addr of primary handler.
8217 mov x0, xSELF
8218 add x1, xFP, #OFF_FP_SHADOWFRAME
8219 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8220
8221/* ------------------------------ */
8222 .balign 128
8223.L_ALT_op_unused_40: /* 0x40 */
8224/* File: arm64/alt_stub.S */
8225/*
8226 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8227 * any interesting requests and then jump to the real instruction
8228 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8229 */
8230 .extern MterpCheckBefore
8231 EXPORT_PC
8232 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8233 adr lr, artMterpAsmInstructionStart + (64 * 128) // Addr of primary handler.
8234 mov x0, xSELF
8235 add x1, xFP, #OFF_FP_SHADOWFRAME
8236 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8237
8238/* ------------------------------ */
8239 .balign 128
8240.L_ALT_op_unused_41: /* 0x41 */
8241/* File: arm64/alt_stub.S */
8242/*
8243 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8244 * any interesting requests and then jump to the real instruction
8245 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8246 */
8247 .extern MterpCheckBefore
8248 EXPORT_PC
8249 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8250 adr lr, artMterpAsmInstructionStart + (65 * 128) // Addr of primary handler.
8251 mov x0, xSELF
8252 add x1, xFP, #OFF_FP_SHADOWFRAME
8253 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8254
8255/* ------------------------------ */
8256 .balign 128
8257.L_ALT_op_unused_42: /* 0x42 */
8258/* File: arm64/alt_stub.S */
8259/*
8260 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8261 * any interesting requests and then jump to the real instruction
8262 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8263 */
8264 .extern MterpCheckBefore
8265 EXPORT_PC
8266 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8267 adr lr, artMterpAsmInstructionStart + (66 * 128) // Addr of primary handler.
8268 mov x0, xSELF
8269 add x1, xFP, #OFF_FP_SHADOWFRAME
8270 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8271
8272/* ------------------------------ */
8273 .balign 128
8274.L_ALT_op_unused_43: /* 0x43 */
8275/* File: arm64/alt_stub.S */
8276/*
8277 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8278 * any interesting requests and then jump to the real instruction
8279 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8280 */
8281 .extern MterpCheckBefore
8282 EXPORT_PC
8283 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8284 adr lr, artMterpAsmInstructionStart + (67 * 128) // Addr of primary handler.
8285 mov x0, xSELF
8286 add x1, xFP, #OFF_FP_SHADOWFRAME
8287 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8288
8289/* ------------------------------ */
8290 .balign 128
8291.L_ALT_op_aget: /* 0x44 */
8292/* File: arm64/alt_stub.S */
8293/*
8294 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8295 * any interesting requests and then jump to the real instruction
8296 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8297 */
8298 .extern MterpCheckBefore
8299 EXPORT_PC
8300 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8301 adr lr, artMterpAsmInstructionStart + (68 * 128) // Addr of primary handler.
8302 mov x0, xSELF
8303 add x1, xFP, #OFF_FP_SHADOWFRAME
8304 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8305
8306/* ------------------------------ */
8307 .balign 128
8308.L_ALT_op_aget_wide: /* 0x45 */
8309/* File: arm64/alt_stub.S */
8310/*
8311 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8312 * any interesting requests and then jump to the real instruction
8313 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8314 */
8315 .extern MterpCheckBefore
8316 EXPORT_PC
8317 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8318 adr lr, artMterpAsmInstructionStart + (69 * 128) // Addr of primary handler.
8319 mov x0, xSELF
8320 add x1, xFP, #OFF_FP_SHADOWFRAME
8321 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8322
8323/* ------------------------------ */
8324 .balign 128
8325.L_ALT_op_aget_object: /* 0x46 */
8326/* File: arm64/alt_stub.S */
8327/*
8328 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8329 * any interesting requests and then jump to the real instruction
8330 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8331 */
8332 .extern MterpCheckBefore
8333 EXPORT_PC
8334 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8335 adr lr, artMterpAsmInstructionStart + (70 * 128) // Addr of primary handler.
8336 mov x0, xSELF
8337 add x1, xFP, #OFF_FP_SHADOWFRAME
8338 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8339
8340/* ------------------------------ */
8341 .balign 128
8342.L_ALT_op_aget_boolean: /* 0x47 */
8343/* File: arm64/alt_stub.S */
8344/*
8345 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8346 * any interesting requests and then jump to the real instruction
8347 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8348 */
8349 .extern MterpCheckBefore
8350 EXPORT_PC
8351 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8352 adr lr, artMterpAsmInstructionStart + (71 * 128) // Addr of primary handler.
8353 mov x0, xSELF
8354 add x1, xFP, #OFF_FP_SHADOWFRAME
8355 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8356
8357/* ------------------------------ */
8358 .balign 128
8359.L_ALT_op_aget_byte: /* 0x48 */
8360/* File: arm64/alt_stub.S */
8361/*
8362 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8363 * any interesting requests and then jump to the real instruction
8364 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8365 */
8366 .extern MterpCheckBefore
8367 EXPORT_PC
8368 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8369 adr lr, artMterpAsmInstructionStart + (72 * 128) // Addr of primary handler.
8370 mov x0, xSELF
8371 add x1, xFP, #OFF_FP_SHADOWFRAME
8372 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8373
8374/* ------------------------------ */
8375 .balign 128
8376.L_ALT_op_aget_char: /* 0x49 */
8377/* File: arm64/alt_stub.S */
8378/*
8379 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8380 * any interesting requests and then jump to the real instruction
8381 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8382 */
8383 .extern MterpCheckBefore
8384 EXPORT_PC
8385 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8386 adr lr, artMterpAsmInstructionStart + (73 * 128) // Addr of primary handler.
8387 mov x0, xSELF
8388 add x1, xFP, #OFF_FP_SHADOWFRAME
8389 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8390
8391/* ------------------------------ */
8392 .balign 128
8393.L_ALT_op_aget_short: /* 0x4a */
8394/* File: arm64/alt_stub.S */
8395/*
8396 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8397 * any interesting requests and then jump to the real instruction
8398 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8399 */
8400 .extern MterpCheckBefore
8401 EXPORT_PC
8402 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8403 adr lr, artMterpAsmInstructionStart + (74 * 128) // Addr of primary handler.
8404 mov x0, xSELF
8405 add x1, xFP, #OFF_FP_SHADOWFRAME
8406 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8407
8408/* ------------------------------ */
8409 .balign 128
8410.L_ALT_op_aput: /* 0x4b */
8411/* File: arm64/alt_stub.S */
8412/*
8413 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8414 * any interesting requests and then jump to the real instruction
8415 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8416 */
8417 .extern MterpCheckBefore
8418 EXPORT_PC
8419 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8420 adr lr, artMterpAsmInstructionStart + (75 * 128) // Addr of primary handler.
8421 mov x0, xSELF
8422 add x1, xFP, #OFF_FP_SHADOWFRAME
8423 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8424
8425/* ------------------------------ */
8426 .balign 128
8427.L_ALT_op_aput_wide: /* 0x4c */
8428/* File: arm64/alt_stub.S */
8429/*
8430 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8431 * any interesting requests and then jump to the real instruction
8432 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8433 */
8434 .extern MterpCheckBefore
8435 EXPORT_PC
8436 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8437 adr lr, artMterpAsmInstructionStart + (76 * 128) // Addr of primary handler.
8438 mov x0, xSELF
8439 add x1, xFP, #OFF_FP_SHADOWFRAME
8440 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8441
8442/* ------------------------------ */
8443 .balign 128
8444.L_ALT_op_aput_object: /* 0x4d */
8445/* File: arm64/alt_stub.S */
8446/*
8447 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8448 * any interesting requests and then jump to the real instruction
8449 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8450 */
8451 .extern MterpCheckBefore
8452 EXPORT_PC
8453 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8454 adr lr, artMterpAsmInstructionStart + (77 * 128) // Addr of primary handler.
8455 mov x0, xSELF
8456 add x1, xFP, #OFF_FP_SHADOWFRAME
8457 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8458
8459/* ------------------------------ */
8460 .balign 128
8461.L_ALT_op_aput_boolean: /* 0x4e */
8462/* File: arm64/alt_stub.S */
8463/*
8464 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8465 * any interesting requests and then jump to the real instruction
8466 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8467 */
8468 .extern MterpCheckBefore
8469 EXPORT_PC
8470 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8471 adr lr, artMterpAsmInstructionStart + (78 * 128) // Addr of primary handler.
8472 mov x0, xSELF
8473 add x1, xFP, #OFF_FP_SHADOWFRAME
8474 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8475
8476/* ------------------------------ */
8477 .balign 128
8478.L_ALT_op_aput_byte: /* 0x4f */
8479/* File: arm64/alt_stub.S */
8480/*
8481 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8482 * any interesting requests and then jump to the real instruction
8483 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8484 */
8485 .extern MterpCheckBefore
8486 EXPORT_PC
8487 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8488 adr lr, artMterpAsmInstructionStart + (79 * 128) // Addr of primary handler.
8489 mov x0, xSELF
8490 add x1, xFP, #OFF_FP_SHADOWFRAME
8491 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8492
8493/* ------------------------------ */
8494 .balign 128
8495.L_ALT_op_aput_char: /* 0x50 */
8496/* File: arm64/alt_stub.S */
8497/*
8498 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8499 * any interesting requests and then jump to the real instruction
8500 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8501 */
8502 .extern MterpCheckBefore
8503 EXPORT_PC
8504 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8505 adr lr, artMterpAsmInstructionStart + (80 * 128) // Addr of primary handler.
8506 mov x0, xSELF
8507 add x1, xFP, #OFF_FP_SHADOWFRAME
8508 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8509
8510/* ------------------------------ */
8511 .balign 128
8512.L_ALT_op_aput_short: /* 0x51 */
8513/* File: arm64/alt_stub.S */
8514/*
8515 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8516 * any interesting requests and then jump to the real instruction
8517 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8518 */
8519 .extern MterpCheckBefore
8520 EXPORT_PC
8521 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8522 adr lr, artMterpAsmInstructionStart + (81 * 128) // Addr of primary handler.
8523 mov x0, xSELF
8524 add x1, xFP, #OFF_FP_SHADOWFRAME
8525 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8526
8527/* ------------------------------ */
8528 .balign 128
8529.L_ALT_op_iget: /* 0x52 */
8530/* File: arm64/alt_stub.S */
8531/*
8532 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8533 * any interesting requests and then jump to the real instruction
8534 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8535 */
8536 .extern MterpCheckBefore
8537 EXPORT_PC
8538 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8539 adr lr, artMterpAsmInstructionStart + (82 * 128) // Addr of primary handler.
8540 mov x0, xSELF
8541 add x1, xFP, #OFF_FP_SHADOWFRAME
8542 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8543
8544/* ------------------------------ */
8545 .balign 128
8546.L_ALT_op_iget_wide: /* 0x53 */
8547/* File: arm64/alt_stub.S */
8548/*
8549 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8550 * any interesting requests and then jump to the real instruction
8551 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8552 */
8553 .extern MterpCheckBefore
8554 EXPORT_PC
8555 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8556 adr lr, artMterpAsmInstructionStart + (83 * 128) // Addr of primary handler.
8557 mov x0, xSELF
8558 add x1, xFP, #OFF_FP_SHADOWFRAME
8559 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8560
8561/* ------------------------------ */
8562 .balign 128
8563.L_ALT_op_iget_object: /* 0x54 */
8564/* File: arm64/alt_stub.S */
8565/*
8566 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8567 * any interesting requests and then jump to the real instruction
8568 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8569 */
8570 .extern MterpCheckBefore
8571 EXPORT_PC
8572 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8573 adr lr, artMterpAsmInstructionStart + (84 * 128) // Addr of primary handler.
8574 mov x0, xSELF
8575 add x1, xFP, #OFF_FP_SHADOWFRAME
8576 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8577
8578/* ------------------------------ */
8579 .balign 128
8580.L_ALT_op_iget_boolean: /* 0x55 */
8581/* File: arm64/alt_stub.S */
8582/*
8583 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8584 * any interesting requests and then jump to the real instruction
8585 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8586 */
8587 .extern MterpCheckBefore
8588 EXPORT_PC
8589 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8590 adr lr, artMterpAsmInstructionStart + (85 * 128) // Addr of primary handler.
8591 mov x0, xSELF
8592 add x1, xFP, #OFF_FP_SHADOWFRAME
8593 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8594
8595/* ------------------------------ */
8596 .balign 128
8597.L_ALT_op_iget_byte: /* 0x56 */
8598/* File: arm64/alt_stub.S */
8599/*
8600 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8601 * any interesting requests and then jump to the real instruction
8602 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8603 */
8604 .extern MterpCheckBefore
8605 EXPORT_PC
8606 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8607 adr lr, artMterpAsmInstructionStart + (86 * 128) // Addr of primary handler.
8608 mov x0, xSELF
8609 add x1, xFP, #OFF_FP_SHADOWFRAME
8610 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8611
8612/* ------------------------------ */
8613 .balign 128
8614.L_ALT_op_iget_char: /* 0x57 */
8615/* File: arm64/alt_stub.S */
8616/*
8617 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8618 * any interesting requests and then jump to the real instruction
8619 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8620 */
8621 .extern MterpCheckBefore
8622 EXPORT_PC
8623 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8624 adr lr, artMterpAsmInstructionStart + (87 * 128) // Addr of primary handler.
8625 mov x0, xSELF
8626 add x1, xFP, #OFF_FP_SHADOWFRAME
8627 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8628
8629/* ------------------------------ */
8630 .balign 128
8631.L_ALT_op_iget_short: /* 0x58 */
8632/* File: arm64/alt_stub.S */
8633/*
8634 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8635 * any interesting requests and then jump to the real instruction
8636 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8637 */
8638 .extern MterpCheckBefore
8639 EXPORT_PC
8640 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8641 adr lr, artMterpAsmInstructionStart + (88 * 128) // Addr of primary handler.
8642 mov x0, xSELF
8643 add x1, xFP, #OFF_FP_SHADOWFRAME
8644 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8645
8646/* ------------------------------ */
8647 .balign 128
8648.L_ALT_op_iput: /* 0x59 */
8649/* File: arm64/alt_stub.S */
8650/*
8651 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8652 * any interesting requests and then jump to the real instruction
8653 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8654 */
8655 .extern MterpCheckBefore
8656 EXPORT_PC
8657 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8658 adr lr, artMterpAsmInstructionStart + (89 * 128) // Addr of primary handler.
8659 mov x0, xSELF
8660 add x1, xFP, #OFF_FP_SHADOWFRAME
8661 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8662
8663/* ------------------------------ */
8664 .balign 128
8665.L_ALT_op_iput_wide: /* 0x5a */
8666/* File: arm64/alt_stub.S */
8667/*
8668 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8669 * any interesting requests and then jump to the real instruction
8670 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8671 */
8672 .extern MterpCheckBefore
8673 EXPORT_PC
8674 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8675 adr lr, artMterpAsmInstructionStart + (90 * 128) // Addr of primary handler.
8676 mov x0, xSELF
8677 add x1, xFP, #OFF_FP_SHADOWFRAME
8678 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8679
8680/* ------------------------------ */
8681 .balign 128
8682.L_ALT_op_iput_object: /* 0x5b */
8683/* File: arm64/alt_stub.S */
8684/*
8685 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8686 * any interesting requests and then jump to the real instruction
8687 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8688 */
8689 .extern MterpCheckBefore
8690 EXPORT_PC
8691 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8692 adr lr, artMterpAsmInstructionStart + (91 * 128) // Addr of primary handler.
8693 mov x0, xSELF
8694 add x1, xFP, #OFF_FP_SHADOWFRAME
8695 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8696
8697/* ------------------------------ */
8698 .balign 128
8699.L_ALT_op_iput_boolean: /* 0x5c */
8700/* File: arm64/alt_stub.S */
8701/*
8702 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8703 * any interesting requests and then jump to the real instruction
8704 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8705 */
8706 .extern MterpCheckBefore
8707 EXPORT_PC
8708 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8709 adr lr, artMterpAsmInstructionStart + (92 * 128) // Addr of primary handler.
8710 mov x0, xSELF
8711 add x1, xFP, #OFF_FP_SHADOWFRAME
8712 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8713
8714/* ------------------------------ */
8715 .balign 128
8716.L_ALT_op_iput_byte: /* 0x5d */
8717/* File: arm64/alt_stub.S */
8718/*
8719 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8720 * any interesting requests and then jump to the real instruction
8721 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8722 */
8723 .extern MterpCheckBefore
8724 EXPORT_PC
8725 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8726 adr lr, artMterpAsmInstructionStart + (93 * 128) // Addr of primary handler.
8727 mov x0, xSELF
8728 add x1, xFP, #OFF_FP_SHADOWFRAME
8729 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8730
8731/* ------------------------------ */
8732 .balign 128
8733.L_ALT_op_iput_char: /* 0x5e */
8734/* File: arm64/alt_stub.S */
8735/*
8736 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8737 * any interesting requests and then jump to the real instruction
8738 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8739 */
8740 .extern MterpCheckBefore
8741 EXPORT_PC
8742 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8743 adr lr, artMterpAsmInstructionStart + (94 * 128) // Addr of primary handler.
8744 mov x0, xSELF
8745 add x1, xFP, #OFF_FP_SHADOWFRAME
8746 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8747
8748/* ------------------------------ */
8749 .balign 128
8750.L_ALT_op_iput_short: /* 0x5f */
8751/* File: arm64/alt_stub.S */
8752/*
8753 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8754 * any interesting requests and then jump to the real instruction
8755 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8756 */
8757 .extern MterpCheckBefore
8758 EXPORT_PC
8759 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8760 adr lr, artMterpAsmInstructionStart + (95 * 128) // Addr of primary handler.
8761 mov x0, xSELF
8762 add x1, xFP, #OFF_FP_SHADOWFRAME
8763 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8764
8765/* ------------------------------ */
8766 .balign 128
8767.L_ALT_op_sget: /* 0x60 */
8768/* File: arm64/alt_stub.S */
8769/*
8770 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8771 * any interesting requests and then jump to the real instruction
8772 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8773 */
8774 .extern MterpCheckBefore
8775 EXPORT_PC
8776 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8777 adr lr, artMterpAsmInstructionStart + (96 * 128) // Addr of primary handler.
8778 mov x0, xSELF
8779 add x1, xFP, #OFF_FP_SHADOWFRAME
8780 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8781
8782/* ------------------------------ */
8783 .balign 128
8784.L_ALT_op_sget_wide: /* 0x61 */
8785/* File: arm64/alt_stub.S */
8786/*
8787 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8788 * any interesting requests and then jump to the real instruction
8789 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8790 */
8791 .extern MterpCheckBefore
8792 EXPORT_PC
8793 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8794 adr lr, artMterpAsmInstructionStart + (97 * 128) // Addr of primary handler.
8795 mov x0, xSELF
8796 add x1, xFP, #OFF_FP_SHADOWFRAME
8797 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8798
8799/* ------------------------------ */
8800 .balign 128
8801.L_ALT_op_sget_object: /* 0x62 */
8802/* File: arm64/alt_stub.S */
8803/*
8804 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8805 * any interesting requests and then jump to the real instruction
8806 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8807 */
8808 .extern MterpCheckBefore
8809 EXPORT_PC
8810 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8811 adr lr, artMterpAsmInstructionStart + (98 * 128) // Addr of primary handler.
8812 mov x0, xSELF
8813 add x1, xFP, #OFF_FP_SHADOWFRAME
8814 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8815
8816/* ------------------------------ */
8817 .balign 128
8818.L_ALT_op_sget_boolean: /* 0x63 */
8819/* File: arm64/alt_stub.S */
8820/*
8821 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8822 * any interesting requests and then jump to the real instruction
8823 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8824 */
8825 .extern MterpCheckBefore
8826 EXPORT_PC
8827 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8828 adr lr, artMterpAsmInstructionStart + (99 * 128) // Addr of primary handler.
8829 mov x0, xSELF
8830 add x1, xFP, #OFF_FP_SHADOWFRAME
8831 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8832
8833/* ------------------------------ */
8834 .balign 128
8835.L_ALT_op_sget_byte: /* 0x64 */
8836/* File: arm64/alt_stub.S */
8837/*
8838 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8839 * any interesting requests and then jump to the real instruction
8840 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8841 */
8842 .extern MterpCheckBefore
8843 EXPORT_PC
8844 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8845 adr lr, artMterpAsmInstructionStart + (100 * 128) // Addr of primary handler.
8846 mov x0, xSELF
8847 add x1, xFP, #OFF_FP_SHADOWFRAME
8848 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8849
8850/* ------------------------------ */
8851 .balign 128
8852.L_ALT_op_sget_char: /* 0x65 */
8853/* File: arm64/alt_stub.S */
8854/*
8855 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8856 * any interesting requests and then jump to the real instruction
8857 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8858 */
8859 .extern MterpCheckBefore
8860 EXPORT_PC
8861 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8862 adr lr, artMterpAsmInstructionStart + (101 * 128) // Addr of primary handler.
8863 mov x0, xSELF
8864 add x1, xFP, #OFF_FP_SHADOWFRAME
8865 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8866
8867/* ------------------------------ */
8868 .balign 128
8869.L_ALT_op_sget_short: /* 0x66 */
8870/* File: arm64/alt_stub.S */
8871/*
8872 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8873 * any interesting requests and then jump to the real instruction
8874 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8875 */
8876 .extern MterpCheckBefore
8877 EXPORT_PC
8878 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8879 adr lr, artMterpAsmInstructionStart + (102 * 128) // Addr of primary handler.
8880 mov x0, xSELF
8881 add x1, xFP, #OFF_FP_SHADOWFRAME
8882 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8883
8884/* ------------------------------ */
8885 .balign 128
8886.L_ALT_op_sput: /* 0x67 */
8887/* File: arm64/alt_stub.S */
8888/*
8889 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8890 * any interesting requests and then jump to the real instruction
8891 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8892 */
8893 .extern MterpCheckBefore
8894 EXPORT_PC
8895 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8896 adr lr, artMterpAsmInstructionStart + (103 * 128) // Addr of primary handler.
8897 mov x0, xSELF
8898 add x1, xFP, #OFF_FP_SHADOWFRAME
8899 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8900
8901/* ------------------------------ */
8902 .balign 128
8903.L_ALT_op_sput_wide: /* 0x68 */
8904/* File: arm64/alt_stub.S */
8905/*
8906 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8907 * any interesting requests and then jump to the real instruction
8908 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8909 */
8910 .extern MterpCheckBefore
8911 EXPORT_PC
8912 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8913 adr lr, artMterpAsmInstructionStart + (104 * 128) // Addr of primary handler.
8914 mov x0, xSELF
8915 add x1, xFP, #OFF_FP_SHADOWFRAME
8916 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8917
8918/* ------------------------------ */
8919 .balign 128
8920.L_ALT_op_sput_object: /* 0x69 */
8921/* File: arm64/alt_stub.S */
8922/*
8923 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8924 * any interesting requests and then jump to the real instruction
8925 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8926 */
8927 .extern MterpCheckBefore
8928 EXPORT_PC
8929 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8930 adr lr, artMterpAsmInstructionStart + (105 * 128) // Addr of primary handler.
8931 mov x0, xSELF
8932 add x1, xFP, #OFF_FP_SHADOWFRAME
8933 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8934
8935/* ------------------------------ */
8936 .balign 128
8937.L_ALT_op_sput_boolean: /* 0x6a */
8938/* File: arm64/alt_stub.S */
8939/*
8940 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8941 * any interesting requests and then jump to the real instruction
8942 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8943 */
8944 .extern MterpCheckBefore
8945 EXPORT_PC
8946 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8947 adr lr, artMterpAsmInstructionStart + (106 * 128) // Addr of primary handler.
8948 mov x0, xSELF
8949 add x1, xFP, #OFF_FP_SHADOWFRAME
8950 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8951
8952/* ------------------------------ */
8953 .balign 128
8954.L_ALT_op_sput_byte: /* 0x6b */
8955/* File: arm64/alt_stub.S */
8956/*
8957 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8958 * any interesting requests and then jump to the real instruction
8959 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8960 */
8961 .extern MterpCheckBefore
8962 EXPORT_PC
8963 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8964 adr lr, artMterpAsmInstructionStart + (107 * 128) // Addr of primary handler.
8965 mov x0, xSELF
8966 add x1, xFP, #OFF_FP_SHADOWFRAME
8967 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8968
8969/* ------------------------------ */
8970 .balign 128
8971.L_ALT_op_sput_char: /* 0x6c */
8972/* File: arm64/alt_stub.S */
8973/*
8974 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8975 * any interesting requests and then jump to the real instruction
8976 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8977 */
8978 .extern MterpCheckBefore
8979 EXPORT_PC
8980 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8981 adr lr, artMterpAsmInstructionStart + (108 * 128) // Addr of primary handler.
8982 mov x0, xSELF
8983 add x1, xFP, #OFF_FP_SHADOWFRAME
8984 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
8985
8986/* ------------------------------ */
8987 .balign 128
8988.L_ALT_op_sput_short: /* 0x6d */
8989/* File: arm64/alt_stub.S */
8990/*
8991 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8992 * any interesting requests and then jump to the real instruction
8993 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8994 */
8995 .extern MterpCheckBefore
8996 EXPORT_PC
8997 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8998 adr lr, artMterpAsmInstructionStart + (109 * 128) // Addr of primary handler.
8999 mov x0, xSELF
9000 add x1, xFP, #OFF_FP_SHADOWFRAME
9001 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9002
9003/* ------------------------------ */
9004 .balign 128
9005.L_ALT_op_invoke_virtual: /* 0x6e */
9006/* File: arm64/alt_stub.S */
9007/*
9008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9009 * any interesting requests and then jump to the real instruction
9010 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9011 */
9012 .extern MterpCheckBefore
9013 EXPORT_PC
9014 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9015 adr lr, artMterpAsmInstructionStart + (110 * 128) // Addr of primary handler.
9016 mov x0, xSELF
9017 add x1, xFP, #OFF_FP_SHADOWFRAME
9018 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9019
9020/* ------------------------------ */
9021 .balign 128
9022.L_ALT_op_invoke_super: /* 0x6f */
9023/* File: arm64/alt_stub.S */
9024/*
9025 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9026 * any interesting requests and then jump to the real instruction
9027 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9028 */
9029 .extern MterpCheckBefore
9030 EXPORT_PC
9031 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9032 adr lr, artMterpAsmInstructionStart + (111 * 128) // Addr of primary handler.
9033 mov x0, xSELF
9034 add x1, xFP, #OFF_FP_SHADOWFRAME
9035 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9036
9037/* ------------------------------ */
9038 .balign 128
9039.L_ALT_op_invoke_direct: /* 0x70 */
9040/* File: arm64/alt_stub.S */
9041/*
9042 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9043 * any interesting requests and then jump to the real instruction
9044 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9045 */
9046 .extern MterpCheckBefore
9047 EXPORT_PC
9048 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9049 adr lr, artMterpAsmInstructionStart + (112 * 128) // Addr of primary handler.
9050 mov x0, xSELF
9051 add x1, xFP, #OFF_FP_SHADOWFRAME
9052 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9053
9054/* ------------------------------ */
9055 .balign 128
9056.L_ALT_op_invoke_static: /* 0x71 */
9057/* File: arm64/alt_stub.S */
9058/*
9059 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9060 * any interesting requests and then jump to the real instruction
9061 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9062 */
9063 .extern MterpCheckBefore
9064 EXPORT_PC
9065 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9066 adr lr, artMterpAsmInstructionStart + (113 * 128) // Addr of primary handler.
9067 mov x0, xSELF
9068 add x1, xFP, #OFF_FP_SHADOWFRAME
9069 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9070
9071/* ------------------------------ */
9072 .balign 128
9073.L_ALT_op_invoke_interface: /* 0x72 */
9074/* File: arm64/alt_stub.S */
9075/*
9076 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9077 * any interesting requests and then jump to the real instruction
9078 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9079 */
9080 .extern MterpCheckBefore
9081 EXPORT_PC
9082 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9083 adr lr, artMterpAsmInstructionStart + (114 * 128) // Addr of primary handler.
9084 mov x0, xSELF
9085 add x1, xFP, #OFF_FP_SHADOWFRAME
9086 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9087
9088/* ------------------------------ */
9089 .balign 128
9090.L_ALT_op_return_void_no_barrier: /* 0x73 */
9091/* File: arm64/alt_stub.S */
9092/*
9093 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9094 * any interesting requests and then jump to the real instruction
9095 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9096 */
9097 .extern MterpCheckBefore
9098 EXPORT_PC
9099 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9100 adr lr, artMterpAsmInstructionStart + (115 * 128) // Addr of primary handler.
9101 mov x0, xSELF
9102 add x1, xFP, #OFF_FP_SHADOWFRAME
9103 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9104
9105/* ------------------------------ */
9106 .balign 128
9107.L_ALT_op_invoke_virtual_range: /* 0x74 */
9108/* File: arm64/alt_stub.S */
9109/*
9110 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9111 * any interesting requests and then jump to the real instruction
9112 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9113 */
9114 .extern MterpCheckBefore
9115 EXPORT_PC
9116 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9117 adr lr, artMterpAsmInstructionStart + (116 * 128) // Addr of primary handler.
9118 mov x0, xSELF
9119 add x1, xFP, #OFF_FP_SHADOWFRAME
9120 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9121
9122/* ------------------------------ */
9123 .balign 128
9124.L_ALT_op_invoke_super_range: /* 0x75 */
9125/* File: arm64/alt_stub.S */
9126/*
9127 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9128 * any interesting requests and then jump to the real instruction
9129 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9130 */
9131 .extern MterpCheckBefore
9132 EXPORT_PC
9133 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9134 adr lr, artMterpAsmInstructionStart + (117 * 128) // Addr of primary handler.
9135 mov x0, xSELF
9136 add x1, xFP, #OFF_FP_SHADOWFRAME
9137 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9138
9139/* ------------------------------ */
9140 .balign 128
9141.L_ALT_op_invoke_direct_range: /* 0x76 */
9142/* File: arm64/alt_stub.S */
9143/*
9144 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9145 * any interesting requests and then jump to the real instruction
9146 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9147 */
9148 .extern MterpCheckBefore
9149 EXPORT_PC
9150 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9151 adr lr, artMterpAsmInstructionStart + (118 * 128) // Addr of primary handler.
9152 mov x0, xSELF
9153 add x1, xFP, #OFF_FP_SHADOWFRAME
9154 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9155
9156/* ------------------------------ */
9157 .balign 128
9158.L_ALT_op_invoke_static_range: /* 0x77 */
9159/* File: arm64/alt_stub.S */
9160/*
9161 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9162 * any interesting requests and then jump to the real instruction
9163 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9164 */
9165 .extern MterpCheckBefore
9166 EXPORT_PC
9167 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9168 adr lr, artMterpAsmInstructionStart + (119 * 128) // Addr of primary handler.
9169 mov x0, xSELF
9170 add x1, xFP, #OFF_FP_SHADOWFRAME
9171 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9172
9173/* ------------------------------ */
9174 .balign 128
9175.L_ALT_op_invoke_interface_range: /* 0x78 */
9176/* File: arm64/alt_stub.S */
9177/*
9178 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9179 * any interesting requests and then jump to the real instruction
9180 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9181 */
9182 .extern MterpCheckBefore
9183 EXPORT_PC
9184 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9185 adr lr, artMterpAsmInstructionStart + (120 * 128) // Addr of primary handler.
9186 mov x0, xSELF
9187 add x1, xFP, #OFF_FP_SHADOWFRAME
9188 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9189
9190/* ------------------------------ */
9191 .balign 128
9192.L_ALT_op_unused_79: /* 0x79 */
9193/* File: arm64/alt_stub.S */
9194/*
9195 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9196 * any interesting requests and then jump to the real instruction
9197 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9198 */
9199 .extern MterpCheckBefore
9200 EXPORT_PC
9201 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9202 adr lr, artMterpAsmInstructionStart + (121 * 128) // Addr of primary handler.
9203 mov x0, xSELF
9204 add x1, xFP, #OFF_FP_SHADOWFRAME
9205 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9206
9207/* ------------------------------ */
9208 .balign 128
9209.L_ALT_op_unused_7a: /* 0x7a */
9210/* File: arm64/alt_stub.S */
9211/*
9212 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9213 * any interesting requests and then jump to the real instruction
9214 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9215 */
9216 .extern MterpCheckBefore
9217 EXPORT_PC
9218 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9219 adr lr, artMterpAsmInstructionStart + (122 * 128) // Addr of primary handler.
9220 mov x0, xSELF
9221 add x1, xFP, #OFF_FP_SHADOWFRAME
9222 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9223
9224/* ------------------------------ */
9225 .balign 128
9226.L_ALT_op_neg_int: /* 0x7b */
9227/* File: arm64/alt_stub.S */
9228/*
9229 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9230 * any interesting requests and then jump to the real instruction
9231 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9232 */
9233 .extern MterpCheckBefore
9234 EXPORT_PC
9235 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9236 adr lr, artMterpAsmInstructionStart + (123 * 128) // Addr of primary handler.
9237 mov x0, xSELF
9238 add x1, xFP, #OFF_FP_SHADOWFRAME
9239 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9240
9241/* ------------------------------ */
9242 .balign 128
9243.L_ALT_op_not_int: /* 0x7c */
9244/* File: arm64/alt_stub.S */
9245/*
9246 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9247 * any interesting requests and then jump to the real instruction
9248 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9249 */
9250 .extern MterpCheckBefore
9251 EXPORT_PC
9252 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9253 adr lr, artMterpAsmInstructionStart + (124 * 128) // Addr of primary handler.
9254 mov x0, xSELF
9255 add x1, xFP, #OFF_FP_SHADOWFRAME
9256 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9257
9258/* ------------------------------ */
9259 .balign 128
9260.L_ALT_op_neg_long: /* 0x7d */
9261/* File: arm64/alt_stub.S */
9262/*
9263 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9264 * any interesting requests and then jump to the real instruction
9265 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9266 */
9267 .extern MterpCheckBefore
9268 EXPORT_PC
9269 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9270 adr lr, artMterpAsmInstructionStart + (125 * 128) // Addr of primary handler.
9271 mov x0, xSELF
9272 add x1, xFP, #OFF_FP_SHADOWFRAME
9273 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9274
9275/* ------------------------------ */
9276 .balign 128
9277.L_ALT_op_not_long: /* 0x7e */
9278/* File: arm64/alt_stub.S */
9279/*
9280 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9281 * any interesting requests and then jump to the real instruction
9282 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9283 */
9284 .extern MterpCheckBefore
9285 EXPORT_PC
9286 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9287 adr lr, artMterpAsmInstructionStart + (126 * 128) // Addr of primary handler.
9288 mov x0, xSELF
9289 add x1, xFP, #OFF_FP_SHADOWFRAME
9290 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9291
9292/* ------------------------------ */
9293 .balign 128
9294.L_ALT_op_neg_float: /* 0x7f */
9295/* File: arm64/alt_stub.S */
9296/*
9297 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9298 * any interesting requests and then jump to the real instruction
9299 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9300 */
9301 .extern MterpCheckBefore
9302 EXPORT_PC
9303 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9304 adr lr, artMterpAsmInstructionStart + (127 * 128) // Addr of primary handler.
9305 mov x0, xSELF
9306 add x1, xFP, #OFF_FP_SHADOWFRAME
9307 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9308
9309/* ------------------------------ */
9310 .balign 128
9311.L_ALT_op_neg_double: /* 0x80 */
9312/* File: arm64/alt_stub.S */
9313/*
9314 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9315 * any interesting requests and then jump to the real instruction
9316 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9317 */
9318 .extern MterpCheckBefore
9319 EXPORT_PC
9320 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9321 adr lr, artMterpAsmInstructionStart + (128 * 128) // Addr of primary handler.
9322 mov x0, xSELF
9323 add x1, xFP, #OFF_FP_SHADOWFRAME
9324 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9325
9326/* ------------------------------ */
9327 .balign 128
9328.L_ALT_op_int_to_long: /* 0x81 */
9329/* File: arm64/alt_stub.S */
9330/*
9331 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9332 * any interesting requests and then jump to the real instruction
9333 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9334 */
9335 .extern MterpCheckBefore
9336 EXPORT_PC
9337 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9338 adr lr, artMterpAsmInstructionStart + (129 * 128) // Addr of primary handler.
9339 mov x0, xSELF
9340 add x1, xFP, #OFF_FP_SHADOWFRAME
9341 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9342
9343/* ------------------------------ */
9344 .balign 128
9345.L_ALT_op_int_to_float: /* 0x82 */
9346/* File: arm64/alt_stub.S */
9347/*
9348 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9349 * any interesting requests and then jump to the real instruction
9350 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9351 */
9352 .extern MterpCheckBefore
9353 EXPORT_PC
9354 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9355 adr lr, artMterpAsmInstructionStart + (130 * 128) // Addr of primary handler.
9356 mov x0, xSELF
9357 add x1, xFP, #OFF_FP_SHADOWFRAME
9358 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9359
9360/* ------------------------------ */
9361 .balign 128
9362.L_ALT_op_int_to_double: /* 0x83 */
9363/* File: arm64/alt_stub.S */
9364/*
9365 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9366 * any interesting requests and then jump to the real instruction
9367 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9368 */
9369 .extern MterpCheckBefore
9370 EXPORT_PC
9371 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9372 adr lr, artMterpAsmInstructionStart + (131 * 128) // Addr of primary handler.
9373 mov x0, xSELF
9374 add x1, xFP, #OFF_FP_SHADOWFRAME
9375 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9376
9377/* ------------------------------ */
9378 .balign 128
9379.L_ALT_op_long_to_int: /* 0x84 */
9380/* File: arm64/alt_stub.S */
9381/*
9382 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9383 * any interesting requests and then jump to the real instruction
9384 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9385 */
9386 .extern MterpCheckBefore
9387 EXPORT_PC
9388 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9389 adr lr, artMterpAsmInstructionStart + (132 * 128) // Addr of primary handler.
9390 mov x0, xSELF
9391 add x1, xFP, #OFF_FP_SHADOWFRAME
9392 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9393
9394/* ------------------------------ */
9395 .balign 128
9396.L_ALT_op_long_to_float: /* 0x85 */
9397/* File: arm64/alt_stub.S */
9398/*
9399 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9400 * any interesting requests and then jump to the real instruction
9401 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9402 */
9403 .extern MterpCheckBefore
9404 EXPORT_PC
9405 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9406 adr lr, artMterpAsmInstructionStart + (133 * 128) // Addr of primary handler.
9407 mov x0, xSELF
9408 add x1, xFP, #OFF_FP_SHADOWFRAME
9409 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9410
9411/* ------------------------------ */
9412 .balign 128
9413.L_ALT_op_long_to_double: /* 0x86 */
9414/* File: arm64/alt_stub.S */
9415/*
9416 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9417 * any interesting requests and then jump to the real instruction
9418 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9419 */
9420 .extern MterpCheckBefore
9421 EXPORT_PC
9422 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9423 adr lr, artMterpAsmInstructionStart + (134 * 128) // Addr of primary handler.
9424 mov x0, xSELF
9425 add x1, xFP, #OFF_FP_SHADOWFRAME
9426 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9427
9428/* ------------------------------ */
9429 .balign 128
9430.L_ALT_op_float_to_int: /* 0x87 */
9431/* File: arm64/alt_stub.S */
9432/*
9433 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9434 * any interesting requests and then jump to the real instruction
9435 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9436 */
9437 .extern MterpCheckBefore
9438 EXPORT_PC
9439 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9440 adr lr, artMterpAsmInstructionStart + (135 * 128) // Addr of primary handler.
9441 mov x0, xSELF
9442 add x1, xFP, #OFF_FP_SHADOWFRAME
9443 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9444
9445/* ------------------------------ */
9446 .balign 128
9447.L_ALT_op_float_to_long: /* 0x88 */
9448/* File: arm64/alt_stub.S */
9449/*
9450 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9451 * any interesting requests and then jump to the real instruction
9452 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9453 */
9454 .extern MterpCheckBefore
9455 EXPORT_PC
9456 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9457 adr lr, artMterpAsmInstructionStart + (136 * 128) // Addr of primary handler.
9458 mov x0, xSELF
9459 add x1, xFP, #OFF_FP_SHADOWFRAME
9460 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9461
9462/* ------------------------------ */
9463 .balign 128
9464.L_ALT_op_float_to_double: /* 0x89 */
9465/* File: arm64/alt_stub.S */
9466/*
9467 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9468 * any interesting requests and then jump to the real instruction
9469 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9470 */
9471 .extern MterpCheckBefore
9472 EXPORT_PC
9473 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9474 adr lr, artMterpAsmInstructionStart + (137 * 128) // Addr of primary handler.
9475 mov x0, xSELF
9476 add x1, xFP, #OFF_FP_SHADOWFRAME
9477 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9478
9479/* ------------------------------ */
9480 .balign 128
9481.L_ALT_op_double_to_int: /* 0x8a */
9482/* File: arm64/alt_stub.S */
9483/*
9484 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9485 * any interesting requests and then jump to the real instruction
9486 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9487 */
9488 .extern MterpCheckBefore
9489 EXPORT_PC
9490 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9491 adr lr, artMterpAsmInstructionStart + (138 * 128) // Addr of primary handler.
9492 mov x0, xSELF
9493 add x1, xFP, #OFF_FP_SHADOWFRAME
9494 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9495
9496/* ------------------------------ */
9497 .balign 128
9498.L_ALT_op_double_to_long: /* 0x8b */
9499/* File: arm64/alt_stub.S */
9500/*
9501 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9502 * any interesting requests and then jump to the real instruction
9503 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9504 */
9505 .extern MterpCheckBefore
9506 EXPORT_PC
9507 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9508 adr lr, artMterpAsmInstructionStart + (139 * 128) // Addr of primary handler.
9509 mov x0, xSELF
9510 add x1, xFP, #OFF_FP_SHADOWFRAME
9511 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9512
9513/* ------------------------------ */
9514 .balign 128
9515.L_ALT_op_double_to_float: /* 0x8c */
9516/* File: arm64/alt_stub.S */
9517/*
9518 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9519 * any interesting requests and then jump to the real instruction
9520 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9521 */
9522 .extern MterpCheckBefore
9523 EXPORT_PC
9524 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9525 adr lr, artMterpAsmInstructionStart + (140 * 128) // Addr of primary handler.
9526 mov x0, xSELF
9527 add x1, xFP, #OFF_FP_SHADOWFRAME
9528 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9529
9530/* ------------------------------ */
9531 .balign 128
9532.L_ALT_op_int_to_byte: /* 0x8d */
9533/* File: arm64/alt_stub.S */
9534/*
9535 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9536 * any interesting requests and then jump to the real instruction
9537 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9538 */
9539 .extern MterpCheckBefore
9540 EXPORT_PC
9541 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9542 adr lr, artMterpAsmInstructionStart + (141 * 128) // Addr of primary handler.
9543 mov x0, xSELF
9544 add x1, xFP, #OFF_FP_SHADOWFRAME
9545 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9546
9547/* ------------------------------ */
9548 .balign 128
9549.L_ALT_op_int_to_char: /* 0x8e */
9550/* File: arm64/alt_stub.S */
9551/*
9552 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9553 * any interesting requests and then jump to the real instruction
9554 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9555 */
9556 .extern MterpCheckBefore
9557 EXPORT_PC
9558 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9559 adr lr, artMterpAsmInstructionStart + (142 * 128) // Addr of primary handler.
9560 mov x0, xSELF
9561 add x1, xFP, #OFF_FP_SHADOWFRAME
9562 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9563
9564/* ------------------------------ */
9565 .balign 128
9566.L_ALT_op_int_to_short: /* 0x8f */
9567/* File: arm64/alt_stub.S */
9568/*
9569 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9570 * any interesting requests and then jump to the real instruction
9571 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9572 */
9573 .extern MterpCheckBefore
9574 EXPORT_PC
9575 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9576 adr lr, artMterpAsmInstructionStart + (143 * 128) // Addr of primary handler.
9577 mov x0, xSELF
9578 add x1, xFP, #OFF_FP_SHADOWFRAME
9579 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9580
9581/* ------------------------------ */
9582 .balign 128
9583.L_ALT_op_add_int: /* 0x90 */
9584/* File: arm64/alt_stub.S */
9585/*
9586 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9587 * any interesting requests and then jump to the real instruction
9588 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9589 */
9590 .extern MterpCheckBefore
9591 EXPORT_PC
9592 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9593 adr lr, artMterpAsmInstructionStart + (144 * 128) // Addr of primary handler.
9594 mov x0, xSELF
9595 add x1, xFP, #OFF_FP_SHADOWFRAME
9596 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9597
9598/* ------------------------------ */
9599 .balign 128
9600.L_ALT_op_sub_int: /* 0x91 */
9601/* File: arm64/alt_stub.S */
9602/*
9603 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9604 * any interesting requests and then jump to the real instruction
9605 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9606 */
9607 .extern MterpCheckBefore
9608 EXPORT_PC
9609 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9610 adr lr, artMterpAsmInstructionStart + (145 * 128) // Addr of primary handler.
9611 mov x0, xSELF
9612 add x1, xFP, #OFF_FP_SHADOWFRAME
9613 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9614
9615/* ------------------------------ */
9616 .balign 128
9617.L_ALT_op_mul_int: /* 0x92 */
9618/* File: arm64/alt_stub.S */
9619/*
9620 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9621 * any interesting requests and then jump to the real instruction
9622 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9623 */
9624 .extern MterpCheckBefore
9625 EXPORT_PC
9626 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9627 adr lr, artMterpAsmInstructionStart + (146 * 128) // Addr of primary handler.
9628 mov x0, xSELF
9629 add x1, xFP, #OFF_FP_SHADOWFRAME
9630 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9631
9632/* ------------------------------ */
9633 .balign 128
9634.L_ALT_op_div_int: /* 0x93 */
9635/* File: arm64/alt_stub.S */
9636/*
9637 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9638 * any interesting requests and then jump to the real instruction
9639 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9640 */
9641 .extern MterpCheckBefore
9642 EXPORT_PC
9643 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9644 adr lr, artMterpAsmInstructionStart + (147 * 128) // Addr of primary handler.
9645 mov x0, xSELF
9646 add x1, xFP, #OFF_FP_SHADOWFRAME
9647 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9648
9649/* ------------------------------ */
9650 .balign 128
9651.L_ALT_op_rem_int: /* 0x94 */
9652/* File: arm64/alt_stub.S */
9653/*
9654 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9655 * any interesting requests and then jump to the real instruction
9656 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9657 */
9658 .extern MterpCheckBefore
9659 EXPORT_PC
9660 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9661 adr lr, artMterpAsmInstructionStart + (148 * 128) // Addr of primary handler.
9662 mov x0, xSELF
9663 add x1, xFP, #OFF_FP_SHADOWFRAME
9664 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9665
9666/* ------------------------------ */
9667 .balign 128
9668.L_ALT_op_and_int: /* 0x95 */
9669/* File: arm64/alt_stub.S */
9670/*
9671 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9672 * any interesting requests and then jump to the real instruction
9673 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9674 */
9675 .extern MterpCheckBefore
9676 EXPORT_PC
9677 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9678 adr lr, artMterpAsmInstructionStart + (149 * 128) // Addr of primary handler.
9679 mov x0, xSELF
9680 add x1, xFP, #OFF_FP_SHADOWFRAME
9681 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9682
9683/* ------------------------------ */
9684 .balign 128
9685.L_ALT_op_or_int: /* 0x96 */
9686/* File: arm64/alt_stub.S */
9687/*
9688 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9689 * any interesting requests and then jump to the real instruction
9690 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9691 */
9692 .extern MterpCheckBefore
9693 EXPORT_PC
9694 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9695 adr lr, artMterpAsmInstructionStart + (150 * 128) // Addr of primary handler.
9696 mov x0, xSELF
9697 add x1, xFP, #OFF_FP_SHADOWFRAME
9698 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9699
9700/* ------------------------------ */
9701 .balign 128
9702.L_ALT_op_xor_int: /* 0x97 */
9703/* File: arm64/alt_stub.S */
9704/*
9705 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9706 * any interesting requests and then jump to the real instruction
9707 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9708 */
9709 .extern MterpCheckBefore
9710 EXPORT_PC
9711 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9712 adr lr, artMterpAsmInstructionStart + (151 * 128) // Addr of primary handler.
9713 mov x0, xSELF
9714 add x1, xFP, #OFF_FP_SHADOWFRAME
9715 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9716
9717/* ------------------------------ */
9718 .balign 128
9719.L_ALT_op_shl_int: /* 0x98 */
9720/* File: arm64/alt_stub.S */
9721/*
9722 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9723 * any interesting requests and then jump to the real instruction
9724 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9725 */
9726 .extern MterpCheckBefore
9727 EXPORT_PC
9728 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9729 adr lr, artMterpAsmInstructionStart + (152 * 128) // Addr of primary handler.
9730 mov x0, xSELF
9731 add x1, xFP, #OFF_FP_SHADOWFRAME
9732 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9733
9734/* ------------------------------ */
9735 .balign 128
9736.L_ALT_op_shr_int: /* 0x99 */
9737/* File: arm64/alt_stub.S */
9738/*
9739 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9740 * any interesting requests and then jump to the real instruction
9741 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9742 */
9743 .extern MterpCheckBefore
9744 EXPORT_PC
9745 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9746 adr lr, artMterpAsmInstructionStart + (153 * 128) // Addr of primary handler.
9747 mov x0, xSELF
9748 add x1, xFP, #OFF_FP_SHADOWFRAME
9749 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9750
9751/* ------------------------------ */
9752 .balign 128
9753.L_ALT_op_ushr_int: /* 0x9a */
9754/* File: arm64/alt_stub.S */
9755/*
9756 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9757 * any interesting requests and then jump to the real instruction
9758 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9759 */
9760 .extern MterpCheckBefore
9761 EXPORT_PC
9762 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9763 adr lr, artMterpAsmInstructionStart + (154 * 128) // Addr of primary handler.
9764 mov x0, xSELF
9765 add x1, xFP, #OFF_FP_SHADOWFRAME
9766 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9767
9768/* ------------------------------ */
9769 .balign 128
9770.L_ALT_op_add_long: /* 0x9b */
9771/* File: arm64/alt_stub.S */
9772/*
9773 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9774 * any interesting requests and then jump to the real instruction
9775 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9776 */
9777 .extern MterpCheckBefore
9778 EXPORT_PC
9779 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9780 adr lr, artMterpAsmInstructionStart + (155 * 128) // Addr of primary handler.
9781 mov x0, xSELF
9782 add x1, xFP, #OFF_FP_SHADOWFRAME
9783 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9784
9785/* ------------------------------ */
9786 .balign 128
9787.L_ALT_op_sub_long: /* 0x9c */
9788/* File: arm64/alt_stub.S */
9789/*
9790 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9791 * any interesting requests and then jump to the real instruction
9792 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9793 */
9794 .extern MterpCheckBefore
9795 EXPORT_PC
9796 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9797 adr lr, artMterpAsmInstructionStart + (156 * 128) // Addr of primary handler.
9798 mov x0, xSELF
9799 add x1, xFP, #OFF_FP_SHADOWFRAME
9800 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9801
9802/* ------------------------------ */
9803 .balign 128
9804.L_ALT_op_mul_long: /* 0x9d */
9805/* File: arm64/alt_stub.S */
9806/*
9807 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9808 * any interesting requests and then jump to the real instruction
9809 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9810 */
9811 .extern MterpCheckBefore
9812 EXPORT_PC
9813 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9814 adr lr, artMterpAsmInstructionStart + (157 * 128) // Addr of primary handler.
9815 mov x0, xSELF
9816 add x1, xFP, #OFF_FP_SHADOWFRAME
9817 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9818
9819/* ------------------------------ */
9820 .balign 128
9821.L_ALT_op_div_long: /* 0x9e */
9822/* File: arm64/alt_stub.S */
9823/*
9824 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9825 * any interesting requests and then jump to the real instruction
9826 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9827 */
9828 .extern MterpCheckBefore
9829 EXPORT_PC
9830 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9831 adr lr, artMterpAsmInstructionStart + (158 * 128) // Addr of primary handler.
9832 mov x0, xSELF
9833 add x1, xFP, #OFF_FP_SHADOWFRAME
9834 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9835
9836/* ------------------------------ */
9837 .balign 128
9838.L_ALT_op_rem_long: /* 0x9f */
9839/* File: arm64/alt_stub.S */
9840/*
9841 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9842 * any interesting requests and then jump to the real instruction
9843 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9844 */
9845 .extern MterpCheckBefore
9846 EXPORT_PC
9847 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9848 adr lr, artMterpAsmInstructionStart + (159 * 128) // Addr of primary handler.
9849 mov x0, xSELF
9850 add x1, xFP, #OFF_FP_SHADOWFRAME
9851 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9852
9853/* ------------------------------ */
9854 .balign 128
9855.L_ALT_op_and_long: /* 0xa0 */
9856/* File: arm64/alt_stub.S */
9857/*
9858 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9859 * any interesting requests and then jump to the real instruction
9860 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9861 */
9862 .extern MterpCheckBefore
9863 EXPORT_PC
9864 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9865 adr lr, artMterpAsmInstructionStart + (160 * 128) // Addr of primary handler.
9866 mov x0, xSELF
9867 add x1, xFP, #OFF_FP_SHADOWFRAME
9868 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9869
9870/* ------------------------------ */
9871 .balign 128
9872.L_ALT_op_or_long: /* 0xa1 */
9873/* File: arm64/alt_stub.S */
9874/*
9875 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9876 * any interesting requests and then jump to the real instruction
9877 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9878 */
9879 .extern MterpCheckBefore
9880 EXPORT_PC
9881 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9882 adr lr, artMterpAsmInstructionStart + (161 * 128) // Addr of primary handler.
9883 mov x0, xSELF
9884 add x1, xFP, #OFF_FP_SHADOWFRAME
9885 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9886
9887/* ------------------------------ */
9888 .balign 128
9889.L_ALT_op_xor_long: /* 0xa2 */
9890/* File: arm64/alt_stub.S */
9891/*
9892 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9893 * any interesting requests and then jump to the real instruction
9894 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9895 */
9896 .extern MterpCheckBefore
9897 EXPORT_PC
9898 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9899 adr lr, artMterpAsmInstructionStart + (162 * 128) // Addr of primary handler.
9900 mov x0, xSELF
9901 add x1, xFP, #OFF_FP_SHADOWFRAME
9902 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9903
9904/* ------------------------------ */
9905 .balign 128
9906.L_ALT_op_shl_long: /* 0xa3 */
9907/* File: arm64/alt_stub.S */
9908/*
9909 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9910 * any interesting requests and then jump to the real instruction
9911 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9912 */
9913 .extern MterpCheckBefore
9914 EXPORT_PC
9915 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9916 adr lr, artMterpAsmInstructionStart + (163 * 128) // Addr of primary handler.
9917 mov x0, xSELF
9918 add x1, xFP, #OFF_FP_SHADOWFRAME
9919 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9920
9921/* ------------------------------ */
9922 .balign 128
9923.L_ALT_op_shr_long: /* 0xa4 */
9924/* File: arm64/alt_stub.S */
9925/*
9926 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9927 * any interesting requests and then jump to the real instruction
9928 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9929 */
9930 .extern MterpCheckBefore
9931 EXPORT_PC
9932 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9933 adr lr, artMterpAsmInstructionStart + (164 * 128) // Addr of primary handler.
9934 mov x0, xSELF
9935 add x1, xFP, #OFF_FP_SHADOWFRAME
9936 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9937
9938/* ------------------------------ */
9939 .balign 128
9940.L_ALT_op_ushr_long: /* 0xa5 */
9941/* File: arm64/alt_stub.S */
9942/*
9943 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9944 * any interesting requests and then jump to the real instruction
9945 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9946 */
9947 .extern MterpCheckBefore
9948 EXPORT_PC
9949 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9950 adr lr, artMterpAsmInstructionStart + (165 * 128) // Addr of primary handler.
9951 mov x0, xSELF
9952 add x1, xFP, #OFF_FP_SHADOWFRAME
9953 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9954
9955/* ------------------------------ */
9956 .balign 128
9957.L_ALT_op_add_float: /* 0xa6 */
9958/* File: arm64/alt_stub.S */
9959/*
9960 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9961 * any interesting requests and then jump to the real instruction
9962 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9963 */
9964 .extern MterpCheckBefore
9965 EXPORT_PC
9966 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9967 adr lr, artMterpAsmInstructionStart + (166 * 128) // Addr of primary handler.
9968 mov x0, xSELF
9969 add x1, xFP, #OFF_FP_SHADOWFRAME
9970 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9971
9972/* ------------------------------ */
9973 .balign 128
9974.L_ALT_op_sub_float: /* 0xa7 */
9975/* File: arm64/alt_stub.S */
9976/*
9977 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9978 * any interesting requests and then jump to the real instruction
9979 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9980 */
9981 .extern MterpCheckBefore
9982 EXPORT_PC
9983 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9984 adr lr, artMterpAsmInstructionStart + (167 * 128) // Addr of primary handler.
9985 mov x0, xSELF
9986 add x1, xFP, #OFF_FP_SHADOWFRAME
9987 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
9988
9989/* ------------------------------ */
9990 .balign 128
9991.L_ALT_op_mul_float: /* 0xa8 */
9992/* File: arm64/alt_stub.S */
9993/*
9994 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9995 * any interesting requests and then jump to the real instruction
9996 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9997 */
9998 .extern MterpCheckBefore
9999 EXPORT_PC
10000 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10001 adr lr, artMterpAsmInstructionStart + (168 * 128) // Addr of primary handler.
10002 mov x0, xSELF
10003 add x1, xFP, #OFF_FP_SHADOWFRAME
10004 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10005
10006/* ------------------------------ */
10007 .balign 128
10008.L_ALT_op_div_float: /* 0xa9 */
10009/* File: arm64/alt_stub.S */
10010/*
10011 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10012 * any interesting requests and then jump to the real instruction
10013 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10014 */
10015 .extern MterpCheckBefore
10016 EXPORT_PC
10017 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10018 adr lr, artMterpAsmInstructionStart + (169 * 128) // Addr of primary handler.
10019 mov x0, xSELF
10020 add x1, xFP, #OFF_FP_SHADOWFRAME
10021 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10022
10023/* ------------------------------ */
10024 .balign 128
10025.L_ALT_op_rem_float: /* 0xaa */
10026/* File: arm64/alt_stub.S */
10027/*
10028 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10029 * any interesting requests and then jump to the real instruction
10030 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10031 */
10032 .extern MterpCheckBefore
10033 EXPORT_PC
10034 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10035 adr lr, artMterpAsmInstructionStart + (170 * 128) // Addr of primary handler.
10036 mov x0, xSELF
10037 add x1, xFP, #OFF_FP_SHADOWFRAME
10038 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10039
10040/* ------------------------------ */
10041 .balign 128
10042.L_ALT_op_add_double: /* 0xab */
10043/* File: arm64/alt_stub.S */
10044/*
10045 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10046 * any interesting requests and then jump to the real instruction
10047 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10048 */
10049 .extern MterpCheckBefore
10050 EXPORT_PC
10051 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10052 adr lr, artMterpAsmInstructionStart + (171 * 128) // Addr of primary handler.
10053 mov x0, xSELF
10054 add x1, xFP, #OFF_FP_SHADOWFRAME
10055 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10056
10057/* ------------------------------ */
10058 .balign 128
10059.L_ALT_op_sub_double: /* 0xac */
10060/* File: arm64/alt_stub.S */
10061/*
10062 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10063 * any interesting requests and then jump to the real instruction
10064 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10065 */
10066 .extern MterpCheckBefore
10067 EXPORT_PC
10068 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10069 adr lr, artMterpAsmInstructionStart + (172 * 128) // Addr of primary handler.
10070 mov x0, xSELF
10071 add x1, xFP, #OFF_FP_SHADOWFRAME
10072 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10073
10074/* ------------------------------ */
10075 .balign 128
10076.L_ALT_op_mul_double: /* 0xad */
10077/* File: arm64/alt_stub.S */
10078/*
10079 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10080 * any interesting requests and then jump to the real instruction
10081 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10082 */
10083 .extern MterpCheckBefore
10084 EXPORT_PC
10085 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10086 adr lr, artMterpAsmInstructionStart + (173 * 128) // Addr of primary handler.
10087 mov x0, xSELF
10088 add x1, xFP, #OFF_FP_SHADOWFRAME
10089 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10090
10091/* ------------------------------ */
10092 .balign 128
10093.L_ALT_op_div_double: /* 0xae */
10094/* File: arm64/alt_stub.S */
10095/*
10096 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10097 * any interesting requests and then jump to the real instruction
10098 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10099 */
10100 .extern MterpCheckBefore
10101 EXPORT_PC
10102 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10103 adr lr, artMterpAsmInstructionStart + (174 * 128) // Addr of primary handler.
10104 mov x0, xSELF
10105 add x1, xFP, #OFF_FP_SHADOWFRAME
10106 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10107
10108/* ------------------------------ */
10109 .balign 128
10110.L_ALT_op_rem_double: /* 0xaf */
10111/* File: arm64/alt_stub.S */
10112/*
10113 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10114 * any interesting requests and then jump to the real instruction
10115 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10116 */
10117 .extern MterpCheckBefore
10118 EXPORT_PC
10119 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10120 adr lr, artMterpAsmInstructionStart + (175 * 128) // Addr of primary handler.
10121 mov x0, xSELF
10122 add x1, xFP, #OFF_FP_SHADOWFRAME
10123 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10124
10125/* ------------------------------ */
10126 .balign 128
10127.L_ALT_op_add_int_2addr: /* 0xb0 */
10128/* File: arm64/alt_stub.S */
10129/*
10130 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10131 * any interesting requests and then jump to the real instruction
10132 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10133 */
10134 .extern MterpCheckBefore
10135 EXPORT_PC
10136 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10137 adr lr, artMterpAsmInstructionStart + (176 * 128) // Addr of primary handler.
10138 mov x0, xSELF
10139 add x1, xFP, #OFF_FP_SHADOWFRAME
10140 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10141
10142/* ------------------------------ */
10143 .balign 128
10144.L_ALT_op_sub_int_2addr: /* 0xb1 */
10145/* File: arm64/alt_stub.S */
10146/*
10147 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10148 * any interesting requests and then jump to the real instruction
10149 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10150 */
10151 .extern MterpCheckBefore
10152 EXPORT_PC
10153 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10154 adr lr, artMterpAsmInstructionStart + (177 * 128) // Addr of primary handler.
10155 mov x0, xSELF
10156 add x1, xFP, #OFF_FP_SHADOWFRAME
10157 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10158
10159/* ------------------------------ */
10160 .balign 128
10161.L_ALT_op_mul_int_2addr: /* 0xb2 */
10162/* File: arm64/alt_stub.S */
10163/*
10164 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10165 * any interesting requests and then jump to the real instruction
10166 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10167 */
10168 .extern MterpCheckBefore
10169 EXPORT_PC
10170 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10171 adr lr, artMterpAsmInstructionStart + (178 * 128) // Addr of primary handler.
10172 mov x0, xSELF
10173 add x1, xFP, #OFF_FP_SHADOWFRAME
10174 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10175
10176/* ------------------------------ */
10177 .balign 128
10178.L_ALT_op_div_int_2addr: /* 0xb3 */
10179/* File: arm64/alt_stub.S */
10180/*
10181 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10182 * any interesting requests and then jump to the real instruction
10183 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10184 */
10185 .extern MterpCheckBefore
10186 EXPORT_PC
10187 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10188 adr lr, artMterpAsmInstructionStart + (179 * 128) // Addr of primary handler.
10189 mov x0, xSELF
10190 add x1, xFP, #OFF_FP_SHADOWFRAME
10191 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10192
10193/* ------------------------------ */
10194 .balign 128
10195.L_ALT_op_rem_int_2addr: /* 0xb4 */
10196/* File: arm64/alt_stub.S */
10197/*
10198 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10199 * any interesting requests and then jump to the real instruction
10200 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10201 */
10202 .extern MterpCheckBefore
10203 EXPORT_PC
10204 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10205 adr lr, artMterpAsmInstructionStart + (180 * 128) // Addr of primary handler.
10206 mov x0, xSELF
10207 add x1, xFP, #OFF_FP_SHADOWFRAME
10208 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10209
10210/* ------------------------------ */
10211 .balign 128
10212.L_ALT_op_and_int_2addr: /* 0xb5 */
10213/* File: arm64/alt_stub.S */
10214/*
10215 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10216 * any interesting requests and then jump to the real instruction
10217 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10218 */
10219 .extern MterpCheckBefore
10220 EXPORT_PC
10221 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10222 adr lr, artMterpAsmInstructionStart + (181 * 128) // Addr of primary handler.
10223 mov x0, xSELF
10224 add x1, xFP, #OFF_FP_SHADOWFRAME
10225 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10226
10227/* ------------------------------ */
10228 .balign 128
10229.L_ALT_op_or_int_2addr: /* 0xb6 */
10230/* File: arm64/alt_stub.S */
10231/*
10232 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10233 * any interesting requests and then jump to the real instruction
10234 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10235 */
10236 .extern MterpCheckBefore
10237 EXPORT_PC
10238 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10239 adr lr, artMterpAsmInstructionStart + (182 * 128) // Addr of primary handler.
10240 mov x0, xSELF
10241 add x1, xFP, #OFF_FP_SHADOWFRAME
10242 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10243
10244/* ------------------------------ */
10245 .balign 128
10246.L_ALT_op_xor_int_2addr: /* 0xb7 */
10247/* File: arm64/alt_stub.S */
10248/*
10249 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10250 * any interesting requests and then jump to the real instruction
10251 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10252 */
10253 .extern MterpCheckBefore
10254 EXPORT_PC
10255 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10256 adr lr, artMterpAsmInstructionStart + (183 * 128) // Addr of primary handler.
10257 mov x0, xSELF
10258 add x1, xFP, #OFF_FP_SHADOWFRAME
10259 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10260
10261/* ------------------------------ */
10262 .balign 128
10263.L_ALT_op_shl_int_2addr: /* 0xb8 */
10264/* File: arm64/alt_stub.S */
10265/*
10266 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10267 * any interesting requests and then jump to the real instruction
10268 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10269 */
10270 .extern MterpCheckBefore
10271 EXPORT_PC
10272 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10273 adr lr, artMterpAsmInstructionStart + (184 * 128) // Addr of primary handler.
10274 mov x0, xSELF
10275 add x1, xFP, #OFF_FP_SHADOWFRAME
10276 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10277
10278/* ------------------------------ */
10279 .balign 128
10280.L_ALT_op_shr_int_2addr: /* 0xb9 */
10281/* File: arm64/alt_stub.S */
10282/*
10283 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10284 * any interesting requests and then jump to the real instruction
10285 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10286 */
10287 .extern MterpCheckBefore
10288 EXPORT_PC
10289 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10290 adr lr, artMterpAsmInstructionStart + (185 * 128) // Addr of primary handler.
10291 mov x0, xSELF
10292 add x1, xFP, #OFF_FP_SHADOWFRAME
10293 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10294
10295/* ------------------------------ */
10296 .balign 128
10297.L_ALT_op_ushr_int_2addr: /* 0xba */
10298/* File: arm64/alt_stub.S */
10299/*
10300 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10301 * any interesting requests and then jump to the real instruction
10302 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10303 */
10304 .extern MterpCheckBefore
10305 EXPORT_PC
10306 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10307 adr lr, artMterpAsmInstructionStart + (186 * 128) // Addr of primary handler.
10308 mov x0, xSELF
10309 add x1, xFP, #OFF_FP_SHADOWFRAME
10310 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10311
10312/* ------------------------------ */
10313 .balign 128
10314.L_ALT_op_add_long_2addr: /* 0xbb */
10315/* File: arm64/alt_stub.S */
10316/*
10317 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10318 * any interesting requests and then jump to the real instruction
10319 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10320 */
10321 .extern MterpCheckBefore
10322 EXPORT_PC
10323 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10324 adr lr, artMterpAsmInstructionStart + (187 * 128) // Addr of primary handler.
10325 mov x0, xSELF
10326 add x1, xFP, #OFF_FP_SHADOWFRAME
10327 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10328
10329/* ------------------------------ */
10330 .balign 128
10331.L_ALT_op_sub_long_2addr: /* 0xbc */
10332/* File: arm64/alt_stub.S */
10333/*
10334 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10335 * any interesting requests and then jump to the real instruction
10336 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10337 */
10338 .extern MterpCheckBefore
10339 EXPORT_PC
10340 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10341 adr lr, artMterpAsmInstructionStart + (188 * 128) // Addr of primary handler.
10342 mov x0, xSELF
10343 add x1, xFP, #OFF_FP_SHADOWFRAME
10344 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10345
10346/* ------------------------------ */
10347 .balign 128
10348.L_ALT_op_mul_long_2addr: /* 0xbd */
10349/* File: arm64/alt_stub.S */
10350/*
10351 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10352 * any interesting requests and then jump to the real instruction
10353 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10354 */
10355 .extern MterpCheckBefore
10356 EXPORT_PC
10357 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10358 adr lr, artMterpAsmInstructionStart + (189 * 128) // Addr of primary handler.
10359 mov x0, xSELF
10360 add x1, xFP, #OFF_FP_SHADOWFRAME
10361 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10362
10363/* ------------------------------ */
10364 .balign 128
10365.L_ALT_op_div_long_2addr: /* 0xbe */
10366/* File: arm64/alt_stub.S */
10367/*
10368 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10369 * any interesting requests and then jump to the real instruction
10370 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10371 */
10372 .extern MterpCheckBefore
10373 EXPORT_PC
10374 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10375 adr lr, artMterpAsmInstructionStart + (190 * 128) // Addr of primary handler.
10376 mov x0, xSELF
10377 add x1, xFP, #OFF_FP_SHADOWFRAME
10378 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10379
10380/* ------------------------------ */
10381 .balign 128
10382.L_ALT_op_rem_long_2addr: /* 0xbf */
10383/* File: arm64/alt_stub.S */
10384/*
10385 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10386 * any interesting requests and then jump to the real instruction
10387 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10388 */
10389 .extern MterpCheckBefore
10390 EXPORT_PC
10391 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10392 adr lr, artMterpAsmInstructionStart + (191 * 128) // Addr of primary handler.
10393 mov x0, xSELF
10394 add x1, xFP, #OFF_FP_SHADOWFRAME
10395 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10396
10397/* ------------------------------ */
10398 .balign 128
10399.L_ALT_op_and_long_2addr: /* 0xc0 */
10400/* File: arm64/alt_stub.S */
10401/*
10402 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10403 * any interesting requests and then jump to the real instruction
10404 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10405 */
10406 .extern MterpCheckBefore
10407 EXPORT_PC
10408 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10409 adr lr, artMterpAsmInstructionStart + (192 * 128) // Addr of primary handler.
10410 mov x0, xSELF
10411 add x1, xFP, #OFF_FP_SHADOWFRAME
10412 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10413
10414/* ------------------------------ */
10415 .balign 128
10416.L_ALT_op_or_long_2addr: /* 0xc1 */
10417/* File: arm64/alt_stub.S */
10418/*
10419 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10420 * any interesting requests and then jump to the real instruction
10421 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10422 */
10423 .extern MterpCheckBefore
10424 EXPORT_PC
10425 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10426 adr lr, artMterpAsmInstructionStart + (193 * 128) // Addr of primary handler.
10427 mov x0, xSELF
10428 add x1, xFP, #OFF_FP_SHADOWFRAME
10429 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10430
10431/* ------------------------------ */
10432 .balign 128
10433.L_ALT_op_xor_long_2addr: /* 0xc2 */
10434/* File: arm64/alt_stub.S */
10435/*
10436 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10437 * any interesting requests and then jump to the real instruction
10438 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10439 */
10440 .extern MterpCheckBefore
10441 EXPORT_PC
10442 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10443 adr lr, artMterpAsmInstructionStart + (194 * 128) // Addr of primary handler.
10444 mov x0, xSELF
10445 add x1, xFP, #OFF_FP_SHADOWFRAME
10446 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10447
10448/* ------------------------------ */
10449 .balign 128
10450.L_ALT_op_shl_long_2addr: /* 0xc3 */
10451/* File: arm64/alt_stub.S */
10452/*
10453 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10454 * any interesting requests and then jump to the real instruction
10455 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10456 */
10457 .extern MterpCheckBefore
10458 EXPORT_PC
10459 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10460 adr lr, artMterpAsmInstructionStart + (195 * 128) // Addr of primary handler.
10461 mov x0, xSELF
10462 add x1, xFP, #OFF_FP_SHADOWFRAME
10463 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10464
10465/* ------------------------------ */
10466 .balign 128
10467.L_ALT_op_shr_long_2addr: /* 0xc4 */
10468/* File: arm64/alt_stub.S */
10469/*
10470 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10471 * any interesting requests and then jump to the real instruction
10472 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10473 */
10474 .extern MterpCheckBefore
10475 EXPORT_PC
10476 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10477 adr lr, artMterpAsmInstructionStart + (196 * 128) // Addr of primary handler.
10478 mov x0, xSELF
10479 add x1, xFP, #OFF_FP_SHADOWFRAME
10480 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10481
10482/* ------------------------------ */
10483 .balign 128
10484.L_ALT_op_ushr_long_2addr: /* 0xc5 */
10485/* File: arm64/alt_stub.S */
10486/*
10487 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10488 * any interesting requests and then jump to the real instruction
10489 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10490 */
10491 .extern MterpCheckBefore
10492 EXPORT_PC
10493 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10494 adr lr, artMterpAsmInstructionStart + (197 * 128) // Addr of primary handler.
10495 mov x0, xSELF
10496 add x1, xFP, #OFF_FP_SHADOWFRAME
10497 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10498
10499/* ------------------------------ */
10500 .balign 128
10501.L_ALT_op_add_float_2addr: /* 0xc6 */
10502/* File: arm64/alt_stub.S */
10503/*
10504 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10505 * any interesting requests and then jump to the real instruction
10506 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10507 */
10508 .extern MterpCheckBefore
10509 EXPORT_PC
10510 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10511 adr lr, artMterpAsmInstructionStart + (198 * 128) // Addr of primary handler.
10512 mov x0, xSELF
10513 add x1, xFP, #OFF_FP_SHADOWFRAME
10514 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10515
10516/* ------------------------------ */
10517 .balign 128
10518.L_ALT_op_sub_float_2addr: /* 0xc7 */
10519/* File: arm64/alt_stub.S */
10520/*
10521 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10522 * any interesting requests and then jump to the real instruction
10523 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10524 */
10525 .extern MterpCheckBefore
10526 EXPORT_PC
10527 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10528 adr lr, artMterpAsmInstructionStart + (199 * 128) // Addr of primary handler.
10529 mov x0, xSELF
10530 add x1, xFP, #OFF_FP_SHADOWFRAME
10531 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10532
10533/* ------------------------------ */
10534 .balign 128
10535.L_ALT_op_mul_float_2addr: /* 0xc8 */
10536/* File: arm64/alt_stub.S */
10537/*
10538 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10539 * any interesting requests and then jump to the real instruction
10540 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10541 */
10542 .extern MterpCheckBefore
10543 EXPORT_PC
10544 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10545 adr lr, artMterpAsmInstructionStart + (200 * 128) // Addr of primary handler.
10546 mov x0, xSELF
10547 add x1, xFP, #OFF_FP_SHADOWFRAME
10548 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10549
10550/* ------------------------------ */
10551 .balign 128
10552.L_ALT_op_div_float_2addr: /* 0xc9 */
10553/* File: arm64/alt_stub.S */
10554/*
10555 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10556 * any interesting requests and then jump to the real instruction
10557 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10558 */
10559 .extern MterpCheckBefore
10560 EXPORT_PC
10561 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10562 adr lr, artMterpAsmInstructionStart + (201 * 128) // Addr of primary handler.
10563 mov x0, xSELF
10564 add x1, xFP, #OFF_FP_SHADOWFRAME
10565 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10566
10567/* ------------------------------ */
10568 .balign 128
10569.L_ALT_op_rem_float_2addr: /* 0xca */
10570/* File: arm64/alt_stub.S */
10571/*
10572 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10573 * any interesting requests and then jump to the real instruction
10574 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10575 */
10576 .extern MterpCheckBefore
10577 EXPORT_PC
10578 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10579 adr lr, artMterpAsmInstructionStart + (202 * 128) // Addr of primary handler.
10580 mov x0, xSELF
10581 add x1, xFP, #OFF_FP_SHADOWFRAME
10582 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10583
10584/* ------------------------------ */
10585 .balign 128
10586.L_ALT_op_add_double_2addr: /* 0xcb */
10587/* File: arm64/alt_stub.S */
10588/*
10589 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10590 * any interesting requests and then jump to the real instruction
10591 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10592 */
10593 .extern MterpCheckBefore
10594 EXPORT_PC
10595 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10596 adr lr, artMterpAsmInstructionStart + (203 * 128) // Addr of primary handler.
10597 mov x0, xSELF
10598 add x1, xFP, #OFF_FP_SHADOWFRAME
10599 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10600
10601/* ------------------------------ */
10602 .balign 128
10603.L_ALT_op_sub_double_2addr: /* 0xcc */
10604/* File: arm64/alt_stub.S */
10605/*
10606 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10607 * any interesting requests and then jump to the real instruction
10608 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10609 */
10610 .extern MterpCheckBefore
10611 EXPORT_PC
10612 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10613 adr lr, artMterpAsmInstructionStart + (204 * 128) // Addr of primary handler.
10614 mov x0, xSELF
10615 add x1, xFP, #OFF_FP_SHADOWFRAME
10616 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10617
10618/* ------------------------------ */
10619 .balign 128
10620.L_ALT_op_mul_double_2addr: /* 0xcd */
10621/* File: arm64/alt_stub.S */
10622/*
10623 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10624 * any interesting requests and then jump to the real instruction
10625 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10626 */
10627 .extern MterpCheckBefore
10628 EXPORT_PC
10629 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10630 adr lr, artMterpAsmInstructionStart + (205 * 128) // Addr of primary handler.
10631 mov x0, xSELF
10632 add x1, xFP, #OFF_FP_SHADOWFRAME
10633 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10634
10635/* ------------------------------ */
10636 .balign 128
10637.L_ALT_op_div_double_2addr: /* 0xce */
10638/* File: arm64/alt_stub.S */
10639/*
10640 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10641 * any interesting requests and then jump to the real instruction
10642 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10643 */
10644 .extern MterpCheckBefore
10645 EXPORT_PC
10646 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10647 adr lr, artMterpAsmInstructionStart + (206 * 128) // Addr of primary handler.
10648 mov x0, xSELF
10649 add x1, xFP, #OFF_FP_SHADOWFRAME
10650 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10651
10652/* ------------------------------ */
10653 .balign 128
10654.L_ALT_op_rem_double_2addr: /* 0xcf */
10655/* File: arm64/alt_stub.S */
10656/*
10657 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10658 * any interesting requests and then jump to the real instruction
10659 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10660 */
10661 .extern MterpCheckBefore
10662 EXPORT_PC
10663 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10664 adr lr, artMterpAsmInstructionStart + (207 * 128) // Addr of primary handler.
10665 mov x0, xSELF
10666 add x1, xFP, #OFF_FP_SHADOWFRAME
10667 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10668
10669/* ------------------------------ */
10670 .balign 128
10671.L_ALT_op_add_int_lit16: /* 0xd0 */
10672/* File: arm64/alt_stub.S */
10673/*
10674 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10675 * any interesting requests and then jump to the real instruction
10676 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10677 */
10678 .extern MterpCheckBefore
10679 EXPORT_PC
10680 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10681 adr lr, artMterpAsmInstructionStart + (208 * 128) // Addr of primary handler.
10682 mov x0, xSELF
10683 add x1, xFP, #OFF_FP_SHADOWFRAME
10684 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10685
10686/* ------------------------------ */
10687 .balign 128
10688.L_ALT_op_rsub_int: /* 0xd1 */
10689/* File: arm64/alt_stub.S */
10690/*
10691 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10692 * any interesting requests and then jump to the real instruction
10693 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10694 */
10695 .extern MterpCheckBefore
10696 EXPORT_PC
10697 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10698 adr lr, artMterpAsmInstructionStart + (209 * 128) // Addr of primary handler.
10699 mov x0, xSELF
10700 add x1, xFP, #OFF_FP_SHADOWFRAME
10701 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10702
10703/* ------------------------------ */
10704 .balign 128
10705.L_ALT_op_mul_int_lit16: /* 0xd2 */
10706/* File: arm64/alt_stub.S */
10707/*
10708 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10709 * any interesting requests and then jump to the real instruction
10710 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10711 */
10712 .extern MterpCheckBefore
10713 EXPORT_PC
10714 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10715 adr lr, artMterpAsmInstructionStart + (210 * 128) // Addr of primary handler.
10716 mov x0, xSELF
10717 add x1, xFP, #OFF_FP_SHADOWFRAME
10718 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10719
10720/* ------------------------------ */
10721 .balign 128
10722.L_ALT_op_div_int_lit16: /* 0xd3 */
10723/* File: arm64/alt_stub.S */
10724/*
10725 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10726 * any interesting requests and then jump to the real instruction
10727 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10728 */
10729 .extern MterpCheckBefore
10730 EXPORT_PC
10731 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10732 adr lr, artMterpAsmInstructionStart + (211 * 128) // Addr of primary handler.
10733 mov x0, xSELF
10734 add x1, xFP, #OFF_FP_SHADOWFRAME
10735 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10736
10737/* ------------------------------ */
10738 .balign 128
10739.L_ALT_op_rem_int_lit16: /* 0xd4 */
10740/* File: arm64/alt_stub.S */
10741/*
10742 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10743 * any interesting requests and then jump to the real instruction
10744 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10745 */
10746 .extern MterpCheckBefore
10747 EXPORT_PC
10748 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10749 adr lr, artMterpAsmInstructionStart + (212 * 128) // Addr of primary handler.
10750 mov x0, xSELF
10751 add x1, xFP, #OFF_FP_SHADOWFRAME
10752 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10753
10754/* ------------------------------ */
10755 .balign 128
10756.L_ALT_op_and_int_lit16: /* 0xd5 */
10757/* File: arm64/alt_stub.S */
10758/*
10759 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10760 * any interesting requests and then jump to the real instruction
10761 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10762 */
10763 .extern MterpCheckBefore
10764 EXPORT_PC
10765 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10766 adr lr, artMterpAsmInstructionStart + (213 * 128) // Addr of primary handler.
10767 mov x0, xSELF
10768 add x1, xFP, #OFF_FP_SHADOWFRAME
10769 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10770
10771/* ------------------------------ */
10772 .balign 128
10773.L_ALT_op_or_int_lit16: /* 0xd6 */
10774/* File: arm64/alt_stub.S */
10775/*
10776 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10777 * any interesting requests and then jump to the real instruction
10778 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10779 */
10780 .extern MterpCheckBefore
10781 EXPORT_PC
10782 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10783 adr lr, artMterpAsmInstructionStart + (214 * 128) // Addr of primary handler.
10784 mov x0, xSELF
10785 add x1, xFP, #OFF_FP_SHADOWFRAME
10786 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10787
10788/* ------------------------------ */
10789 .balign 128
10790.L_ALT_op_xor_int_lit16: /* 0xd7 */
10791/* File: arm64/alt_stub.S */
10792/*
10793 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10794 * any interesting requests and then jump to the real instruction
10795 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10796 */
10797 .extern MterpCheckBefore
10798 EXPORT_PC
10799 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10800 adr lr, artMterpAsmInstructionStart + (215 * 128) // Addr of primary handler.
10801 mov x0, xSELF
10802 add x1, xFP, #OFF_FP_SHADOWFRAME
10803 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10804
10805/* ------------------------------ */
10806 .balign 128
10807.L_ALT_op_add_int_lit8: /* 0xd8 */
10808/* File: arm64/alt_stub.S */
10809/*
10810 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10811 * any interesting requests and then jump to the real instruction
10812 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10813 */
10814 .extern MterpCheckBefore
10815 EXPORT_PC
10816 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10817 adr lr, artMterpAsmInstructionStart + (216 * 128) // Addr of primary handler.
10818 mov x0, xSELF
10819 add x1, xFP, #OFF_FP_SHADOWFRAME
10820 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10821
10822/* ------------------------------ */
10823 .balign 128
10824.L_ALT_op_rsub_int_lit8: /* 0xd9 */
10825/* File: arm64/alt_stub.S */
10826/*
10827 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10828 * any interesting requests and then jump to the real instruction
10829 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10830 */
10831 .extern MterpCheckBefore
10832 EXPORT_PC
10833 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10834 adr lr, artMterpAsmInstructionStart + (217 * 128) // Addr of primary handler.
10835 mov x0, xSELF
10836 add x1, xFP, #OFF_FP_SHADOWFRAME
10837 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10838
10839/* ------------------------------ */
10840 .balign 128
10841.L_ALT_op_mul_int_lit8: /* 0xda */
10842/* File: arm64/alt_stub.S */
10843/*
10844 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10845 * any interesting requests and then jump to the real instruction
10846 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10847 */
10848 .extern MterpCheckBefore
10849 EXPORT_PC
10850 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10851 adr lr, artMterpAsmInstructionStart + (218 * 128) // Addr of primary handler.
10852 mov x0, xSELF
10853 add x1, xFP, #OFF_FP_SHADOWFRAME
10854 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10855
10856/* ------------------------------ */
10857 .balign 128
10858.L_ALT_op_div_int_lit8: /* 0xdb */
10859/* File: arm64/alt_stub.S */
10860/*
10861 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10862 * any interesting requests and then jump to the real instruction
10863 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10864 */
10865 .extern MterpCheckBefore
10866 EXPORT_PC
10867 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10868 adr lr, artMterpAsmInstructionStart + (219 * 128) // Addr of primary handler.
10869 mov x0, xSELF
10870 add x1, xFP, #OFF_FP_SHADOWFRAME
10871 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10872
10873/* ------------------------------ */
10874 .balign 128
10875.L_ALT_op_rem_int_lit8: /* 0xdc */
10876/* File: arm64/alt_stub.S */
10877/*
10878 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10879 * any interesting requests and then jump to the real instruction
10880 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10881 */
10882 .extern MterpCheckBefore
10883 EXPORT_PC
10884 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10885 adr lr, artMterpAsmInstructionStart + (220 * 128) // Addr of primary handler.
10886 mov x0, xSELF
10887 add x1, xFP, #OFF_FP_SHADOWFRAME
10888 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10889
10890/* ------------------------------ */
10891 .balign 128
10892.L_ALT_op_and_int_lit8: /* 0xdd */
10893/* File: arm64/alt_stub.S */
10894/*
10895 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10896 * any interesting requests and then jump to the real instruction
10897 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10898 */
10899 .extern MterpCheckBefore
10900 EXPORT_PC
10901 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10902 adr lr, artMterpAsmInstructionStart + (221 * 128) // Addr of primary handler.
10903 mov x0, xSELF
10904 add x1, xFP, #OFF_FP_SHADOWFRAME
10905 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10906
10907/* ------------------------------ */
10908 .balign 128
10909.L_ALT_op_or_int_lit8: /* 0xde */
10910/* File: arm64/alt_stub.S */
10911/*
10912 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10913 * any interesting requests and then jump to the real instruction
10914 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10915 */
10916 .extern MterpCheckBefore
10917 EXPORT_PC
10918 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10919 adr lr, artMterpAsmInstructionStart + (222 * 128) // Addr of primary handler.
10920 mov x0, xSELF
10921 add x1, xFP, #OFF_FP_SHADOWFRAME
10922 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10923
10924/* ------------------------------ */
10925 .balign 128
10926.L_ALT_op_xor_int_lit8: /* 0xdf */
10927/* File: arm64/alt_stub.S */
10928/*
10929 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10930 * any interesting requests and then jump to the real instruction
10931 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10932 */
10933 .extern MterpCheckBefore
10934 EXPORT_PC
10935 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10936 adr lr, artMterpAsmInstructionStart + (223 * 128) // Addr of primary handler.
10937 mov x0, xSELF
10938 add x1, xFP, #OFF_FP_SHADOWFRAME
10939 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10940
10941/* ------------------------------ */
10942 .balign 128
10943.L_ALT_op_shl_int_lit8: /* 0xe0 */
10944/* File: arm64/alt_stub.S */
10945/*
10946 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10947 * any interesting requests and then jump to the real instruction
10948 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10949 */
10950 .extern MterpCheckBefore
10951 EXPORT_PC
10952 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10953 adr lr, artMterpAsmInstructionStart + (224 * 128) // Addr of primary handler.
10954 mov x0, xSELF
10955 add x1, xFP, #OFF_FP_SHADOWFRAME
10956 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10957
10958/* ------------------------------ */
10959 .balign 128
10960.L_ALT_op_shr_int_lit8: /* 0xe1 */
10961/* File: arm64/alt_stub.S */
10962/*
10963 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10964 * any interesting requests and then jump to the real instruction
10965 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10966 */
10967 .extern MterpCheckBefore
10968 EXPORT_PC
10969 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10970 adr lr, artMterpAsmInstructionStart + (225 * 128) // Addr of primary handler.
10971 mov x0, xSELF
10972 add x1, xFP, #OFF_FP_SHADOWFRAME
10973 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10974
10975/* ------------------------------ */
10976 .balign 128
10977.L_ALT_op_ushr_int_lit8: /* 0xe2 */
10978/* File: arm64/alt_stub.S */
10979/*
10980 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10981 * any interesting requests and then jump to the real instruction
10982 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10983 */
10984 .extern MterpCheckBefore
10985 EXPORT_PC
10986 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10987 adr lr, artMterpAsmInstructionStart + (226 * 128) // Addr of primary handler.
10988 mov x0, xSELF
10989 add x1, xFP, #OFF_FP_SHADOWFRAME
10990 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
10991
10992/* ------------------------------ */
10993 .balign 128
10994.L_ALT_op_iget_quick: /* 0xe3 */
10995/* File: arm64/alt_stub.S */
10996/*
10997 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10998 * any interesting requests and then jump to the real instruction
10999 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11000 */
11001 .extern MterpCheckBefore
11002 EXPORT_PC
11003 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11004 adr lr, artMterpAsmInstructionStart + (227 * 128) // Addr of primary handler.
11005 mov x0, xSELF
11006 add x1, xFP, #OFF_FP_SHADOWFRAME
11007 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11008
11009/* ------------------------------ */
11010 .balign 128
11011.L_ALT_op_iget_wide_quick: /* 0xe4 */
11012/* File: arm64/alt_stub.S */
11013/*
11014 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11015 * any interesting requests and then jump to the real instruction
11016 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11017 */
11018 .extern MterpCheckBefore
11019 EXPORT_PC
11020 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11021 adr lr, artMterpAsmInstructionStart + (228 * 128) // Addr of primary handler.
11022 mov x0, xSELF
11023 add x1, xFP, #OFF_FP_SHADOWFRAME
11024 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11025
11026/* ------------------------------ */
11027 .balign 128
11028.L_ALT_op_iget_object_quick: /* 0xe5 */
11029/* File: arm64/alt_stub.S */
11030/*
11031 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11032 * any interesting requests and then jump to the real instruction
11033 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11034 */
11035 .extern MterpCheckBefore
11036 EXPORT_PC
11037 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11038 adr lr, artMterpAsmInstructionStart + (229 * 128) // Addr of primary handler.
11039 mov x0, xSELF
11040 add x1, xFP, #OFF_FP_SHADOWFRAME
11041 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11042
11043/* ------------------------------ */
11044 .balign 128
11045.L_ALT_op_iput_quick: /* 0xe6 */
11046/* File: arm64/alt_stub.S */
11047/*
11048 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11049 * any interesting requests and then jump to the real instruction
11050 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11051 */
11052 .extern MterpCheckBefore
11053 EXPORT_PC
11054 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11055 adr lr, artMterpAsmInstructionStart + (230 * 128) // Addr of primary handler.
11056 mov x0, xSELF
11057 add x1, xFP, #OFF_FP_SHADOWFRAME
11058 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11059
11060/* ------------------------------ */
11061 .balign 128
11062.L_ALT_op_iput_wide_quick: /* 0xe7 */
11063/* File: arm64/alt_stub.S */
11064/*
11065 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11066 * any interesting requests and then jump to the real instruction
11067 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11068 */
11069 .extern MterpCheckBefore
11070 EXPORT_PC
11071 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11072 adr lr, artMterpAsmInstructionStart + (231 * 128) // Addr of primary handler.
11073 mov x0, xSELF
11074 add x1, xFP, #OFF_FP_SHADOWFRAME
11075 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11076
11077/* ------------------------------ */
11078 .balign 128
11079.L_ALT_op_iput_object_quick: /* 0xe8 */
11080/* File: arm64/alt_stub.S */
11081/*
11082 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11083 * any interesting requests and then jump to the real instruction
11084 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11085 */
11086 .extern MterpCheckBefore
11087 EXPORT_PC
11088 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11089 adr lr, artMterpAsmInstructionStart + (232 * 128) // Addr of primary handler.
11090 mov x0, xSELF
11091 add x1, xFP, #OFF_FP_SHADOWFRAME
11092 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11093
11094/* ------------------------------ */
11095 .balign 128
11096.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11097/* File: arm64/alt_stub.S */
11098/*
11099 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11100 * any interesting requests and then jump to the real instruction
11101 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11102 */
11103 .extern MterpCheckBefore
11104 EXPORT_PC
11105 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11106 adr lr, artMterpAsmInstructionStart + (233 * 128) // Addr of primary handler.
11107 mov x0, xSELF
11108 add x1, xFP, #OFF_FP_SHADOWFRAME
11109 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11110
11111/* ------------------------------ */
11112 .balign 128
11113.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11114/* File: arm64/alt_stub.S */
11115/*
11116 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11117 * any interesting requests and then jump to the real instruction
11118 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11119 */
11120 .extern MterpCheckBefore
11121 EXPORT_PC
11122 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11123 adr lr, artMterpAsmInstructionStart + (234 * 128) // Addr of primary handler.
11124 mov x0, xSELF
11125 add x1, xFP, #OFF_FP_SHADOWFRAME
11126 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11127
11128/* ------------------------------ */
11129 .balign 128
11130.L_ALT_op_iput_boolean_quick: /* 0xeb */
11131/* File: arm64/alt_stub.S */
11132/*
11133 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11134 * any interesting requests and then jump to the real instruction
11135 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11136 */
11137 .extern MterpCheckBefore
11138 EXPORT_PC
11139 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11140 adr lr, artMterpAsmInstructionStart + (235 * 128) // Addr of primary handler.
11141 mov x0, xSELF
11142 add x1, xFP, #OFF_FP_SHADOWFRAME
11143 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11144
11145/* ------------------------------ */
11146 .balign 128
11147.L_ALT_op_iput_byte_quick: /* 0xec */
11148/* File: arm64/alt_stub.S */
11149/*
11150 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11151 * any interesting requests and then jump to the real instruction
11152 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11153 */
11154 .extern MterpCheckBefore
11155 EXPORT_PC
11156 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11157 adr lr, artMterpAsmInstructionStart + (236 * 128) // Addr of primary handler.
11158 mov x0, xSELF
11159 add x1, xFP, #OFF_FP_SHADOWFRAME
11160 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11161
11162/* ------------------------------ */
11163 .balign 128
11164.L_ALT_op_iput_char_quick: /* 0xed */
11165/* File: arm64/alt_stub.S */
11166/*
11167 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11168 * any interesting requests and then jump to the real instruction
11169 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11170 */
11171 .extern MterpCheckBefore
11172 EXPORT_PC
11173 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11174 adr lr, artMterpAsmInstructionStart + (237 * 128) // Addr of primary handler.
11175 mov x0, xSELF
11176 add x1, xFP, #OFF_FP_SHADOWFRAME
11177 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11178
11179/* ------------------------------ */
11180 .balign 128
11181.L_ALT_op_iput_short_quick: /* 0xee */
11182/* File: arm64/alt_stub.S */
11183/*
11184 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11185 * any interesting requests and then jump to the real instruction
11186 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11187 */
11188 .extern MterpCheckBefore
11189 EXPORT_PC
11190 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11191 adr lr, artMterpAsmInstructionStart + (238 * 128) // Addr of primary handler.
11192 mov x0, xSELF
11193 add x1, xFP, #OFF_FP_SHADOWFRAME
11194 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11195
11196/* ------------------------------ */
11197 .balign 128
11198.L_ALT_op_iget_boolean_quick: /* 0xef */
11199/* File: arm64/alt_stub.S */
11200/*
11201 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11202 * any interesting requests and then jump to the real instruction
11203 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11204 */
11205 .extern MterpCheckBefore
11206 EXPORT_PC
11207 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11208 adr lr, artMterpAsmInstructionStart + (239 * 128) // Addr of primary handler.
11209 mov x0, xSELF
11210 add x1, xFP, #OFF_FP_SHADOWFRAME
11211 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11212
11213/* ------------------------------ */
11214 .balign 128
11215.L_ALT_op_iget_byte_quick: /* 0xf0 */
11216/* File: arm64/alt_stub.S */
11217/*
11218 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11219 * any interesting requests and then jump to the real instruction
11220 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11221 */
11222 .extern MterpCheckBefore
11223 EXPORT_PC
11224 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11225 adr lr, artMterpAsmInstructionStart + (240 * 128) // Addr of primary handler.
11226 mov x0, xSELF
11227 add x1, xFP, #OFF_FP_SHADOWFRAME
11228 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11229
11230/* ------------------------------ */
11231 .balign 128
11232.L_ALT_op_iget_char_quick: /* 0xf1 */
11233/* File: arm64/alt_stub.S */
11234/*
11235 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11236 * any interesting requests and then jump to the real instruction
11237 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11238 */
11239 .extern MterpCheckBefore
11240 EXPORT_PC
11241 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11242 adr lr, artMterpAsmInstructionStart + (241 * 128) // Addr of primary handler.
11243 mov x0, xSELF
11244 add x1, xFP, #OFF_FP_SHADOWFRAME
11245 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11246
11247/* ------------------------------ */
11248 .balign 128
11249.L_ALT_op_iget_short_quick: /* 0xf2 */
11250/* File: arm64/alt_stub.S */
11251/*
11252 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11253 * any interesting requests and then jump to the real instruction
11254 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11255 */
11256 .extern MterpCheckBefore
11257 EXPORT_PC
11258 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11259 adr lr, artMterpAsmInstructionStart + (242 * 128) // Addr of primary handler.
11260 mov x0, xSELF
11261 add x1, xFP, #OFF_FP_SHADOWFRAME
11262 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11263
11264/* ------------------------------ */
11265 .balign 128
11266.L_ALT_op_invoke_lambda: /* 0xf3 */
11267/* File: arm64/alt_stub.S */
11268/*
11269 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11270 * any interesting requests and then jump to the real instruction
11271 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11272 */
11273 .extern MterpCheckBefore
11274 EXPORT_PC
11275 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11276 adr lr, artMterpAsmInstructionStart + (243 * 128) // Addr of primary handler.
11277 mov x0, xSELF
11278 add x1, xFP, #OFF_FP_SHADOWFRAME
11279 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11280
11281/* ------------------------------ */
11282 .balign 128
11283.L_ALT_op_unused_f4: /* 0xf4 */
11284/* File: arm64/alt_stub.S */
11285/*
11286 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11287 * any interesting requests and then jump to the real instruction
11288 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11289 */
11290 .extern MterpCheckBefore
11291 EXPORT_PC
11292 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11293 adr lr, artMterpAsmInstructionStart + (244 * 128) // Addr of primary handler.
11294 mov x0, xSELF
11295 add x1, xFP, #OFF_FP_SHADOWFRAME
11296 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11297
11298/* ------------------------------ */
11299 .balign 128
11300.L_ALT_op_capture_variable: /* 0xf5 */
11301/* File: arm64/alt_stub.S */
11302/*
11303 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11304 * any interesting requests and then jump to the real instruction
11305 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11306 */
11307 .extern MterpCheckBefore
11308 EXPORT_PC
11309 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11310 adr lr, artMterpAsmInstructionStart + (245 * 128) // Addr of primary handler.
11311 mov x0, xSELF
11312 add x1, xFP, #OFF_FP_SHADOWFRAME
11313 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11314
11315/* ------------------------------ */
11316 .balign 128
11317.L_ALT_op_create_lambda: /* 0xf6 */
11318/* File: arm64/alt_stub.S */
11319/*
11320 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11321 * any interesting requests and then jump to the real instruction
11322 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11323 */
11324 .extern MterpCheckBefore
11325 EXPORT_PC
11326 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11327 adr lr, artMterpAsmInstructionStart + (246 * 128) // Addr of primary handler.
11328 mov x0, xSELF
11329 add x1, xFP, #OFF_FP_SHADOWFRAME
11330 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11331
11332/* ------------------------------ */
11333 .balign 128
11334.L_ALT_op_liberate_variable: /* 0xf7 */
11335/* File: arm64/alt_stub.S */
11336/*
11337 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11338 * any interesting requests and then jump to the real instruction
11339 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11340 */
11341 .extern MterpCheckBefore
11342 EXPORT_PC
11343 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11344 adr lr, artMterpAsmInstructionStart + (247 * 128) // Addr of primary handler.
11345 mov x0, xSELF
11346 add x1, xFP, #OFF_FP_SHADOWFRAME
11347 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11348
11349/* ------------------------------ */
11350 .balign 128
11351.L_ALT_op_box_lambda: /* 0xf8 */
11352/* File: arm64/alt_stub.S */
11353/*
11354 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11355 * any interesting requests and then jump to the real instruction
11356 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11357 */
11358 .extern MterpCheckBefore
11359 EXPORT_PC
11360 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11361 adr lr, artMterpAsmInstructionStart + (248 * 128) // Addr of primary handler.
11362 mov x0, xSELF
11363 add x1, xFP, #OFF_FP_SHADOWFRAME
11364 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11365
11366/* ------------------------------ */
11367 .balign 128
11368.L_ALT_op_unbox_lambda: /* 0xf9 */
11369/* File: arm64/alt_stub.S */
11370/*
11371 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11372 * any interesting requests and then jump to the real instruction
11373 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11374 */
11375 .extern MterpCheckBefore
11376 EXPORT_PC
11377 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11378 adr lr, artMterpAsmInstructionStart + (249 * 128) // Addr of primary handler.
11379 mov x0, xSELF
11380 add x1, xFP, #OFF_FP_SHADOWFRAME
11381 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11382
11383/* ------------------------------ */
11384 .balign 128
11385.L_ALT_op_unused_fa: /* 0xfa */
11386/* File: arm64/alt_stub.S */
11387/*
11388 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11389 * any interesting requests and then jump to the real instruction
11390 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11391 */
11392 .extern MterpCheckBefore
11393 EXPORT_PC
11394 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11395 adr lr, artMterpAsmInstructionStart + (250 * 128) // Addr of primary handler.
11396 mov x0, xSELF
11397 add x1, xFP, #OFF_FP_SHADOWFRAME
11398 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11399
11400/* ------------------------------ */
11401 .balign 128
11402.L_ALT_op_unused_fb: /* 0xfb */
11403/* File: arm64/alt_stub.S */
11404/*
11405 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11406 * any interesting requests and then jump to the real instruction
11407 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11408 */
11409 .extern MterpCheckBefore
11410 EXPORT_PC
11411 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11412 adr lr, artMterpAsmInstructionStart + (251 * 128) // Addr of primary handler.
11413 mov x0, xSELF
11414 add x1, xFP, #OFF_FP_SHADOWFRAME
11415 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11416
11417/* ------------------------------ */
11418 .balign 128
11419.L_ALT_op_unused_fc: /* 0xfc */
11420/* File: arm64/alt_stub.S */
11421/*
11422 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11423 * any interesting requests and then jump to the real instruction
11424 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11425 */
11426 .extern MterpCheckBefore
11427 EXPORT_PC
11428 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11429 adr lr, artMterpAsmInstructionStart + (252 * 128) // Addr of primary handler.
11430 mov x0, xSELF
11431 add x1, xFP, #OFF_FP_SHADOWFRAME
11432 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11433
11434/* ------------------------------ */
11435 .balign 128
11436.L_ALT_op_unused_fd: /* 0xfd */
11437/* File: arm64/alt_stub.S */
11438/*
11439 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11440 * any interesting requests and then jump to the real instruction
11441 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11442 */
11443 .extern MterpCheckBefore
11444 EXPORT_PC
11445 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11446 adr lr, artMterpAsmInstructionStart + (253 * 128) // Addr of primary handler.
11447 mov x0, xSELF
11448 add x1, xFP, #OFF_FP_SHADOWFRAME
11449 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11450
11451/* ------------------------------ */
11452 .balign 128
11453.L_ALT_op_unused_fe: /* 0xfe */
11454/* File: arm64/alt_stub.S */
11455/*
11456 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11457 * any interesting requests and then jump to the real instruction
11458 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11459 */
11460 .extern MterpCheckBefore
11461 EXPORT_PC
11462 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11463 adr lr, artMterpAsmInstructionStart + (254 * 128) // Addr of primary handler.
11464 mov x0, xSELF
11465 add x1, xFP, #OFF_FP_SHADOWFRAME
11466 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11467
11468/* ------------------------------ */
11469 .balign 128
11470.L_ALT_op_unused_ff: /* 0xff */
11471/* File: arm64/alt_stub.S */
11472/*
11473 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11474 * any interesting requests and then jump to the real instruction
11475 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11476 */
11477 .extern MterpCheckBefore
11478 EXPORT_PC
11479 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11480 adr lr, artMterpAsmInstructionStart + (255 * 128) // Addr of primary handler.
11481 mov x0, xSELF
11482 add x1, xFP, #OFF_FP_SHADOWFRAME
11483 b MterpCheckBefore // (self, shadow_frame) Note: tail call.
11484
11485 .balign 128
11486 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
11487 .global artMterpAsmAltInstructionEnd
11488artMterpAsmAltInstructionEnd:
11489/* File: arm64/footer.S */
11490/*
11491 * ===========================================================================
11492 * Common subroutines and data
11493 * ===========================================================================
11494 */
11495
11496
11497/*
11498 * We've detected a condition that will result in an exception, but the exception
11499 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
11500 * TUNING: for consistency, we may want to just go ahead and handle these here.
11501 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011502common_errDivideByZero:
11503 EXPORT_PC
11504#if MTERP_LOGGING
11505 mov x0, xSELF
11506 add x1, xFP, #OFF_FP_SHADOWFRAME
11507 bl MterpLogDivideByZeroException
11508#endif
11509 b MterpCommonFallback
11510
11511common_errArrayIndex:
11512 EXPORT_PC
11513#if MTERP_LOGGING
11514 mov x0, xSELF
11515 add x1, xFP, #OFF_FP_SHADOWFRAME
11516 bl MterpLogArrayIndexException
11517#endif
11518 b MterpCommonFallback
11519
11520common_errNegativeArraySize:
11521 EXPORT_PC
11522#if MTERP_LOGGING
11523 mov x0, xSELF
11524 add x1, xFP, #OFF_FP_SHADOWFRAME
11525 bl MterpLogNegativeArraySizeException
11526#endif
11527 b MterpCommonFallback
11528
11529common_errNoSuchMethod:
11530 EXPORT_PC
11531#if MTERP_LOGGING
11532 mov x0, xSELF
11533 add x1, xFP, #OFF_FP_SHADOWFRAME
11534 bl MterpLogNoSuchMethodException
11535#endif
11536 b MterpCommonFallback
11537
11538common_errNullObject:
11539 EXPORT_PC
11540#if MTERP_LOGGING
11541 mov x0, xSELF
11542 add x1, xFP, #OFF_FP_SHADOWFRAME
11543 bl MterpLogNullObjectException
11544#endif
11545 b MterpCommonFallback
11546
11547common_exceptionThrown:
11548 EXPORT_PC
11549#if MTERP_LOGGING
11550 mov x0, xSELF
11551 add x1, xFP, #OFF_FP_SHADOWFRAME
11552 bl MterpLogExceptionThrownException
11553#endif
11554 b MterpCommonFallback
11555
11556MterpSuspendFallback:
11557 EXPORT_PC
11558#if MTERP_LOGGING
11559 mov x0, xSELF
11560 add x1, xFP, #OFF_FP_SHADOWFRAME
11561 ldr x2, [xSELF, #THREAD_FLAGS_OFFSET]
11562 bl MterpLogSuspendFallback
11563#endif
11564 b MterpCommonFallback
11565
11566/*
11567 * If we're here, something is out of the ordinary. If there is a pending
11568 * exception, handle it. Otherwise, roll back and retry with the reference
11569 * interpreter.
11570 */
11571MterpPossibleException:
11572 ldr x0, [xSELF, #THREAD_EXCEPTION_OFFSET]
11573 cbz x0, MterpFallback // If not, fall back to reference interpreter.
11574 /* intentional fallthrough - handle pending exception. */
11575/*
11576 * On return from a runtime helper routine, we've found a pending exception.
11577 * Can we handle it here - or need to bail out to caller?
11578 *
11579 */
11580MterpException:
11581 mov x0, xSELF
11582 add x1, xFP, #OFF_FP_SHADOWFRAME
11583 bl MterpHandleException // (self, shadow_frame)
11584 cbz w0, MterpExceptionReturn // no local catch, back to caller.
11585 ldr x0, [xFP, #OFF_FP_CODE_ITEM]
11586 ldr w1, [xFP, #OFF_FP_DEX_PC]
11587 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
11588 add xPC, x0, #CODEITEM_INSNS_OFFSET
11589 add xPC, xPC, x1, lsl #1 // generate new dex_pc_ptr
Bill Buzbeefd522f92016-02-11 22:37:42 +000011590 /* Do we need to switch interpreters? */
11591 bl MterpShouldSwitchInterpreters
11592 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011593 /* resume execution at catch block */
Bill Buzbeefd522f92016-02-11 22:37:42 +000011594 EXPORT_PC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011595 FETCH_INST
11596 GET_INST_OPCODE ip
11597 GOTO_OPCODE ip
11598 /* NOTE: no fallthrough */
11599
11600/*
11601 * Check for suspend check request. Assumes wINST already loaded, xPC advanced and
11602 * still needs to get the opcode and branch to it, and flags are in lr.
11603 */
11604MterpCheckSuspendAndContinue:
11605 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh xIBASE
11606 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
11607 b.ne check1
11608 GET_INST_OPCODE ip // extract opcode from wINST
11609 GOTO_OPCODE ip // jump to next instruction
11610check1:
11611 EXPORT_PC
11612 mov x0, xSELF
11613 bl MterpSuspendCheck // (self)
Bill Buzbeefd522f92016-02-11 22:37:42 +000011614 cbnz x0, MterpFallback // Something in the environment changed, switch interpreters
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011615 GET_INST_OPCODE ip // extract opcode from wINST
11616 GOTO_OPCODE ip // jump to next instruction
11617
11618/*
Bill Buzbeefd522f92016-02-11 22:37:42 +000011619 * On-stack replacement has happened, and now we've returned from the compiled method.
11620 */
11621MterpOnStackReplacement:
11622#if MTERP_LOGGING
11623 mov x0, xSELF
11624 add x1, xFP, #OFF_FP_SHADOWFRAME
11625 sbfm x2, xINST, 0, 31
11626 bl MterpLogOSR
11627#endif
11628 mov x0, #1 // Signal normal return
11629 b MterpDone
11630
11631/*
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011632 * Bail out to reference interpreter.
11633 */
11634MterpFallback:
11635 EXPORT_PC
11636#if MTERP_LOGGING
11637 mov x0, xSELF
11638 add x1, xFP, #OFF_FP_SHADOWFRAME
11639 bl MterpLogFallback
11640#endif
11641MterpCommonFallback:
11642 mov x0, #0 // signal retry with reference interpreter.
11643 b MterpDone
11644
11645/*
11646 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
11647 * SP and LR. Here we restore SP, restore the registers, and then restore
11648 * LR to PC.
11649 *
11650 * On entry:
11651 * uint32_t* xFP (should still be live, pointer to base of vregs)
11652 */
11653MterpExceptionReturn:
11654 mov x0, #1 // signal return to caller.
11655 b MterpDone
11656MterpReturn:
11657 ldr x2, [xFP, #OFF_FP_RESULT_REGISTER]
11658 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
11659 str x0, [x2]
11660 mov x0, xSELF
11661 ands lr, lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
11662 b.eq check2
11663 bl MterpSuspendCheck // (self)
11664check2:
11665 mov x0, #1 // signal return to caller.
11666MterpDone:
11667 ldp fp, lr, [sp, #48]
11668 ldp xPC, xFP, [sp, #32]
11669 ldp xSELF, xINST, [sp, #16]
11670 ldp xIBASE, xREFS, [sp], #64
11671 ret
11672
11673 .cfi_endproc
11674 .size ExecuteMterpImpl, .-ExecuteMterpImpl
11675
11676