1 /* 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 /* 42 ARM64 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 73 Mterp notes: 74 75 The 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 x26 wPROFILE jit profile hotness countdown 85 x16 ip scratch reg 86 x17 ip2 scratch reg (used by macros) 87 88 Macros are provided for common operations. They MUST NOT alter unspecified registers or condition 89 codes. 90 */ 91 92 /* 93 * This is a #include, not a %include, because we want the C pre-processor 94 * to expand the macros into assembler assignment statements. 95 */ 96 #include "asm_support.h" 97 98 #define MTERP_PROFILE_BRANCHES 1 99 #define MTERP_LOGGING 0 100 101 /* During bringup, we'll use the shadow frame model instead of xFP */ 102 /* single-purpose registers, given names for clarity */ 103 #define xPC x20 104 #define xFP x21 105 #define xSELF x22 106 #define xINST x23 107 #define wINST w23 108 #define xIBASE x24 109 #define xREFS x25 110 #define wPROFILE w26 111 #define xPROFILE x26 112 #define ip x16 113 #define ip2 x17 114 115 /* 116 * Instead of holding a pointer to the shadow frame, we keep xFP at the base of the vregs. So, 117 * to access other shadow frame fields, we need to use a backwards offset. Define those here. 118 */ 119 #define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET) 120 #define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET) 121 #define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET) 122 #define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET) 123 #define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET) 124 #define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET) 125 #define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET) 126 #define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET) 127 #define OFF_FP_SHADOWFRAME OFF_FP(0) 128 129 /* 130 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects. Must 131 * be done *before* something throws. 132 * 133 * It's okay to do this more than once. 134 * 135 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped 136 * dex byte codes. However, the rest of the runtime expects dex pc to be an instruction 137 * offset into the code_items_[] array. For effiency, we will "export" the 138 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC 139 * to convert to a dex pc when needed. 140 */ 141 .macro EXPORT_PC 142 str xPC, [xFP, #OFF_FP_DEX_PC_PTR] 143 .endm 144 145 /* 146 * Fetch the next instruction from xPC into wINST. Does not advance xPC. 147 */ 148 .macro FETCH_INST 149 ldrh wINST, [xPC] 150 .endm 151 152 /* 153 * Fetch the next instruction from the specified offset. Advances xPC 154 * to point to the next instruction. "_count" is in 16-bit code units. 155 * 156 * Because of the limited size of immediate constants on ARM, this is only 157 * suitable for small forward movements (i.e. don't try to implement "goto" 158 * with this). 159 * 160 * This must come AFTER anything that can throw an exception, or the 161 * exception catch may miss. (This also implies that it must come after 162 * EXPORT_PC.) 163 */ 164 .macro FETCH_ADVANCE_INST count 165 ldrh wINST, [xPC, #((\count)*2)]! 166 .endm 167 168 /* 169 * The operation performed here is similar to FETCH_ADVANCE_INST, except the 170 * src and dest registers are parameterized (not hard-wired to xPC and xINST). 171 */ 172 .macro PREFETCH_ADVANCE_INST dreg, sreg, count 173 ldrh \dreg, [\sreg, #((\count)*2)]! 174 .endm 175 176 /* 177 * Similar to FETCH_ADVANCE_INST, but does not update xPC. Used to load 178 * xINST ahead of possible exception point. Be sure to manually advance xPC 179 * later. 180 */ 181 .macro PREFETCH_INST count 182 ldrh wINST, [xPC, #((\count)*2)] 183 .endm 184 185 /* Advance xPC by some number of code units. */ 186 .macro ADVANCE count 187 add xPC, xPC, #((\count)*2) 188 .endm 189 190 /* 191 * Fetch the next instruction from an offset specified by _reg and advance xPC. 192 * xPC to point to the next instruction. "_reg" must specify the distance 193 * in bytes, *not* 16-bit code units, and may be a signed value. Must not set flags. 194 * 195 */ 196 .macro FETCH_ADVANCE_INST_RB reg 197 add xPC, xPC, \reg, sxtw 198 ldrh wINST, [xPC] 199 .endm 200 201 /* 202 * Fetch a half-word code unit from an offset past the current PC. The 203 * "_count" value is in 16-bit code units. Does not advance xPC. 204 * 205 * The "_S" variant works the same but treats the value as signed. 206 */ 207 .macro FETCH reg, count 208 ldrh \reg, [xPC, #((\count)*2)] 209 .endm 210 211 .macro FETCH_S reg, count 212 ldrsh \reg, [xPC, #((\count)*2)] 213 .endm 214 215 /* 216 * Fetch one byte from an offset past the current PC. Pass in the same 217 * "_count" as you would for FETCH, and an additional 0/1 indicating which 218 * byte of the halfword you want (lo/hi). 219 */ 220 .macro FETCH_B reg, count, byte 221 ldrb \reg, [xPC, #((\count)*2+(\byte))] 222 .endm 223 224 /* 225 * Put the instruction's opcode field into the specified register. 226 */ 227 .macro GET_INST_OPCODE reg 228 and \reg, xINST, #255 229 .endm 230 231 /* 232 * Put the prefetched instruction's opcode field into the specified register. 233 */ 234 .macro GET_PREFETCHED_OPCODE oreg, ireg 235 and \oreg, \ireg, #255 236 .endm 237 238 /* 239 * Begin executing the opcode in _reg. Clobbers reg 240 */ 241 242 .macro GOTO_OPCODE reg 243 add \reg, xIBASE, \reg, lsl #7 244 br \reg 245 .endm 246 .macro GOTO_OPCODE_BASE base,reg 247 add \reg, \base, \reg, lsl #7 248 br \reg 249 .endm 250 251 /* 252 * Get/set the 32-bit value from a Dalvik register. 253 */ 254 .macro GET_VREG reg, vreg 255 ldr \reg, [xFP, \vreg, uxtw #2] 256 .endm 257 .macro SET_VREG reg, vreg 258 str \reg, [xFP, \vreg, uxtw #2] 259 str wzr, [xREFS, \vreg, uxtw #2] 260 .endm 261 .macro SET_VREG_OBJECT reg, vreg, tmpreg 262 str \reg, [xFP, \vreg, uxtw #2] 263 str \reg, [xREFS, \vreg, uxtw #2] 264 .endm 265 266 /* 267 * Get/set the 64-bit value from a Dalvik register. 268 * TUNING: can we do better here? 269 */ 270 .macro GET_VREG_WIDE reg, vreg 271 add ip2, xFP, \vreg, lsl #2 272 ldr \reg, [ip2] 273 .endm 274 .macro SET_VREG_WIDE reg, vreg 275 add ip2, xFP, \vreg, lsl #2 276 str \reg, [ip2] 277 add ip2, xREFS, \vreg, lsl #2 278 str xzr, [ip2] 279 .endm 280 281 /* 282 * Convert a virtual register index into an address. 283 */ 284 .macro VREG_INDEX_TO_ADDR reg, vreg 285 add \reg, xFP, \vreg, lsl #2 /* WARNING: handle shadow frame vreg zero if store */ 286 .endm 287 288 /* 289 * Refresh handler table. 290 */ 291 .macro REFRESH_IBASE 292 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] 293 .endm 294 295 /* File: arm64/entry.S */ 296 /* 297 * Copyright (C) 2016 The Android Open Source Project 298 * 299 * Licensed under the Apache License, Version 2.0 (the "License"); 300 * you may not use this file except in compliance with the License. 301 * You may obtain a copy of the License at 302 * 303 * http://www.apache.org/licenses/LICENSE-2.0 304 * 305 * Unless required by applicable law or agreed to in writing, software 306 * distributed under the License is distributed on an "AS IS" BASIS, 307 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 308 * See the License for the specific language governing permissions and 309 * limitations under the License. 310 */ 311 312 .text 313 314 /* 315 * Interpreter entry point. 316 * On entry: 317 * x0 Thread* self/ 318 * x1 code_item 319 * x2 ShadowFrame 320 * x3 JValue* result_register 321 * 322 */ 323 .global ExecuteMterpImpl 324 .type ExecuteMterpImpl, %function 325 .balign 16 326 327 ExecuteMterpImpl: 328 .cfi_startproc 329 stp xPROFILE, x27, [sp, #-80]! 330 stp xIBASE, xREFS, [sp, #16] 331 stp xSELF, xINST, [sp, #32] 332 stp xPC, xFP, [sp, #48] 333 stp fp, lr, [sp, #64] 334 add fp, sp, #64 335 336 /* Remember the return register */ 337 str x3, [x2, #SHADOWFRAME_RESULT_REGISTER_OFFSET] 338 339 /* Remember the code_item */ 340 str x1, [x2, #SHADOWFRAME_CODE_ITEM_OFFSET] 341 342 /* set up "named" registers */ 343 mov xSELF, x0 344 ldr w0, [x2, #SHADOWFRAME_NUMBER_OF_VREGS_OFFSET] 345 add xFP, x2, #SHADOWFRAME_VREGS_OFFSET // point to vregs. 346 add xREFS, xFP, w0, lsl #2 // point to reference array in shadow frame 347 ldr w0, [x2, #SHADOWFRAME_DEX_PC_OFFSET] // Get starting dex_pc. 348 add xPC, x1, #CODEITEM_INSNS_OFFSET // Point to base of insns[] 349 add xPC, xPC, w0, lsl #1 // Create direct pointer to 1st dex opcode 350 EXPORT_PC 351 352 /* Starting ibase */ 353 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] 354 355 /* Set up for backwards branches & osr profiling */ 356 ldr x0, [xFP, #OFF_FP_METHOD] 357 add x1, xFP, #OFF_FP_SHADOWFRAME 358 bl MterpSetUpHotnessCountdown 359 mov wPROFILE, w0 // Starting hotness countdown to xPROFILE 360 361 /* start executing the instruction at rPC */ 362 FETCH_INST // load wINST from rPC 363 GET_INST_OPCODE ip // extract opcode from wINST 364 GOTO_OPCODE ip // jump to next instruction 365 /* NOTE: no fallthrough */ 366 367 368 .global artMterpAsmInstructionStart 369 .type artMterpAsmInstructionStart, %function 370 artMterpAsmInstructionStart = .L_op_nop 371 .text 372 373 /* ------------------------------ */ 374 .balign 128 375 .L_op_nop: /* 0x00 */ 376 /* File: arm64/op_nop.S */ 377 FETCH_ADVANCE_INST 1 // advance to next instr, load rINST 378 GET_INST_OPCODE ip // ip<- opcode from rINST 379 GOTO_OPCODE ip // execute it 380 381 /* ------------------------------ */ 382 .balign 128 383 .L_op_move: /* 0x01 */ 384 /* File: arm64/op_move.S */ 385 /* for move, move-object, long-to-int */ 386 /* op vA, vB */ 387 lsr w1, wINST, #12 // x1<- B from 15:12 388 ubfx w0, wINST, #8, #4 // x0<- A from 11:8 389 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 390 GET_VREG w2, w1 // x2<- fp[B] 391 GET_INST_OPCODE ip // ip<- opcode from wINST 392 .if 0 393 SET_VREG_OBJECT w2, w0 // fp[A]<- x2 394 .else 395 SET_VREG w2, w0 // fp[A]<- x2 396 .endif 397 GOTO_OPCODE ip // execute next instruction 398 399 /* ------------------------------ */ 400 .balign 128 401 .L_op_move_from16: /* 0x02 */ 402 /* File: arm64/op_move_from16.S */ 403 /* for: move/from16, move-object/from16 */ 404 /* op vAA, vBBBB */ 405 FETCH w1, 1 // r1<- BBBB 406 lsr w0, wINST, #8 // r0<- AA 407 FETCH_ADVANCE_INST 2 // advance rPC, load wINST 408 GET_VREG w2, w1 // r2<- fp[BBBB] 409 GET_INST_OPCODE ip // extract opcode from wINST 410 .if 0 411 SET_VREG_OBJECT w2, w0 // fp[AA]<- r2 412 .else 413 SET_VREG w2, w0 // fp[AA]<- r2 414 .endif 415 GOTO_OPCODE ip // jump to next instruction 416 417 /* ------------------------------ */ 418 .balign 128 419 .L_op_move_16: /* 0x03 */ 420 /* File: arm64/op_move_16.S */ 421 /* for: move/16, move-object/16 */ 422 /* op vAAAA, vBBBB */ 423 FETCH w1, 2 // w1<- BBBB 424 FETCH w0, 1 // w0<- AAAA 425 FETCH_ADVANCE_INST 3 // advance xPC, load xINST 426 GET_VREG w2, w1 // w2<- fp[BBBB] 427 GET_INST_OPCODE ip // extract opcode from xINST 428 .if 0 429 SET_VREG_OBJECT w2, w0 // fp[AAAA]<- w2 430 .else 431 SET_VREG w2, w0 // fp[AAAA]<- w2 432 .endif 433 GOTO_OPCODE ip // jump to next instruction 434 435 /* ------------------------------ */ 436 .balign 128 437 .L_op_move_wide: /* 0x04 */ 438 /* File: arm64/op_move_wide.S */ 439 /* move-wide vA, vB */ 440 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 441 lsr w3, wINST, #12 // w3<- B 442 ubfx w2, wINST, #8, #4 // w2<- A 443 GET_VREG_WIDE x3, w3 444 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 445 GET_INST_OPCODE ip // extract opcode from wINST 446 SET_VREG_WIDE x3, w2 447 GOTO_OPCODE ip // jump to next instruction 448 449 /* ------------------------------ */ 450 .balign 128 451 .L_op_move_wide_from16: /* 0x05 */ 452 /* File: arm64/op_move_wide_from16.S */ 453 /* move-wide/from16 vAA, vBBBB */ 454 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 455 FETCH w3, 1 // w3<- BBBB 456 lsr w2, wINST, #8 // w2<- AA 457 GET_VREG_WIDE x3, w3 458 FETCH_ADVANCE_INST 2 // advance rPC, load wINST 459 GET_INST_OPCODE ip // extract opcode from wINST 460 SET_VREG_WIDE x3, w2 461 GOTO_OPCODE ip // jump to next instruction 462 463 /* ------------------------------ */ 464 .balign 128 465 .L_op_move_wide_16: /* 0x06 */ 466 /* File: arm64/op_move_wide_16.S */ 467 /* move-wide/16 vAAAA, vBBBB */ 468 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 469 FETCH w3, 2 // w3<- BBBB 470 FETCH w2, 1 // w2<- AAAA 471 GET_VREG_WIDE x3, w3 472 FETCH_ADVANCE_INST 3 // advance rPC, load rINST 473 SET_VREG_WIDE x3, w2 474 GET_INST_OPCODE ip // extract opcode from rINST 475 GOTO_OPCODE ip // jump to next instruction 476 477 /* ------------------------------ */ 478 .balign 128 479 .L_op_move_object: /* 0x07 */ 480 /* File: arm64/op_move_object.S */ 481 /* File: arm64/op_move.S */ 482 /* for move, move-object, long-to-int */ 483 /* op vA, vB */ 484 lsr w1, wINST, #12 // x1<- B from 15:12 485 ubfx w0, wINST, #8, #4 // x0<- A from 11:8 486 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 487 GET_VREG w2, w1 // x2<- fp[B] 488 GET_INST_OPCODE ip // ip<- opcode from wINST 489 .if 1 490 SET_VREG_OBJECT w2, w0 // fp[A]<- x2 491 .else 492 SET_VREG w2, w0 // fp[A]<- x2 493 .endif 494 GOTO_OPCODE ip // execute next instruction 495 496 497 /* ------------------------------ */ 498 .balign 128 499 .L_op_move_object_from16: /* 0x08 */ 500 /* File: arm64/op_move_object_from16.S */ 501 /* File: arm64/op_move_from16.S */ 502 /* for: move/from16, move-object/from16 */ 503 /* op vAA, vBBBB */ 504 FETCH w1, 1 // r1<- BBBB 505 lsr w0, wINST, #8 // r0<- AA 506 FETCH_ADVANCE_INST 2 // advance rPC, load wINST 507 GET_VREG w2, w1 // r2<- fp[BBBB] 508 GET_INST_OPCODE ip // extract opcode from wINST 509 .if 1 510 SET_VREG_OBJECT w2, w0 // fp[AA]<- r2 511 .else 512 SET_VREG w2, w0 // fp[AA]<- r2 513 .endif 514 GOTO_OPCODE ip // jump to next instruction 515 516 517 /* ------------------------------ */ 518 .balign 128 519 .L_op_move_object_16: /* 0x09 */ 520 /* File: arm64/op_move_object_16.S */ 521 /* File: arm64/op_move_16.S */ 522 /* for: move/16, move-object/16 */ 523 /* op vAAAA, vBBBB */ 524 FETCH w1, 2 // w1<- BBBB 525 FETCH w0, 1 // w0<- AAAA 526 FETCH_ADVANCE_INST 3 // advance xPC, load xINST 527 GET_VREG w2, w1 // w2<- fp[BBBB] 528 GET_INST_OPCODE ip // extract opcode from xINST 529 .if 1 530 SET_VREG_OBJECT w2, w0 // fp[AAAA]<- w2 531 .else 532 SET_VREG w2, w0 // fp[AAAA]<- w2 533 .endif 534 GOTO_OPCODE ip // jump to next instruction 535 536 537 /* ------------------------------ */ 538 .balign 128 539 .L_op_move_result: /* 0x0a */ 540 /* File: arm64/op_move_result.S */ 541 /* for: move-result, move-result-object */ 542 /* op vAA */ 543 lsr w2, wINST, #8 // r2<- AA 544 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 545 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType. 546 ldr w0, [x0] // r0 <- result.i. 547 GET_INST_OPCODE ip // extract opcode from wINST 548 .if 0 549 SET_VREG_OBJECT w0, w2, w1 // fp[AA]<- r0 550 .else 551 SET_VREG w0, w2 // fp[AA]<- r0 552 .endif 553 GOTO_OPCODE ip // jump to next instruction 554 555 /* ------------------------------ */ 556 .balign 128 557 .L_op_move_result_wide: /* 0x0b */ 558 /* File: arm64/op_move_result_wide.S */ 559 /* for: move-result-wide */ 560 /* op vAA */ 561 lsr w2, wINST, #8 // r2<- AA 562 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 563 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType. 564 ldr x0, [x0] // r0 <- result.i. 565 GET_INST_OPCODE ip // extract opcode from wINST 566 SET_VREG_WIDE x0, x2 // fp[AA]<- r0 567 GOTO_OPCODE ip // jump to next instruction 568 569 /* ------------------------------ */ 570 .balign 128 571 .L_op_move_result_object: /* 0x0c */ 572 /* File: arm64/op_move_result_object.S */ 573 /* File: arm64/op_move_result.S */ 574 /* for: move-result, move-result-object */ 575 /* op vAA */ 576 lsr w2, wINST, #8 // r2<- AA 577 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 578 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType. 579 ldr w0, [x0] // r0 <- result.i. 580 GET_INST_OPCODE ip // extract opcode from wINST 581 .if 1 582 SET_VREG_OBJECT w0, w2, w1 // fp[AA]<- r0 583 .else 584 SET_VREG w0, w2 // fp[AA]<- r0 585 .endif 586 GOTO_OPCODE ip // jump to next instruction 587 588 589 /* ------------------------------ */ 590 .balign 128 591 .L_op_move_exception: /* 0x0d */ 592 /* File: arm64/op_move_exception.S */ 593 /* move-exception vAA */ 594 lsr w2, wINST, #8 // w2<- AA 595 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 596 mov x1, #0 // w1<- 0 597 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 598 SET_VREG_OBJECT w3, w2 // fp[AA]<- exception obj 599 GET_INST_OPCODE ip // extract opcode from rINST 600 str x1, [xSELF, #THREAD_EXCEPTION_OFFSET] // clear exception 601 GOTO_OPCODE ip // jump to next instruction 602 603 /* ------------------------------ */ 604 .balign 128 605 .L_op_return_void: /* 0x0e */ 606 /* File: arm64/op_return_void.S */ 607 .extern MterpThreadFenceForConstructor 608 bl MterpThreadFenceForConstructor 609 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET] 610 mov x0, xSELF 611 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST) 612 b.ne .Lop_return_void_check 613 .Lop_return_void_return: 614 mov x0, #0 615 b MterpReturn 616 .Lop_return_void_check: 617 bl MterpSuspendCheck // (self) 618 b .Lop_return_void_return 619 620 /* ------------------------------ */ 621 .balign 128 622 .L_op_return: /* 0x0f */ 623 /* File: arm64/op_return.S */ 624 /* 625 * Return a 32-bit value. 626 * 627 * for: return, return-object 628 */ 629 /* op vAA */ 630 .extern MterpThreadFenceForConstructor 631 bl MterpThreadFenceForConstructor 632 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET] 633 mov x0, xSELF 634 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST) 635 b.ne .Lop_return_check 636 .Lop_return_return: 637 lsr w2, wINST, #8 // r2<- AA 638 GET_VREG w0, w2 // r0<- vAA 639 b MterpReturn 640 .Lop_return_check: 641 bl MterpSuspendCheck // (self) 642 b .Lop_return_return 643 644 /* ------------------------------ */ 645 .balign 128 646 .L_op_return_wide: /* 0x10 */ 647 /* File: arm64/op_return_wide.S */ 648 /* 649 * Return a 64-bit value. 650 */ 651 /* return-wide vAA */ 652 /* op vAA */ 653 .extern MterpThreadFenceForConstructor 654 bl MterpThreadFenceForConstructor 655 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET] 656 mov x0, xSELF 657 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST) 658 b.ne .Lop_return_wide_check 659 .Lop_return_wide_return: 660 lsr w2, wINST, #8 // w2<- AA 661 GET_VREG_WIDE x0, w2 // x0<- vAA 662 b MterpReturn 663 .Lop_return_wide_check: 664 bl MterpSuspendCheck // (self) 665 b .Lop_return_wide_return 666 667 /* ------------------------------ */ 668 .balign 128 669 .L_op_return_object: /* 0x11 */ 670 /* File: arm64/op_return_object.S */ 671 /* File: arm64/op_return.S */ 672 /* 673 * Return a 32-bit value. 674 * 675 * for: return, return-object 676 */ 677 /* op vAA */ 678 .extern MterpThreadFenceForConstructor 679 bl MterpThreadFenceForConstructor 680 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET] 681 mov x0, xSELF 682 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST) 683 b.ne .Lop_return_object_check 684 .Lop_return_object_return: 685 lsr w2, wINST, #8 // r2<- AA 686 GET_VREG w0, w2 // r0<- vAA 687 b MterpReturn 688 .Lop_return_object_check: 689 bl MterpSuspendCheck // (self) 690 b .Lop_return_object_return 691 692 693 /* ------------------------------ */ 694 .balign 128 695 .L_op_const_4: /* 0x12 */ 696 /* File: arm64/op_const_4.S */ 697 /* const/4 vA, #+B */ 698 lsl w1, wINST, #16 // w1<- Bxxx0000 699 ubfx w0, wINST, #8, #4 // w0<- A 700 FETCH_ADVANCE_INST 1 // advance xPC, load wINST 701 asr w1, w1, #28 // w1<- sssssssB (sign-extended) 702 GET_INST_OPCODE ip // ip<- opcode from xINST 703 SET_VREG w1, w0 // fp[A]<- w1 704 GOTO_OPCODE ip // execute next instruction 705 706 /* ------------------------------ */ 707 .balign 128 708 .L_op_const_16: /* 0x13 */ 709 /* File: arm64/op_const_16.S */ 710 /* const/16 vAA, #+BBBB */ 711 FETCH_S w0, 1 // w0<- ssssBBBB (sign-extended 712 lsr w3, wINST, #8 // w3<- AA 713 FETCH_ADVANCE_INST 2 // advance xPC, load wINST 714 SET_VREG w0, w3 // vAA<- w0 715 GET_INST_OPCODE ip // extract opcode from wINST 716 GOTO_OPCODE ip // jump to next instruction 717 718 /* ------------------------------ */ 719 .balign 128 720 .L_op_const: /* 0x14 */ 721 /* File: arm64/op_const.S */ 722 /* const vAA, #+BBBBbbbb */ 723 lsr w3, wINST, #8 // w3<- AA 724 FETCH w0, 1 // w0<- bbbb (low 725 FETCH w1, 2 // w1<- BBBB (high 726 FETCH_ADVANCE_INST 3 // advance rPC, load wINST 727 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb 728 GET_INST_OPCODE ip // extract opcode from wINST 729 SET_VREG w0, w3 // vAA<- w0 730 GOTO_OPCODE ip // jump to next instruction 731 732 /* ------------------------------ */ 733 .balign 128 734 .L_op_const_high16: /* 0x15 */ 735 /* File: arm64/op_const_high16.S */ 736 /* const/high16 vAA, #+BBBB0000 */ 737 FETCH w0, 1 // r0<- 0000BBBB (zero-extended 738 lsr w3, wINST, #8 // r3<- AA 739 lsl w0, w0, #16 // r0<- BBBB0000 740 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 741 SET_VREG w0, w3 // vAA<- r0 742 GET_INST_OPCODE ip // extract opcode from rINST 743 GOTO_OPCODE ip // jump to next instruction 744 745 /* ------------------------------ */ 746 .balign 128 747 .L_op_const_wide_16: /* 0x16 */ 748 /* File: arm64/op_const_wide_16.S */ 749 /* const-wide/16 vAA, #+BBBB */ 750 FETCH_S w0, 1 // w0<- ssssBBBB (sign-extended 751 lsr w3, wINST, #8 // w3<- AA 752 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 753 sbfm x0, x0, 0, 31 754 GET_INST_OPCODE ip // extract opcode from rINST 755 SET_VREG_WIDE x0, w3 756 GOTO_OPCODE ip // jump to next instruction 757 758 /* ------------------------------ */ 759 .balign 128 760 .L_op_const_wide_32: /* 0x17 */ 761 /* File: arm64/op_const_wide_32.S */ 762 /* const-wide/32 vAA, #+BBBBbbbb */ 763 FETCH w0, 1 // w0<- 0000bbbb (low) 764 lsr w3, wINST, #8 // w3<- AA 765 FETCH_S w2, 2 // w2<- ssssBBBB (high) 766 FETCH_ADVANCE_INST 3 // advance rPC, load wINST 767 GET_INST_OPCODE ip // extract opcode from wINST 768 orr w0, w0, w2, lsl #16 // w0<- BBBBbbbb 769 sbfm x0, x0, 0, 31 770 SET_VREG_WIDE x0, w3 771 GOTO_OPCODE ip // jump to next instruction 772 773 /* ------------------------------ */ 774 .balign 128 775 .L_op_const_wide: /* 0x18 */ 776 /* File: arm64/op_const_wide.S */ 777 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */ 778 FETCH w0, 1 // w0<- bbbb (low) 779 FETCH w1, 2 // w1<- BBBB (low middle) 780 FETCH w2, 3 // w2<- hhhh (high middle) 781 FETCH w3, 4 // w3<- HHHH (high) 782 lsr w4, wINST, #8 // r4<- AA 783 FETCH_ADVANCE_INST 5 // advance rPC, load wINST 784 GET_INST_OPCODE ip // extract opcode from wINST 785 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb 786 orr x0, x0, x2, lsl #32 // w0<- hhhhBBBBbbbb 787 orr x0, x0, x3, lsl #48 // w0<- HHHHhhhhBBBBbbbb 788 SET_VREG_WIDE x0, w4 789 GOTO_OPCODE ip // jump to next instruction 790 791 /* ------------------------------ */ 792 .balign 128 793 .L_op_const_wide_high16: /* 0x19 */ 794 /* File: arm64/op_const_wide_high16.S */ 795 /* const-wide/high16 vAA, #+BBBB000000000000 */ 796 FETCH w0, 1 // w0<- 0000BBBB (zero-extended) 797 lsr w1, wINST, #8 // w1<- AA 798 FETCH_ADVANCE_INST 2 // advance rPC, load wINST 799 lsl x0, x0, #48 800 SET_VREG_WIDE x0, w1 801 GET_INST_OPCODE ip // extract opcode from wINST 802 GOTO_OPCODE ip // jump to next instruction 803 804 /* ------------------------------ */ 805 .balign 128 806 .L_op_const_string: /* 0x1a */ 807 /* File: arm64/op_const_string.S */ 808 /* const/string vAA, String//BBBB */ 809 EXPORT_PC 810 FETCH w0, 1 // w0<- BBBB 811 lsr w1, wINST, #8 // w1<- AA 812 add x2, xFP, #OFF_FP_SHADOWFRAME 813 mov x3, xSELF 814 bl MterpConstString // (index, tgt_reg, shadow_frame, self) 815 PREFETCH_INST 2 // load rINST 816 cbnz w0, MterpPossibleException // let reference interpreter deal with it. 817 ADVANCE 2 // advance rPC 818 GET_INST_OPCODE ip // extract opcode from rINST 819 GOTO_OPCODE ip // jump to next instruction 820 821 /* ------------------------------ */ 822 .balign 128 823 .L_op_const_string_jumbo: /* 0x1b */ 824 /* File: arm64/op_const_string_jumbo.S */ 825 /* const/string vAA, String//BBBBBBBB */ 826 EXPORT_PC 827 FETCH w0, 1 // w0<- bbbb (low 828 FETCH w2, 2 // w2<- BBBB (high 829 lsr w1, wINST, #8 // w1<- AA 830 orr w0, w0, w2, lsl #16 // w1<- BBBBbbbb 831 add x2, xFP, #OFF_FP_SHADOWFRAME 832 mov x3, xSELF 833 bl MterpConstString // (index, tgt_reg, shadow_frame, self) 834 PREFETCH_INST 3 // advance rPC 835 cbnz w0, MterpPossibleException // let reference interpreter deal with it. 836 ADVANCE 3 // advance rPC 837 GET_INST_OPCODE ip // extract opcode from rINST 838 GOTO_OPCODE ip // jump to next instruction 839 840 /* ------------------------------ */ 841 .balign 128 842 .L_op_const_class: /* 0x1c */ 843 /* File: arm64/op_const_class.S */ 844 /* const/class vAA, Class//BBBB */ 845 EXPORT_PC 846 FETCH w0, 1 // w0<- BBBB 847 lsr w1, wINST, #8 // w1<- AA 848 add x2, xFP, #OFF_FP_SHADOWFRAME 849 mov x3, xSELF 850 bl MterpConstClass // (index, tgt_reg, shadow_frame, self) 851 PREFETCH_INST 2 852 cbnz w0, MterpPossibleException 853 ADVANCE 2 854 GET_INST_OPCODE ip // extract opcode from rINST 855 GOTO_OPCODE ip // jump to next instruction 856 857 /* ------------------------------ */ 858 .balign 128 859 .L_op_monitor_enter: /* 0x1d */ 860 /* File: arm64/op_monitor_enter.S */ 861 /* 862 * Synchronize on an object. 863 */ 864 /* monitor-enter vAA */ 865 EXPORT_PC 866 lsr w2, wINST, #8 // w2<- AA 867 GET_VREG w0, w2 // w0<- vAA (object) 868 mov x1, xSELF // w1<- self 869 bl artLockObjectFromCode 870 cbnz w0, MterpException 871 FETCH_ADVANCE_INST 1 872 GET_INST_OPCODE ip // extract opcode from rINST 873 GOTO_OPCODE ip // jump to next instruction 874 875 /* ------------------------------ */ 876 .balign 128 877 .L_op_monitor_exit: /* 0x1e */ 878 /* File: arm64/op_monitor_exit.S */ 879 /* 880 * Unlock an object. 881 * 882 * Exceptions that occur when unlocking a monitor need to appear as 883 * if they happened at the following instruction. See the Dalvik 884 * instruction spec. 885 */ 886 /* monitor-exit vAA */ 887 EXPORT_PC 888 lsr w2, wINST, #8 // w2<- AA 889 GET_VREG w0, w2 // w0<- vAA (object) 890 mov x1, xSELF // w0<- self 891 bl artUnlockObjectFromCode // w0<- success for unlock(self, obj) 892 cbnz w0, MterpException 893 FETCH_ADVANCE_INST 1 // before throw: advance rPC, load rINST 894 GET_INST_OPCODE ip // extract opcode from rINST 895 GOTO_OPCODE ip // jump to next instruction 896 897 /* ------------------------------ */ 898 .balign 128 899 .L_op_check_cast: /* 0x1f */ 900 /* File: arm64/op_check_cast.S */ 901 /* 902 * Check to see if a cast from one class to another is allowed. 903 */ 904 /* check-cast vAA, class//BBBB */ 905 EXPORT_PC 906 FETCH w0, 1 // w0<- BBBB 907 lsr w1, wINST, #8 // w1<- AA 908 VREG_INDEX_TO_ADDR x1, w1 // w1<- &object 909 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- method 910 mov x3, xSELF // w3<- self 911 bl MterpCheckCast // (index, &obj, method, self) 912 PREFETCH_INST 2 913 cbnz w0, MterpPossibleException 914 ADVANCE 2 915 GET_INST_OPCODE ip // extract opcode from rINST 916 GOTO_OPCODE ip // jump to next instruction 917 918 /* ------------------------------ */ 919 .balign 128 920 .L_op_instance_of: /* 0x20 */ 921 /* File: arm64/op_instance_of.S */ 922 /* 923 * Check to see if an object reference is an instance of a class. 924 * 925 * Most common situation is a non-null object, being compared against 926 * an already-resolved class. 927 */ 928 /* instance-of vA, vB, class//CCCC */ 929 EXPORT_PC 930 FETCH w0, 1 // w0<- CCCC 931 lsr w1, wINST, #12 // w1<- B 932 VREG_INDEX_TO_ADDR x1, w1 // w1<- &object 933 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- method 934 mov x3, xSELF // w3<- self 935 bl MterpInstanceOf // (index, &obj, method, self) 936 ldr x1, [xSELF, #THREAD_EXCEPTION_OFFSET] 937 lsr w2, wINST, #8 // w2<- A+ 938 and w2, w2, #15 // w2<- A 939 PREFETCH_INST 2 940 cbnz x1, MterpException 941 ADVANCE 2 // advance rPC 942 SET_VREG w0, w2 // vA<- w0 943 GET_INST_OPCODE ip // extract opcode from rINST 944 GOTO_OPCODE ip // jump to next instruction 945 946 /* ------------------------------ */ 947 .balign 128 948 .L_op_array_length: /* 0x21 */ 949 /* File: arm64/op_array_length.S */ 950 /* 951 * Return the length of an array. 952 */ 953 lsr w1, wINST, #12 // w1<- B 954 ubfx w2, wINST, #8, #4 // w2<- A 955 GET_VREG w0, w1 // w0<- vB (object ref) 956 cbz w0, common_errNullObject // yup, fail 957 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 958 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- array length 959 GET_INST_OPCODE ip // extract opcode from rINST 960 SET_VREG w3, w2 // vB<- length 961 GOTO_OPCODE ip // jump to next instruction 962 963 /* ------------------------------ */ 964 .balign 128 965 .L_op_new_instance: /* 0x22 */ 966 /* File: arm64/op_new_instance.S */ 967 /* 968 * Create a new instance of a class. 969 */ 970 /* new-instance vAA, class//BBBB */ 971 EXPORT_PC 972 add x0, xFP, #OFF_FP_SHADOWFRAME 973 mov x1, xSELF 974 mov w2, wINST 975 bl MterpNewInstance // (shadow_frame, self, inst_data) 976 cbz w0, MterpPossibleException 977 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 978 GET_INST_OPCODE ip // extract opcode from rINST 979 GOTO_OPCODE ip // jump to next instruction 980 981 /* ------------------------------ */ 982 .balign 128 983 .L_op_new_array: /* 0x23 */ 984 /* File: arm64/op_new_array.S */ 985 /* 986 * Allocate an array of objects, specified with the array class 987 * and a count. 988 * 989 * The verifier guarantees that this is an array class, so we don't 990 * check for it here. 991 */ 992 /* new-array vA, vB, class//CCCC */ 993 EXPORT_PC 994 add x0, xFP, #OFF_FP_SHADOWFRAME 995 mov x1, xPC 996 mov w2, wINST 997 mov x3, xSELF 998 bl MterpNewArray 999 cbz w0, MterpPossibleException 1000 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 1001 GET_INST_OPCODE ip // extract opcode from rINST 1002 GOTO_OPCODE ip // jump to next instruction 1003 1004 /* ------------------------------ */ 1005 .balign 128 1006 .L_op_filled_new_array: /* 0x24 */ 1007 /* File: arm64/op_filled_new_array.S */ 1008 /* 1009 * Create a new array with elements filled from registers. 1010 * 1011 * for: filled-new-array, filled-new-array/range 1012 */ 1013 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */ 1014 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */ 1015 .extern MterpFilledNewArray 1016 EXPORT_PC 1017 add x0, xFP, #OFF_FP_SHADOWFRAME 1018 mov x1, xPC 1019 mov x2, xSELF 1020 bl MterpFilledNewArray 1021 cbz w0, MterpPossibleException 1022 FETCH_ADVANCE_INST 3 // advance rPC, load rINST 1023 GET_INST_OPCODE ip // extract opcode from rINST 1024 GOTO_OPCODE ip // jump to next instruction 1025 1026 /* ------------------------------ */ 1027 .balign 128 1028 .L_op_filled_new_array_range: /* 0x25 */ 1029 /* File: arm64/op_filled_new_array_range.S */ 1030 /* File: arm64/op_filled_new_array.S */ 1031 /* 1032 * Create a new array with elements filled from registers. 1033 * 1034 * for: filled-new-array, filled-new-array/range 1035 */ 1036 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */ 1037 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */ 1038 .extern MterpFilledNewArrayRange 1039 EXPORT_PC 1040 add x0, xFP, #OFF_FP_SHADOWFRAME 1041 mov x1, xPC 1042 mov x2, xSELF 1043 bl MterpFilledNewArrayRange 1044 cbz w0, MterpPossibleException 1045 FETCH_ADVANCE_INST 3 // advance rPC, load rINST 1046 GET_INST_OPCODE ip // extract opcode from rINST 1047 GOTO_OPCODE ip // jump to next instruction 1048 1049 1050 /* ------------------------------ */ 1051 .balign 128 1052 .L_op_fill_array_data: /* 0x26 */ 1053 /* File: arm64/op_fill_array_data.S */ 1054 /* fill-array-data vAA, +BBBBBBBB */ 1055 EXPORT_PC 1056 FETCH w0, 1 // w0<- bbbb (lo) 1057 FETCH w1, 2 // w1<- BBBB (hi) 1058 lsr w3, wINST, #8 // w3<- AA 1059 orr w1, w0, w1, lsl #16 // w1<- BBBBbbbb 1060 GET_VREG w0, w3 // w0<- vAA (array object) 1061 add x1, xPC, w1, lsl #1 // w1<- PC + BBBBbbbb*2 (array data off.) 1062 bl MterpFillArrayData // (obj, payload) 1063 cbz w0, MterpPossibleException // exception? 1064 FETCH_ADVANCE_INST 3 // advance rPC, load rINST 1065 GET_INST_OPCODE ip // extract opcode from rINST 1066 GOTO_OPCODE ip // jump to next instruction 1067 1068 /* ------------------------------ */ 1069 .balign 128 1070 .L_op_throw: /* 0x27 */ 1071 /* File: arm64/op_throw.S */ 1072 /* 1073 * Throw an exception object in the current thread. 1074 */ 1075 /* throw vAA */ 1076 EXPORT_PC 1077 lsr w2, wINST, #8 // r2<- AA 1078 GET_VREG w1, w2 // r1<- vAA (exception object) 1079 cbz w1, common_errNullObject 1080 str x1, [xSELF, #THREAD_EXCEPTION_OFFSET] // thread->exception<- obj 1081 b MterpException 1082 1083 /* ------------------------------ */ 1084 .balign 128 1085 .L_op_goto: /* 0x28 */ 1086 /* File: arm64/op_goto.S */ 1087 /* 1088 * Unconditional branch, 8-bit offset. 1089 * 1090 * The branch distance is a signed code-unit offset, which we need to 1091 * double to get a byte offset. 1092 */ 1093 /* goto +AA */ 1094 sbfx wINST, wINST, #8, #8 // wINST<- ssssssAA (sign-extended) 1095 b MterpCommonTakenBranchNoFlags 1096 1097 /* ------------------------------ */ 1098 .balign 128 1099 .L_op_goto_16: /* 0x29 */ 1100 /* File: arm64/op_goto_16.S */ 1101 /* 1102 * Unconditional branch, 16-bit offset. 1103 * 1104 * The branch distance is a signed code-unit offset, which we need to 1105 * double to get a byte offset. 1106 */ 1107 /* goto/16 +AAAA */ 1108 FETCH_S wINST, 1 // wINST<- ssssAAAA (sign-extended) 1109 b MterpCommonTakenBranchNoFlags 1110 1111 /* ------------------------------ */ 1112 .balign 128 1113 .L_op_goto_32: /* 0x2a */ 1114 /* File: arm64/op_goto_32.S */ 1115 /* 1116 * Unconditional branch, 32-bit offset. 1117 * 1118 * The branch distance is a signed code-unit offset, which we need to 1119 * double to get a byte offset. 1120 * 1121 * Unlike most opcodes, this one is allowed to branch to itself, so 1122 * our "backward branch" test must be "<=0" instead of "<0". Because 1123 * we need the V bit set, we'll use an adds to convert from Dalvik 1124 * offset to byte offset. 1125 */ 1126 /* goto/32 +AAAAAAAA */ 1127 FETCH w0, 1 // w0<- aaaa (lo) 1128 FETCH w1, 2 // w1<- AAAA (hi) 1129 orr wINST, w0, w1, lsl #16 // wINST<- AAAAaaaa 1130 b MterpCommonTakenBranchNoFlags 1131 1132 /* ------------------------------ */ 1133 .balign 128 1134 .L_op_packed_switch: /* 0x2b */ 1135 /* File: arm64/op_packed_switch.S */ 1136 /* 1137 * Handle a packed-switch or sparse-switch instruction. In both cases 1138 * we decode it and hand it off to a helper function. 1139 * 1140 * We don't really expect backward branches in a switch statement, but 1141 * they're perfectly legal, so we check for them here. 1142 * 1143 * for: packed-switch, sparse-switch 1144 */ 1145 /* op vAA, +BBBB */ 1146 FETCH w0, 1 // w0<- bbbb (lo) 1147 FETCH w1, 2 // w1<- BBBB (hi) 1148 lsr w3, wINST, #8 // w3<- AA 1149 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb 1150 GET_VREG w1, w3 // w1<- vAA 1151 add x0, xPC, w0, lsl #1 // w0<- PC + BBBBbbbb*2 1152 bl MterpDoPackedSwitch // w0<- code-unit branch offset 1153 sbfm xINST, x0, 0, 31 1154 b MterpCommonTakenBranchNoFlags 1155 1156 /* ------------------------------ */ 1157 .balign 128 1158 .L_op_sparse_switch: /* 0x2c */ 1159 /* File: arm64/op_sparse_switch.S */ 1160 /* File: arm64/op_packed_switch.S */ 1161 /* 1162 * Handle a packed-switch or sparse-switch instruction. In both cases 1163 * we decode it and hand it off to a helper function. 1164 * 1165 * We don't really expect backward branches in a switch statement, but 1166 * they're perfectly legal, so we check for them here. 1167 * 1168 * for: packed-switch, sparse-switch 1169 */ 1170 /* op vAA, +BBBB */ 1171 FETCH w0, 1 // w0<- bbbb (lo) 1172 FETCH w1, 2 // w1<- BBBB (hi) 1173 lsr w3, wINST, #8 // w3<- AA 1174 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb 1175 GET_VREG w1, w3 // w1<- vAA 1176 add x0, xPC, w0, lsl #1 // w0<- PC + BBBBbbbb*2 1177 bl MterpDoSparseSwitch // w0<- code-unit branch offset 1178 sbfm xINST, x0, 0, 31 1179 b MterpCommonTakenBranchNoFlags 1180 1181 1182 /* ------------------------------ */ 1183 .balign 128 1184 .L_op_cmpl_float: /* 0x2d */ 1185 /* File: arm64/op_cmpl_float.S */ 1186 /* File: arm64/fcmp.S */ 1187 /* 1188 * Compare two floating-point values. Puts 0, 1, or -1 into the 1189 * destination register based on the results of the comparison. 1190 */ 1191 /* op vAA, vBB, vCC */ 1192 FETCH w0, 1 // w0<- CCBB 1193 lsr w4, wINST, #8 // w4<- AA 1194 and w2, w0, #255 // w2<- BB 1195 lsr w3, w0, #8 // w3<- CC 1196 GET_VREG s1, w2 1197 GET_VREG s2, w3 1198 mov w0, #-1 1199 fcmp s1, s2 1200 csneg w0, w0, w0, le 1201 csel w0, wzr, w0, eq 1202 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 1203 GET_INST_OPCODE ip // extract opcode from rINST 1204 SET_VREG w0, w4 // vAA<- w0 1205 GOTO_OPCODE ip // jump to next instruction 1206 1207 1208 /* ------------------------------ */ 1209 .balign 128 1210 .L_op_cmpg_float: /* 0x2e */ 1211 /* File: arm64/op_cmpg_float.S */ 1212 /* File: arm64/fcmp.S */ 1213 /* 1214 * Compare two floating-point values. Puts 0, 1, or -1 into the 1215 * destination register based on the results of the comparison. 1216 */ 1217 /* op vAA, vBB, vCC */ 1218 FETCH w0, 1 // w0<- CCBB 1219 lsr w4, wINST, #8 // w4<- AA 1220 and w2, w0, #255 // w2<- BB 1221 lsr w3, w0, #8 // w3<- CC 1222 GET_VREG s1, w2 1223 GET_VREG s2, w3 1224 mov w0, #1 1225 fcmp s1, s2 1226 csneg w0, w0, w0, pl 1227 csel w0, wzr, w0, eq 1228 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 1229 GET_INST_OPCODE ip // extract opcode from rINST 1230 SET_VREG w0, w4 // vAA<- w0 1231 GOTO_OPCODE ip // jump to next instruction 1232 1233 1234 /* ------------------------------ */ 1235 .balign 128 1236 .L_op_cmpl_double: /* 0x2f */ 1237 /* File: arm64/op_cmpl_double.S */ 1238 /* File: arm64/fcmp.S */ 1239 /* 1240 * Compare two floating-point values. Puts 0, 1, or -1 into the 1241 * destination register based on the results of the comparison. 1242 */ 1243 /* op vAA, vBB, vCC */ 1244 FETCH w0, 1 // w0<- CCBB 1245 lsr w4, wINST, #8 // w4<- AA 1246 and w2, w0, #255 // w2<- BB 1247 lsr w3, w0, #8 // w3<- CC 1248 GET_VREG_WIDE d1, w2 1249 GET_VREG_WIDE d2, w3 1250 mov w0, #-1 1251 fcmp d1, d2 1252 csneg w0, w0, w0, le 1253 csel w0, wzr, w0, eq 1254 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 1255 GET_INST_OPCODE ip // extract opcode from rINST 1256 SET_VREG w0, w4 // vAA<- w0 1257 GOTO_OPCODE ip // jump to next instruction 1258 1259 1260 /* ------------------------------ */ 1261 .balign 128 1262 .L_op_cmpg_double: /* 0x30 */ 1263 /* File: arm64/op_cmpg_double.S */ 1264 /* File: arm64/fcmp.S */ 1265 /* 1266 * Compare two floating-point values. Puts 0, 1, or -1 into the 1267 * destination register based on the results of the comparison. 1268 */ 1269 /* op vAA, vBB, vCC */ 1270 FETCH w0, 1 // w0<- CCBB 1271 lsr w4, wINST, #8 // w4<- AA 1272 and w2, w0, #255 // w2<- BB 1273 lsr w3, w0, #8 // w3<- CC 1274 GET_VREG_WIDE d1, w2 1275 GET_VREG_WIDE d2, w3 1276 mov w0, #1 1277 fcmp d1, d2 1278 csneg w0, w0, w0, pl 1279 csel w0, wzr, w0, eq 1280 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 1281 GET_INST_OPCODE ip // extract opcode from rINST 1282 SET_VREG w0, w4 // vAA<- w0 1283 GOTO_OPCODE ip // jump to next instruction 1284 1285 1286 /* ------------------------------ */ 1287 .balign 128 1288 .L_op_cmp_long: /* 0x31 */ 1289 /* File: arm64/op_cmp_long.S */ 1290 FETCH w0, 1 // w0<- CCBB 1291 lsr w4, wINST, #8 // w4<- AA 1292 and w2, w0, #255 // w2<- BB 1293 lsr w3, w0, #8 // w3<- CC 1294 GET_VREG_WIDE x1, w2 1295 GET_VREG_WIDE x2, w3 1296 cmp x1, x2 1297 csinc w0, wzr, wzr, eq 1298 csneg w0, w0, w0, ge 1299 FETCH_ADVANCE_INST 2 // advance rPC, load wINST 1300 SET_VREG w0, w4 1301 GET_INST_OPCODE ip // extract opcode from wINST 1302 GOTO_OPCODE ip // jump to next instruction 1303 1304 /* ------------------------------ */ 1305 .balign 128 1306 .L_op_if_eq: /* 0x32 */ 1307 /* File: arm64/op_if_eq.S */ 1308 /* File: arm64/bincmp.S */ 1309 /* 1310 * Generic two-operand compare-and-branch operation. Provide a "condition" 1311 * fragment that specifies the comparison to perform. 1312 * 1313 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1314 */ 1315 /* if-cmp vA, vB, +CCCC */ 1316 lsr w1, wINST, #12 // w1<- B 1317 ubfx w0, wINST, #8, #4 // w0<- A 1318 GET_VREG w3, w1 // w3<- vB 1319 GET_VREG w2, w0 // w2<- vA 1320 FETCH_S wINST, 1 // wINST<- branch offset, in code units 1321 cmp w2, w3 // compare (vA, vB) 1322 b.eq MterpCommonTakenBranchNoFlags 1323 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry? 1324 b.eq .L_check_not_taken_osr 1325 FETCH_ADVANCE_INST 2 1326 GET_INST_OPCODE ip // extract opcode from wINST 1327 GOTO_OPCODE ip // jump to next instruction 1328 1329 1330 /* ------------------------------ */ 1331 .balign 128 1332 .L_op_if_ne: /* 0x33 */ 1333 /* File: arm64/op_if_ne.S */ 1334 /* File: arm64/bincmp.S */ 1335 /* 1336 * Generic two-operand compare-and-branch operation. Provide a "condition" 1337 * fragment that specifies the comparison to perform. 1338 * 1339 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1340 */ 1341 /* if-cmp vA, vB, +CCCC */ 1342 lsr w1, wINST, #12 // w1<- B 1343 ubfx w0, wINST, #8, #4 // w0<- A 1344 GET_VREG w3, w1 // w3<- vB 1345 GET_VREG w2, w0 // w2<- vA 1346 FETCH_S wINST, 1 // wINST<- branch offset, in code units 1347 cmp w2, w3 // compare (vA, vB) 1348 b.ne MterpCommonTakenBranchNoFlags 1349 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry? 1350 b.eq .L_check_not_taken_osr 1351 FETCH_ADVANCE_INST 2 1352 GET_INST_OPCODE ip // extract opcode from wINST 1353 GOTO_OPCODE ip // jump to next instruction 1354 1355 1356 /* ------------------------------ */ 1357 .balign 128 1358 .L_op_if_lt: /* 0x34 */ 1359 /* File: arm64/op_if_lt.S */ 1360 /* File: arm64/bincmp.S */ 1361 /* 1362 * Generic two-operand compare-and-branch operation. Provide a "condition" 1363 * fragment that specifies the comparison to perform. 1364 * 1365 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1366 */ 1367 /* if-cmp vA, vB, +CCCC */ 1368 lsr w1, wINST, #12 // w1<- B 1369 ubfx w0, wINST, #8, #4 // w0<- A 1370 GET_VREG w3, w1 // w3<- vB 1371 GET_VREG w2, w0 // w2<- vA 1372 FETCH_S wINST, 1 // wINST<- branch offset, in code units 1373 cmp w2, w3 // compare (vA, vB) 1374 b.lt MterpCommonTakenBranchNoFlags 1375 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry? 1376 b.eq .L_check_not_taken_osr 1377 FETCH_ADVANCE_INST 2 1378 GET_INST_OPCODE ip // extract opcode from wINST 1379 GOTO_OPCODE ip // jump to next instruction 1380 1381 1382 /* ------------------------------ */ 1383 .balign 128 1384 .L_op_if_ge: /* 0x35 */ 1385 /* File: arm64/op_if_ge.S */ 1386 /* File: arm64/bincmp.S */ 1387 /* 1388 * Generic two-operand compare-and-branch operation. Provide a "condition" 1389 * fragment that specifies the comparison to perform. 1390 * 1391 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1392 */ 1393 /* if-cmp vA, vB, +CCCC */ 1394 lsr w1, wINST, #12 // w1<- B 1395 ubfx w0, wINST, #8, #4 // w0<- A 1396 GET_VREG w3, w1 // w3<- vB 1397 GET_VREG w2, w0 // w2<- vA 1398 FETCH_S wINST, 1 // wINST<- branch offset, in code units 1399 cmp w2, w3 // compare (vA, vB) 1400 b.ge MterpCommonTakenBranchNoFlags 1401 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry? 1402 b.eq .L_check_not_taken_osr 1403 FETCH_ADVANCE_INST 2 1404 GET_INST_OPCODE ip // extract opcode from wINST 1405 GOTO_OPCODE ip // jump to next instruction 1406 1407 1408 /* ------------------------------ */ 1409 .balign 128 1410 .L_op_if_gt: /* 0x36 */ 1411 /* File: arm64/op_if_gt.S */ 1412 /* File: arm64/bincmp.S */ 1413 /* 1414 * Generic two-operand compare-and-branch operation. Provide a "condition" 1415 * fragment that specifies the comparison to perform. 1416 * 1417 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1418 */ 1419 /* if-cmp vA, vB, +CCCC */ 1420 lsr w1, wINST, #12 // w1<- B 1421 ubfx w0, wINST, #8, #4 // w0<- A 1422 GET_VREG w3, w1 // w3<- vB 1423 GET_VREG w2, w0 // w2<- vA 1424 FETCH_S wINST, 1 // wINST<- branch offset, in code units 1425 cmp w2, w3 // compare (vA, vB) 1426 b.gt MterpCommonTakenBranchNoFlags 1427 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry? 1428 b.eq .L_check_not_taken_osr 1429 FETCH_ADVANCE_INST 2 1430 GET_INST_OPCODE ip // extract opcode from wINST 1431 GOTO_OPCODE ip // jump to next instruction 1432 1433 1434 /* ------------------------------ */ 1435 .balign 128 1436 .L_op_if_le: /* 0x37 */ 1437 /* File: arm64/op_if_le.S */ 1438 /* File: arm64/bincmp.S */ 1439 /* 1440 * Generic two-operand compare-and-branch operation. Provide a "condition" 1441 * fragment that specifies the comparison to perform. 1442 * 1443 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1444 */ 1445 /* if-cmp vA, vB, +CCCC */ 1446 lsr w1, wINST, #12 // w1<- B 1447 ubfx w0, wINST, #8, #4 // w0<- A 1448 GET_VREG w3, w1 // w3<- vB 1449 GET_VREG w2, w0 // w2<- vA 1450 FETCH_S wINST, 1 // wINST<- branch offset, in code units 1451 cmp w2, w3 // compare (vA, vB) 1452 b.le MterpCommonTakenBranchNoFlags 1453 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry? 1454 b.eq .L_check_not_taken_osr 1455 FETCH_ADVANCE_INST 2 1456 GET_INST_OPCODE ip // extract opcode from wINST 1457 GOTO_OPCODE ip // jump to next instruction 1458 1459 1460 /* ------------------------------ */ 1461 .balign 128 1462 .L_op_if_eqz: /* 0x38 */ 1463 /* File: arm64/op_if_eqz.S */ 1464 /* File: arm64/zcmp.S */ 1465 /* 1466 * Generic one-operand compare-and-branch operation. Provide a "condition" 1467 * fragment that specifies the comparison to perform. 1468 * 1469 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1470 */ 1471 /* if-cmp vAA, +BBBB */ 1472 lsr w0, wINST, #8 // w0<- AA 1473 GET_VREG w2, w0 // w2<- vAA 1474 FETCH_S wINST, 1 // w1<- branch offset, in code units 1475 cmp w2, #0 // compare (vA, 0) 1476 b.eq MterpCommonTakenBranchNoFlags 1477 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry? 1478 b.eq .L_check_not_taken_osr 1479 FETCH_ADVANCE_INST 2 1480 GET_INST_OPCODE ip // extract opcode from wINST 1481 GOTO_OPCODE ip // jump to next instruction 1482 1483 1484 /* ------------------------------ */ 1485 .balign 128 1486 .L_op_if_nez: /* 0x39 */ 1487 /* File: arm64/op_if_nez.S */ 1488 /* File: arm64/zcmp.S */ 1489 /* 1490 * Generic one-operand compare-and-branch operation. Provide a "condition" 1491 * fragment that specifies the comparison to perform. 1492 * 1493 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1494 */ 1495 /* if-cmp vAA, +BBBB */ 1496 lsr w0, wINST, #8 // w0<- AA 1497 GET_VREG w2, w0 // w2<- vAA 1498 FETCH_S wINST, 1 // w1<- branch offset, in code units 1499 cmp w2, #0 // compare (vA, 0) 1500 b.ne MterpCommonTakenBranchNoFlags 1501 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry? 1502 b.eq .L_check_not_taken_osr 1503 FETCH_ADVANCE_INST 2 1504 GET_INST_OPCODE ip // extract opcode from wINST 1505 GOTO_OPCODE ip // jump to next instruction 1506 1507 1508 /* ------------------------------ */ 1509 .balign 128 1510 .L_op_if_ltz: /* 0x3a */ 1511 /* File: arm64/op_if_ltz.S */ 1512 /* File: arm64/zcmp.S */ 1513 /* 1514 * Generic one-operand compare-and-branch operation. Provide a "condition" 1515 * fragment that specifies the comparison to perform. 1516 * 1517 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1518 */ 1519 /* if-cmp vAA, +BBBB */ 1520 lsr w0, wINST, #8 // w0<- AA 1521 GET_VREG w2, w0 // w2<- vAA 1522 FETCH_S wINST, 1 // w1<- branch offset, in code units 1523 cmp w2, #0 // compare (vA, 0) 1524 b.lt MterpCommonTakenBranchNoFlags 1525 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry? 1526 b.eq .L_check_not_taken_osr 1527 FETCH_ADVANCE_INST 2 1528 GET_INST_OPCODE ip // extract opcode from wINST 1529 GOTO_OPCODE ip // jump to next instruction 1530 1531 1532 /* ------------------------------ */ 1533 .balign 128 1534 .L_op_if_gez: /* 0x3b */ 1535 /* File: arm64/op_if_gez.S */ 1536 /* File: arm64/zcmp.S */ 1537 /* 1538 * Generic one-operand compare-and-branch operation. Provide a "condition" 1539 * fragment that specifies the comparison to perform. 1540 * 1541 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1542 */ 1543 /* if-cmp vAA, +BBBB */ 1544 lsr w0, wINST, #8 // w0<- AA 1545 GET_VREG w2, w0 // w2<- vAA 1546 FETCH_S wINST, 1 // w1<- branch offset, in code units 1547 cmp w2, #0 // compare (vA, 0) 1548 b.ge MterpCommonTakenBranchNoFlags 1549 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry? 1550 b.eq .L_check_not_taken_osr 1551 FETCH_ADVANCE_INST 2 1552 GET_INST_OPCODE ip // extract opcode from wINST 1553 GOTO_OPCODE ip // jump to next instruction 1554 1555 1556 /* ------------------------------ */ 1557 .balign 128 1558 .L_op_if_gtz: /* 0x3c */ 1559 /* File: arm64/op_if_gtz.S */ 1560 /* File: arm64/zcmp.S */ 1561 /* 1562 * Generic one-operand compare-and-branch operation. Provide a "condition" 1563 * fragment that specifies the comparison to perform. 1564 * 1565 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1566 */ 1567 /* if-cmp vAA, +BBBB */ 1568 lsr w0, wINST, #8 // w0<- AA 1569 GET_VREG w2, w0 // w2<- vAA 1570 FETCH_S wINST, 1 // w1<- branch offset, in code units 1571 cmp w2, #0 // compare (vA, 0) 1572 b.gt MterpCommonTakenBranchNoFlags 1573 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry? 1574 b.eq .L_check_not_taken_osr 1575 FETCH_ADVANCE_INST 2 1576 GET_INST_OPCODE ip // extract opcode from wINST 1577 GOTO_OPCODE ip // jump to next instruction 1578 1579 1580 /* ------------------------------ */ 1581 .balign 128 1582 .L_op_if_lez: /* 0x3d */ 1583 /* File: arm64/op_if_lez.S */ 1584 /* File: arm64/zcmp.S */ 1585 /* 1586 * Generic one-operand compare-and-branch operation. Provide a "condition" 1587 * fragment that specifies the comparison to perform. 1588 * 1589 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1590 */ 1591 /* if-cmp vAA, +BBBB */ 1592 lsr w0, wINST, #8 // w0<- AA 1593 GET_VREG w2, w0 // w2<- vAA 1594 FETCH_S wINST, 1 // w1<- branch offset, in code units 1595 cmp w2, #0 // compare (vA, 0) 1596 b.le MterpCommonTakenBranchNoFlags 1597 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry? 1598 b.eq .L_check_not_taken_osr 1599 FETCH_ADVANCE_INST 2 1600 GET_INST_OPCODE ip // extract opcode from wINST 1601 GOTO_OPCODE ip // jump to next instruction 1602 1603 1604 /* ------------------------------ */ 1605 .balign 128 1606 .L_op_unused_3e: /* 0x3e */ 1607 /* File: arm64/op_unused_3e.S */ 1608 /* File: arm64/unused.S */ 1609 /* 1610 * Bail to reference interpreter to throw. 1611 */ 1612 b MterpFallback 1613 1614 1615 /* ------------------------------ */ 1616 .balign 128 1617 .L_op_unused_3f: /* 0x3f */ 1618 /* File: arm64/op_unused_3f.S */ 1619 /* File: arm64/unused.S */ 1620 /* 1621 * Bail to reference interpreter to throw. 1622 */ 1623 b MterpFallback 1624 1625 1626 /* ------------------------------ */ 1627 .balign 128 1628 .L_op_unused_40: /* 0x40 */ 1629 /* File: arm64/op_unused_40.S */ 1630 /* File: arm64/unused.S */ 1631 /* 1632 * Bail to reference interpreter to throw. 1633 */ 1634 b MterpFallback 1635 1636 1637 /* ------------------------------ */ 1638 .balign 128 1639 .L_op_unused_41: /* 0x41 */ 1640 /* File: arm64/op_unused_41.S */ 1641 /* File: arm64/unused.S */ 1642 /* 1643 * Bail to reference interpreter to throw. 1644 */ 1645 b MterpFallback 1646 1647 1648 /* ------------------------------ */ 1649 .balign 128 1650 .L_op_unused_42: /* 0x42 */ 1651 /* File: arm64/op_unused_42.S */ 1652 /* File: arm64/unused.S */ 1653 /* 1654 * Bail to reference interpreter to throw. 1655 */ 1656 b MterpFallback 1657 1658 1659 /* ------------------------------ */ 1660 .balign 128 1661 .L_op_unused_43: /* 0x43 */ 1662 /* File: arm64/op_unused_43.S */ 1663 /* File: arm64/unused.S */ 1664 /* 1665 * Bail to reference interpreter to throw. 1666 */ 1667 b MterpFallback 1668 1669 1670 /* ------------------------------ */ 1671 .balign 128 1672 .L_op_aget: /* 0x44 */ 1673 /* File: arm64/op_aget.S */ 1674 /* 1675 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1676 * 1677 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 1678 * instructions. We use a pair of FETCH_Bs instead. 1679 * 1680 * for: aget, aget-boolean, aget-byte, aget-char, aget-short 1681 * 1682 * NOTE: assumes data offset for arrays is the same for all non-wide types. 1683 * If this changes, specialize. 1684 */ 1685 /* op vAA, vBB, vCC */ 1686 FETCH_B w2, 1, 0 // w2<- BB 1687 lsr w9, wINST, #8 // w9<- AA 1688 FETCH_B w3, 1, 1 // w3<- CC 1689 GET_VREG w0, w2 // w0<- vBB (array object) 1690 GET_VREG w1, w3 // w1<- vCC (requested index) 1691 cbz x0, common_errNullObject // bail if null array object. 1692 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length 1693 add x0, x0, w1, uxtw #2 // w0<- arrayObj + index*width 1694 cmp w1, w3 // compare unsigned index, length 1695 bcs common_errArrayIndex // index >= length, bail 1696 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 1697 ldr w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC] 1698 GET_INST_OPCODE ip // extract opcode from rINST 1699 SET_VREG w2, w9 // vAA<- w2 1700 GOTO_OPCODE ip // jump to next instruction 1701 1702 /* ------------------------------ */ 1703 .balign 128 1704 .L_op_aget_wide: /* 0x45 */ 1705 /* File: arm64/op_aget_wide.S */ 1706 /* 1707 * Array get, 64 bits. vAA <- vBB[vCC]. 1708 * 1709 */ 1710 /* aget-wide vAA, vBB, vCC */ 1711 FETCH w0, 1 // w0<- CCBB 1712 lsr w4, wINST, #8 // w4<- AA 1713 and w2, w0, #255 // w2<- BB 1714 lsr w3, w0, #8 // w3<- CC 1715 GET_VREG w0, w2 // w0<- vBB (array object) 1716 GET_VREG w1, w3 // w1<- vCC (requested index) 1717 cbz w0, common_errNullObject // yes, bail 1718 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length 1719 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width 1720 cmp w1, w3 // compare unsigned index, length 1721 bcs common_errArrayIndex // index >= length, bail 1722 FETCH_ADVANCE_INST 2 // advance rPC, load wINST 1723 ldr x2, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] // x2<- vBB[vCC] 1724 GET_INST_OPCODE ip // extract opcode from wINST 1725 SET_VREG_WIDE x2, w4 1726 GOTO_OPCODE ip // jump to next instruction 1727 1728 /* ------------------------------ */ 1729 .balign 128 1730 .L_op_aget_object: /* 0x46 */ 1731 /* File: arm64/op_aget_object.S */ 1732 /* 1733 * Array object get. vAA <- vBB[vCC]. 1734 * 1735 * for: aget-object 1736 */ 1737 /* op vAA, vBB, vCC */ 1738 FETCH_B w2, 1, 0 // w2<- BB 1739 FETCH_B w3, 1, 1 // w3<- CC 1740 EXPORT_PC 1741 GET_VREG w0, w2 // w0<- vBB (array object) 1742 GET_VREG w1, w3 // w1<- vCC (requested index) 1743 bl artAGetObjectFromMterp // (array, index) 1744 ldr x1, [xSELF, #THREAD_EXCEPTION_OFFSET] 1745 lsr w2, wINST, #8 // w9<- AA 1746 PREFETCH_INST 2 1747 cbnz w1, MterpException 1748 SET_VREG_OBJECT w0, w2 1749 ADVANCE 2 1750 GET_INST_OPCODE ip 1751 GOTO_OPCODE ip // jump to next instruction 1752 1753 /* ------------------------------ */ 1754 .balign 128 1755 .L_op_aget_boolean: /* 0x47 */ 1756 /* File: arm64/op_aget_boolean.S */ 1757 /* File: arm64/op_aget.S */ 1758 /* 1759 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1760 * 1761 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 1762 * instructions. We use a pair of FETCH_Bs instead. 1763 * 1764 * for: aget, aget-boolean, aget-byte, aget-char, aget-short 1765 * 1766 * NOTE: assumes data offset for arrays is the same for all non-wide types. 1767 * If this changes, specialize. 1768 */ 1769 /* op vAA, vBB, vCC */ 1770 FETCH_B w2, 1, 0 // w2<- BB 1771 lsr w9, wINST, #8 // w9<- AA 1772 FETCH_B w3, 1, 1 // w3<- CC 1773 GET_VREG w0, w2 // w0<- vBB (array object) 1774 GET_VREG w1, w3 // w1<- vCC (requested index) 1775 cbz x0, common_errNullObject // bail if null array object. 1776 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length 1777 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width 1778 cmp w1, w3 // compare unsigned index, length 1779 bcs common_errArrayIndex // index >= length, bail 1780 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 1781 ldrb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // w2<- vBB[vCC] 1782 GET_INST_OPCODE ip // extract opcode from rINST 1783 SET_VREG w2, w9 // vAA<- w2 1784 GOTO_OPCODE ip // jump to next instruction 1785 1786 1787 /* ------------------------------ */ 1788 .balign 128 1789 .L_op_aget_byte: /* 0x48 */ 1790 /* File: arm64/op_aget_byte.S */ 1791 /* File: arm64/op_aget.S */ 1792 /* 1793 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1794 * 1795 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 1796 * instructions. We use a pair of FETCH_Bs instead. 1797 * 1798 * for: aget, aget-boolean, aget-byte, aget-char, aget-short 1799 * 1800 * NOTE: assumes data offset for arrays is the same for all non-wide types. 1801 * If this changes, specialize. 1802 */ 1803 /* op vAA, vBB, vCC */ 1804 FETCH_B w2, 1, 0 // w2<- BB 1805 lsr w9, wINST, #8 // w9<- AA 1806 FETCH_B w3, 1, 1 // w3<- CC 1807 GET_VREG w0, w2 // w0<- vBB (array object) 1808 GET_VREG w1, w3 // w1<- vCC (requested index) 1809 cbz x0, common_errNullObject // bail if null array object. 1810 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length 1811 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width 1812 cmp w1, w3 // compare unsigned index, length 1813 bcs common_errArrayIndex // index >= length, bail 1814 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 1815 ldrsb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // w2<- vBB[vCC] 1816 GET_INST_OPCODE ip // extract opcode from rINST 1817 SET_VREG w2, w9 // vAA<- w2 1818 GOTO_OPCODE ip // jump to next instruction 1819 1820 1821 /* ------------------------------ */ 1822 .balign 128 1823 .L_op_aget_char: /* 0x49 */ 1824 /* File: arm64/op_aget_char.S */ 1825 /* File: arm64/op_aget.S */ 1826 /* 1827 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1828 * 1829 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 1830 * instructions. We use a pair of FETCH_Bs instead. 1831 * 1832 * for: aget, aget-boolean, aget-byte, aget-char, aget-short 1833 * 1834 * NOTE: assumes data offset for arrays is the same for all non-wide types. 1835 * If this changes, specialize. 1836 */ 1837 /* op vAA, vBB, vCC */ 1838 FETCH_B w2, 1, 0 // w2<- BB 1839 lsr w9, wINST, #8 // w9<- AA 1840 FETCH_B w3, 1, 1 // w3<- CC 1841 GET_VREG w0, w2 // w0<- vBB (array object) 1842 GET_VREG w1, w3 // w1<- vCC (requested index) 1843 cbz x0, common_errNullObject // bail if null array object. 1844 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length 1845 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width 1846 cmp w1, w3 // compare unsigned index, length 1847 bcs common_errArrayIndex // index >= length, bail 1848 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 1849 ldrh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // w2<- vBB[vCC] 1850 GET_INST_OPCODE ip // extract opcode from rINST 1851 SET_VREG w2, w9 // vAA<- w2 1852 GOTO_OPCODE ip // jump to next instruction 1853 1854 1855 /* ------------------------------ */ 1856 .balign 128 1857 .L_op_aget_short: /* 0x4a */ 1858 /* File: arm64/op_aget_short.S */ 1859 /* File: arm64/op_aget.S */ 1860 /* 1861 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1862 * 1863 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 1864 * instructions. We use a pair of FETCH_Bs instead. 1865 * 1866 * for: aget, aget-boolean, aget-byte, aget-char, aget-short 1867 * 1868 * NOTE: assumes data offset for arrays is the same for all non-wide types. 1869 * If this changes, specialize. 1870 */ 1871 /* op vAA, vBB, vCC */ 1872 FETCH_B w2, 1, 0 // w2<- BB 1873 lsr w9, wINST, #8 // w9<- AA 1874 FETCH_B w3, 1, 1 // w3<- CC 1875 GET_VREG w0, w2 // w0<- vBB (array object) 1876 GET_VREG w1, w3 // w1<- vCC (requested index) 1877 cbz x0, common_errNullObject // bail if null array object. 1878 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length 1879 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width 1880 cmp w1, w3 // compare unsigned index, length 1881 bcs common_errArrayIndex // index >= length, bail 1882 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 1883 ldrsh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC] 1884 GET_INST_OPCODE ip // extract opcode from rINST 1885 SET_VREG w2, w9 // vAA<- w2 1886 GOTO_OPCODE ip // jump to next instruction 1887 1888 1889 /* ------------------------------ */ 1890 .balign 128 1891 .L_op_aput: /* 0x4b */ 1892 /* File: arm64/op_aput.S */ 1893 /* 1894 * Array put, 32 bits or less. vBB[vCC] <- vAA. 1895 * 1896 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 1897 * instructions. We use a pair of FETCH_Bs instead. 1898 * 1899 * for: aput, aput-boolean, aput-byte, aput-char, aput-short 1900 * 1901 * NOTE: this assumes data offset for arrays is the same for all non-wide types. 1902 * If this changes, specialize. 1903 */ 1904 /* op vAA, vBB, vCC */ 1905 FETCH_B w2, 1, 0 // w2<- BB 1906 lsr w9, wINST, #8 // w9<- AA 1907 FETCH_B w3, 1, 1 // w3<- CC 1908 GET_VREG w0, w2 // w0<- vBB (array object) 1909 GET_VREG w1, w3 // w1<- vCC (requested index) 1910 cbz w0, common_errNullObject // bail if null 1911 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length 1912 add x0, x0, w1, lsl #2 // w0<- arrayObj + index*width 1913 cmp w1, w3 // compare unsigned index, length 1914 bcs common_errArrayIndex // index >= length, bail 1915 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 1916 GET_VREG w2, w9 // w2<- vAA 1917 GET_INST_OPCODE ip // extract opcode from rINST 1918 str w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2 1919 GOTO_OPCODE ip // jump to next instruction 1920 1921 /* ------------------------------ */ 1922 .balign 128 1923 .L_op_aput_wide: /* 0x4c */ 1924 /* File: arm64/op_aput_wide.S */ 1925 /* 1926 * Array put, 64 bits. vBB[vCC] <- vAA. 1927 * 1928 */ 1929 /* aput-wide vAA, vBB, vCC */ 1930 FETCH w0, 1 // w0<- CCBB 1931 lsr w4, wINST, #8 // w4<- AA 1932 and w2, w0, #255 // w2<- BB 1933 lsr w3, w0, #8 // w3<- CC 1934 GET_VREG w0, w2 // w0<- vBB (array object) 1935 GET_VREG w1, w3 // w1<- vCC (requested index) 1936 cbz w0, common_errNullObject // bail if null 1937 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length 1938 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width 1939 cmp w1, w3 // compare unsigned index, length 1940 bcs common_errArrayIndex // index >= length, bail 1941 GET_VREG_WIDE x1, w4 1942 FETCH_ADVANCE_INST 2 // advance rPC, load wINST 1943 GET_INST_OPCODE ip // extract opcode from wINST 1944 str x1, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] 1945 GOTO_OPCODE ip // jump to next instruction 1946 1947 /* ------------------------------ */ 1948 .balign 128 1949 .L_op_aput_object: /* 0x4d */ 1950 /* File: arm64/op_aput_object.S */ 1951 /* 1952 * Store an object into an array. vBB[vCC] <- vAA. 1953 */ 1954 /* op vAA, vBB, vCC */ 1955 EXPORT_PC 1956 add x0, xFP, #OFF_FP_SHADOWFRAME 1957 mov x1, xPC 1958 mov w2, wINST 1959 bl MterpAputObject 1960 cbz w0, MterpPossibleException 1961 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 1962 GET_INST_OPCODE ip // extract opcode from rINST 1963 GOTO_OPCODE ip // jump to next instruction 1964 1965 /* ------------------------------ */ 1966 .balign 128 1967 .L_op_aput_boolean: /* 0x4e */ 1968 /* File: arm64/op_aput_boolean.S */ 1969 /* File: arm64/op_aput.S */ 1970 /* 1971 * Array put, 32 bits or less. vBB[vCC] <- vAA. 1972 * 1973 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 1974 * instructions. We use a pair of FETCH_Bs instead. 1975 * 1976 * for: aput, aput-boolean, aput-byte, aput-char, aput-short 1977 * 1978 * NOTE: this assumes data offset for arrays is the same for all non-wide types. 1979 * If this changes, specialize. 1980 */ 1981 /* op vAA, vBB, vCC */ 1982 FETCH_B w2, 1, 0 // w2<- BB 1983 lsr w9, wINST, #8 // w9<- AA 1984 FETCH_B w3, 1, 1 // w3<- CC 1985 GET_VREG w0, w2 // w0<- vBB (array object) 1986 GET_VREG w1, w3 // w1<- vCC (requested index) 1987 cbz w0, common_errNullObject // bail if null 1988 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length 1989 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width 1990 cmp w1, w3 // compare unsigned index, length 1991 bcs common_errArrayIndex // index >= length, bail 1992 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 1993 GET_VREG w2, w9 // w2<- vAA 1994 GET_INST_OPCODE ip // extract opcode from rINST 1995 strb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2 1996 GOTO_OPCODE ip // jump to next instruction 1997 1998 1999 /* ------------------------------ */ 2000 .balign 128 2001 .L_op_aput_byte: /* 0x4f */ 2002 /* File: arm64/op_aput_byte.S */ 2003 /* File: arm64/op_aput.S */ 2004 /* 2005 * Array put, 32 bits or less. vBB[vCC] <- vAA. 2006 * 2007 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2008 * instructions. We use a pair of FETCH_Bs instead. 2009 * 2010 * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2011 * 2012 * NOTE: this assumes data offset for arrays is the same for all non-wide types. 2013 * If this changes, specialize. 2014 */ 2015 /* op vAA, vBB, vCC */ 2016 FETCH_B w2, 1, 0 // w2<- BB 2017 lsr w9, wINST, #8 // w9<- AA 2018 FETCH_B w3, 1, 1 // w3<- CC 2019 GET_VREG w0, w2 // w0<- vBB (array object) 2020 GET_VREG w1, w3 // w1<- vCC (requested index) 2021 cbz w0, common_errNullObject // bail if null 2022 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length 2023 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width 2024 cmp w1, w3 // compare unsigned index, length 2025 bcs common_errArrayIndex // index >= length, bail 2026 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 2027 GET_VREG w2, w9 // w2<- vAA 2028 GET_INST_OPCODE ip // extract opcode from rINST 2029 strb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2 2030 GOTO_OPCODE ip // jump to next instruction 2031 2032 2033 /* ------------------------------ */ 2034 .balign 128 2035 .L_op_aput_char: /* 0x50 */ 2036 /* File: arm64/op_aput_char.S */ 2037 /* File: arm64/op_aput.S */ 2038 /* 2039 * Array put, 32 bits or less. vBB[vCC] <- vAA. 2040 * 2041 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2042 * instructions. We use a pair of FETCH_Bs instead. 2043 * 2044 * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2045 * 2046 * NOTE: this assumes data offset for arrays is the same for all non-wide types. 2047 * If this changes, specialize. 2048 */ 2049 /* op vAA, vBB, vCC */ 2050 FETCH_B w2, 1, 0 // w2<- BB 2051 lsr w9, wINST, #8 // w9<- AA 2052 FETCH_B w3, 1, 1 // w3<- CC 2053 GET_VREG w0, w2 // w0<- vBB (array object) 2054 GET_VREG w1, w3 // w1<- vCC (requested index) 2055 cbz w0, common_errNullObject // bail if null 2056 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length 2057 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width 2058 cmp w1, w3 // compare unsigned index, length 2059 bcs common_errArrayIndex // index >= length, bail 2060 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 2061 GET_VREG w2, w9 // w2<- vAA 2062 GET_INST_OPCODE ip // extract opcode from rINST 2063 strh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2 2064 GOTO_OPCODE ip // jump to next instruction 2065 2066 2067 /* ------------------------------ */ 2068 .balign 128 2069 .L_op_aput_short: /* 0x51 */ 2070 /* File: arm64/op_aput_short.S */ 2071 /* File: arm64/op_aput.S */ 2072 /* 2073 * Array put, 32 bits or less. vBB[vCC] <- vAA. 2074 * 2075 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17 2076 * instructions. We use a pair of FETCH_Bs instead. 2077 * 2078 * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2079 * 2080 * NOTE: this assumes data offset for arrays is the same for all non-wide types. 2081 * If this changes, specialize. 2082 */ 2083 /* op vAA, vBB, vCC */ 2084 FETCH_B w2, 1, 0 // w2<- BB 2085 lsr w9, wINST, #8 // w9<- AA 2086 FETCH_B w3, 1, 1 // w3<- CC 2087 GET_VREG w0, w2 // w0<- vBB (array object) 2088 GET_VREG w1, w3 // w1<- vCC (requested index) 2089 cbz w0, common_errNullObject // bail if null 2090 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length 2091 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width 2092 cmp w1, w3 // compare unsigned index, length 2093 bcs common_errArrayIndex // index >= length, bail 2094 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 2095 GET_VREG w2, w9 // w2<- vAA 2096 GET_INST_OPCODE ip // extract opcode from rINST 2097 strh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2 2098 GOTO_OPCODE ip // jump to next instruction 2099 2100 2101 /* ------------------------------ */ 2102 .balign 128 2103 .L_op_iget: /* 0x52 */ 2104 /* File: arm64/op_iget.S */ 2105 /* 2106 * General instance field get. 2107 * 2108 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2109 */ 2110 EXPORT_PC 2111 FETCH w0, 1 // w0<- field ref CCCC 2112 lsr w1, wINST, #12 // w1<- B 2113 GET_VREG w1, w1 // w1<- fp[B], the object pointer 2114 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer 2115 mov x3, xSELF // w3<- self 2116 bl artGet32InstanceFromCode 2117 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 2118 2119 ubfx w2, wINST, #8, #4 // w2<- A 2120 PREFETCH_INST 2 2121 cbnz x3, MterpPossibleException // bail out 2122 .if 0 2123 SET_VREG_OBJECT w0, w2 // fp[A]<- w0 2124 .else 2125 SET_VREG w0, w2 // fp[A]<- w0 2126 .endif 2127 ADVANCE 2 2128 GET_INST_OPCODE ip // extract opcode from rINST 2129 GOTO_OPCODE ip // jump to next instruction 2130 2131 /* ------------------------------ */ 2132 .balign 128 2133 .L_op_iget_wide: /* 0x53 */ 2134 /* File: arm64/op_iget_wide.S */ 2135 /* 2136 * 64-bit instance field get. 2137 * 2138 * for: iget-wide 2139 */ 2140 EXPORT_PC 2141 FETCH w0, 1 // w0<- field ref CCCC 2142 lsr w1, wINST, #12 // w1<- B 2143 GET_VREG w1, w1 // w1<- fp[B], the object pointer 2144 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer 2145 mov x3, xSELF // w3<- self 2146 bl artGet64InstanceFromCode 2147 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 2148 ubfx w2, wINST, #8, #4 // w2<- A 2149 PREFETCH_INST 2 2150 cmp w3, #0 2151 cbnz w3, MterpException // bail out 2152 SET_VREG_WIDE x0, w2 2153 ADVANCE 2 2154 GET_INST_OPCODE ip // extract opcode from wINST 2155 GOTO_OPCODE ip // jump to next instruction 2156 2157 /* ------------------------------ */ 2158 .balign 128 2159 .L_op_iget_object: /* 0x54 */ 2160 /* File: arm64/op_iget_object.S */ 2161 /* File: arm64/op_iget.S */ 2162 /* 2163 * General instance field get. 2164 * 2165 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2166 */ 2167 EXPORT_PC 2168 FETCH w0, 1 // w0<- field ref CCCC 2169 lsr w1, wINST, #12 // w1<- B 2170 GET_VREG w1, w1 // w1<- fp[B], the object pointer 2171 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer 2172 mov x3, xSELF // w3<- self 2173 bl artGetObjInstanceFromCode 2174 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 2175 2176 ubfx w2, wINST, #8, #4 // w2<- A 2177 PREFETCH_INST 2 2178 cbnz x3, MterpPossibleException // bail out 2179 .if 1 2180 SET_VREG_OBJECT w0, w2 // fp[A]<- w0 2181 .else 2182 SET_VREG w0, w2 // fp[A]<- w0 2183 .endif 2184 ADVANCE 2 2185 GET_INST_OPCODE ip // extract opcode from rINST 2186 GOTO_OPCODE ip // jump to next instruction 2187 2188 2189 /* ------------------------------ */ 2190 .balign 128 2191 .L_op_iget_boolean: /* 0x55 */ 2192 /* File: arm64/op_iget_boolean.S */ 2193 /* File: arm64/op_iget.S */ 2194 /* 2195 * General instance field get. 2196 * 2197 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2198 */ 2199 EXPORT_PC 2200 FETCH w0, 1 // w0<- field ref CCCC 2201 lsr w1, wINST, #12 // w1<- B 2202 GET_VREG w1, w1 // w1<- fp[B], the object pointer 2203 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer 2204 mov x3, xSELF // w3<- self 2205 bl artGetBooleanInstanceFromCode 2206 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 2207 uxtb w0, w0 2208 ubfx w2, wINST, #8, #4 // w2<- A 2209 PREFETCH_INST 2 2210 cbnz x3, MterpPossibleException // bail out 2211 .if 0 2212 SET_VREG_OBJECT w0, w2 // fp[A]<- w0 2213 .else 2214 SET_VREG w0, w2 // fp[A]<- w0 2215 .endif 2216 ADVANCE 2 2217 GET_INST_OPCODE ip // extract opcode from rINST 2218 GOTO_OPCODE ip // jump to next instruction 2219 2220 2221 /* ------------------------------ */ 2222 .balign 128 2223 .L_op_iget_byte: /* 0x56 */ 2224 /* File: arm64/op_iget_byte.S */ 2225 /* File: arm64/op_iget.S */ 2226 /* 2227 * General instance field get. 2228 * 2229 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2230 */ 2231 EXPORT_PC 2232 FETCH w0, 1 // w0<- field ref CCCC 2233 lsr w1, wINST, #12 // w1<- B 2234 GET_VREG w1, w1 // w1<- fp[B], the object pointer 2235 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer 2236 mov x3, xSELF // w3<- self 2237 bl artGetByteInstanceFromCode 2238 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 2239 sxtb w0, w0 2240 ubfx w2, wINST, #8, #4 // w2<- A 2241 PREFETCH_INST 2 2242 cbnz x3, MterpPossibleException // bail out 2243 .if 0 2244 SET_VREG_OBJECT w0, w2 // fp[A]<- w0 2245 .else 2246 SET_VREG w0, w2 // fp[A]<- w0 2247 .endif 2248 ADVANCE 2 2249 GET_INST_OPCODE ip // extract opcode from rINST 2250 GOTO_OPCODE ip // jump to next instruction 2251 2252 2253 /* ------------------------------ */ 2254 .balign 128 2255 .L_op_iget_char: /* 0x57 */ 2256 /* File: arm64/op_iget_char.S */ 2257 /* File: arm64/op_iget.S */ 2258 /* 2259 * General instance field get. 2260 * 2261 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2262 */ 2263 EXPORT_PC 2264 FETCH w0, 1 // w0<- field ref CCCC 2265 lsr w1, wINST, #12 // w1<- B 2266 GET_VREG w1, w1 // w1<- fp[B], the object pointer 2267 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer 2268 mov x3, xSELF // w3<- self 2269 bl artGetCharInstanceFromCode 2270 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 2271 uxth w0, w0 2272 ubfx w2, wINST, #8, #4 // w2<- A 2273 PREFETCH_INST 2 2274 cbnz x3, MterpPossibleException // bail out 2275 .if 0 2276 SET_VREG_OBJECT w0, w2 // fp[A]<- w0 2277 .else 2278 SET_VREG w0, w2 // fp[A]<- w0 2279 .endif 2280 ADVANCE 2 2281 GET_INST_OPCODE ip // extract opcode from rINST 2282 GOTO_OPCODE ip // jump to next instruction 2283 2284 2285 /* ------------------------------ */ 2286 .balign 128 2287 .L_op_iget_short: /* 0x58 */ 2288 /* File: arm64/op_iget_short.S */ 2289 /* File: arm64/op_iget.S */ 2290 /* 2291 * General instance field get. 2292 * 2293 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2294 */ 2295 EXPORT_PC 2296 FETCH w0, 1 // w0<- field ref CCCC 2297 lsr w1, wINST, #12 // w1<- B 2298 GET_VREG w1, w1 // w1<- fp[B], the object pointer 2299 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer 2300 mov x3, xSELF // w3<- self 2301 bl artGetShortInstanceFromCode 2302 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 2303 sxth w0, w0 2304 ubfx w2, wINST, #8, #4 // w2<- A 2305 PREFETCH_INST 2 2306 cbnz x3, MterpPossibleException // bail out 2307 .if 0 2308 SET_VREG_OBJECT w0, w2 // fp[A]<- w0 2309 .else 2310 SET_VREG w0, w2 // fp[A]<- w0 2311 .endif 2312 ADVANCE 2 2313 GET_INST_OPCODE ip // extract opcode from rINST 2314 GOTO_OPCODE ip // jump to next instruction 2315 2316 2317 /* ------------------------------ */ 2318 .balign 128 2319 .L_op_iput: /* 0x59 */ 2320 /* File: arm64/op_iput.S */ 2321 /* 2322 * General 32-bit instance field put. 2323 * 2324 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2325 */ 2326 /* op vA, vB, field//CCCC */ 2327 .extern artSet32InstanceFromMterp 2328 EXPORT_PC 2329 FETCH w0, 1 // w0<- field ref CCCC 2330 lsr w1, wINST, #12 // w1<- B 2331 GET_VREG w1, w1 // w1<- fp[B], the object pointer 2332 ubfx w2, wINST, #8, #4 // w2<- A 2333 GET_VREG w2, w2 // w2<- fp[A] 2334 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer 2335 PREFETCH_INST 2 2336 bl artSet32InstanceFromMterp 2337 cbnz w0, MterpPossibleException 2338 ADVANCE 2 // advance rPC 2339 GET_INST_OPCODE ip // extract opcode from rINST 2340 GOTO_OPCODE ip // jump to next instruction 2341 2342 /* ------------------------------ */ 2343 .balign 128 2344 .L_op_iput_wide: /* 0x5a */ 2345 /* File: arm64/op_iput_wide.S */ 2346 /* iput-wide vA, vB, field//CCCC */ 2347 .extern artSet64InstanceFromMterp 2348 EXPORT_PC 2349 FETCH w0, 1 // w0<- field ref CCCC 2350 lsr w1, wINST, #12 // w1<- B 2351 GET_VREG w1, w1 // w1<- fp[B], the object pointer 2352 ubfx w2, wINST, #8, #4 // w2<- A 2353 VREG_INDEX_TO_ADDR x2, x2 // w2<- &fp[A] 2354 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer 2355 PREFETCH_INST 2 2356 bl artSet64InstanceFromMterp 2357 cbnz w0, MterpPossibleException 2358 ADVANCE 2 // advance rPC 2359 GET_INST_OPCODE ip // extract opcode from wINST 2360 GOTO_OPCODE ip // jump to next instruction 2361 2362 /* ------------------------------ */ 2363 .balign 128 2364 .L_op_iput_object: /* 0x5b */ 2365 /* File: arm64/op_iput_object.S */ 2366 EXPORT_PC 2367 add x0, xFP, #OFF_FP_SHADOWFRAME 2368 mov x1, xPC 2369 mov w2, wINST 2370 mov x3, xSELF 2371 bl MterpIputObject 2372 cbz w0, MterpException 2373 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 2374 GET_INST_OPCODE ip // extract opcode from rINST 2375 GOTO_OPCODE ip // jump to next instruction 2376 2377 /* ------------------------------ */ 2378 .balign 128 2379 .L_op_iput_boolean: /* 0x5c */ 2380 /* File: arm64/op_iput_boolean.S */ 2381 /* File: arm64/op_iput.S */ 2382 /* 2383 * General 32-bit instance field put. 2384 * 2385 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2386 */ 2387 /* op vA, vB, field//CCCC */ 2388 .extern artSet8InstanceFromMterp 2389 EXPORT_PC 2390 FETCH w0, 1 // w0<- field ref CCCC 2391 lsr w1, wINST, #12 // w1<- B 2392 GET_VREG w1, w1 // w1<- fp[B], the object pointer 2393 ubfx w2, wINST, #8, #4 // w2<- A 2394 GET_VREG w2, w2 // w2<- fp[A] 2395 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer 2396 PREFETCH_INST 2 2397 bl artSet8InstanceFromMterp 2398 cbnz w0, MterpPossibleException 2399 ADVANCE 2 // advance rPC 2400 GET_INST_OPCODE ip // extract opcode from rINST 2401 GOTO_OPCODE ip // jump to next instruction 2402 2403 2404 /* ------------------------------ */ 2405 .balign 128 2406 .L_op_iput_byte: /* 0x5d */ 2407 /* File: arm64/op_iput_byte.S */ 2408 /* File: arm64/op_iput.S */ 2409 /* 2410 * General 32-bit instance field put. 2411 * 2412 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2413 */ 2414 /* op vA, vB, field//CCCC */ 2415 .extern artSet8InstanceFromMterp 2416 EXPORT_PC 2417 FETCH w0, 1 // w0<- field ref CCCC 2418 lsr w1, wINST, #12 // w1<- B 2419 GET_VREG w1, w1 // w1<- fp[B], the object pointer 2420 ubfx w2, wINST, #8, #4 // w2<- A 2421 GET_VREG w2, w2 // w2<- fp[A] 2422 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer 2423 PREFETCH_INST 2 2424 bl artSet8InstanceFromMterp 2425 cbnz w0, MterpPossibleException 2426 ADVANCE 2 // advance rPC 2427 GET_INST_OPCODE ip // extract opcode from rINST 2428 GOTO_OPCODE ip // jump to next instruction 2429 2430 2431 /* ------------------------------ */ 2432 .balign 128 2433 .L_op_iput_char: /* 0x5e */ 2434 /* File: arm64/op_iput_char.S */ 2435 /* File: arm64/op_iput.S */ 2436 /* 2437 * General 32-bit instance field put. 2438 * 2439 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2440 */ 2441 /* op vA, vB, field//CCCC */ 2442 .extern artSet16InstanceFromMterp 2443 EXPORT_PC 2444 FETCH w0, 1 // w0<- field ref CCCC 2445 lsr w1, wINST, #12 // w1<- B 2446 GET_VREG w1, w1 // w1<- fp[B], the object pointer 2447 ubfx w2, wINST, #8, #4 // w2<- A 2448 GET_VREG w2, w2 // w2<- fp[A] 2449 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer 2450 PREFETCH_INST 2 2451 bl artSet16InstanceFromMterp 2452 cbnz w0, MterpPossibleException 2453 ADVANCE 2 // advance rPC 2454 GET_INST_OPCODE ip // extract opcode from rINST 2455 GOTO_OPCODE ip // jump to next instruction 2456 2457 2458 /* ------------------------------ */ 2459 .balign 128 2460 .L_op_iput_short: /* 0x5f */ 2461 /* File: arm64/op_iput_short.S */ 2462 /* File: arm64/op_iput.S */ 2463 /* 2464 * General 32-bit instance field put. 2465 * 2466 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2467 */ 2468 /* op vA, vB, field//CCCC */ 2469 .extern artSet16InstanceFromMterp 2470 EXPORT_PC 2471 FETCH w0, 1 // w0<- field ref CCCC 2472 lsr w1, wINST, #12 // w1<- B 2473 GET_VREG w1, w1 // w1<- fp[B], the object pointer 2474 ubfx w2, wINST, #8, #4 // w2<- A 2475 GET_VREG w2, w2 // w2<- fp[A] 2476 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer 2477 PREFETCH_INST 2 2478 bl artSet16InstanceFromMterp 2479 cbnz w0, MterpPossibleException 2480 ADVANCE 2 // advance rPC 2481 GET_INST_OPCODE ip // extract opcode from rINST 2482 GOTO_OPCODE ip // jump to next instruction 2483 2484 2485 /* ------------------------------ */ 2486 .balign 128 2487 .L_op_sget: /* 0x60 */ 2488 /* File: arm64/op_sget.S */ 2489 /* 2490 * General SGET handler wrapper. 2491 * 2492 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2493 */ 2494 /* op vAA, field//BBBB */ 2495 2496 .extern artGet32StaticFromCode 2497 EXPORT_PC 2498 FETCH w0, 1 // w0<- field ref BBBB 2499 ldr x1, [xFP, #OFF_FP_METHOD] 2500 mov x2, xSELF 2501 bl artGet32StaticFromCode 2502 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 2503 lsr w2, wINST, #8 // w2<- AA 2504 2505 PREFETCH_INST 2 2506 cbnz x3, MterpException // bail out 2507 .if 0 2508 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0 2509 .else 2510 SET_VREG w0, w2 // fp[AA]<- w0 2511 .endif 2512 ADVANCE 2 2513 GET_INST_OPCODE ip // extract opcode from rINST 2514 GOTO_OPCODE ip 2515 2516 /* ------------------------------ */ 2517 .balign 128 2518 .L_op_sget_wide: /* 0x61 */ 2519 /* File: arm64/op_sget_wide.S */ 2520 /* 2521 * SGET_WIDE handler wrapper. 2522 * 2523 */ 2524 /* sget-wide vAA, field//BBBB */ 2525 2526 .extern artGet64StaticFromCode 2527 EXPORT_PC 2528 FETCH w0, 1 // w0<- field ref BBBB 2529 ldr x1, [xFP, #OFF_FP_METHOD] 2530 mov x2, xSELF 2531 bl artGet64StaticFromCode 2532 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 2533 lsr w4, wINST, #8 // w4<- AA 2534 cbnz x3, MterpException // bail out 2535 FETCH_ADVANCE_INST 2 // advance rPC, load wINST 2536 SET_VREG_WIDE x0, w4 2537 GET_INST_OPCODE ip // extract opcode from wINST 2538 GOTO_OPCODE ip // jump to next instruction 2539 2540 /* ------------------------------ */ 2541 .balign 128 2542 .L_op_sget_object: /* 0x62 */ 2543 /* File: arm64/op_sget_object.S */ 2544 /* File: arm64/op_sget.S */ 2545 /* 2546 * General SGET handler wrapper. 2547 * 2548 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2549 */ 2550 /* op vAA, field//BBBB */ 2551 2552 .extern artGetObjStaticFromCode 2553 EXPORT_PC 2554 FETCH w0, 1 // w0<- field ref BBBB 2555 ldr x1, [xFP, #OFF_FP_METHOD] 2556 mov x2, xSELF 2557 bl artGetObjStaticFromCode 2558 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 2559 lsr w2, wINST, #8 // w2<- AA 2560 2561 PREFETCH_INST 2 2562 cbnz x3, MterpException // bail out 2563 .if 1 2564 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0 2565 .else 2566 SET_VREG w0, w2 // fp[AA]<- w0 2567 .endif 2568 ADVANCE 2 2569 GET_INST_OPCODE ip // extract opcode from rINST 2570 GOTO_OPCODE ip 2571 2572 2573 /* ------------------------------ */ 2574 .balign 128 2575 .L_op_sget_boolean: /* 0x63 */ 2576 /* File: arm64/op_sget_boolean.S */ 2577 /* File: arm64/op_sget.S */ 2578 /* 2579 * General SGET handler wrapper. 2580 * 2581 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2582 */ 2583 /* op vAA, field//BBBB */ 2584 2585 .extern artGetBooleanStaticFromCode 2586 EXPORT_PC 2587 FETCH w0, 1 // w0<- field ref BBBB 2588 ldr x1, [xFP, #OFF_FP_METHOD] 2589 mov x2, xSELF 2590 bl artGetBooleanStaticFromCode 2591 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 2592 lsr w2, wINST, #8 // w2<- AA 2593 uxtb w0, w0 2594 PREFETCH_INST 2 2595 cbnz x3, MterpException // bail out 2596 .if 0 2597 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0 2598 .else 2599 SET_VREG w0, w2 // fp[AA]<- w0 2600 .endif 2601 ADVANCE 2 2602 GET_INST_OPCODE ip // extract opcode from rINST 2603 GOTO_OPCODE ip 2604 2605 2606 /* ------------------------------ */ 2607 .balign 128 2608 .L_op_sget_byte: /* 0x64 */ 2609 /* File: arm64/op_sget_byte.S */ 2610 /* File: arm64/op_sget.S */ 2611 /* 2612 * General SGET handler wrapper. 2613 * 2614 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2615 */ 2616 /* op vAA, field//BBBB */ 2617 2618 .extern artGetByteStaticFromCode 2619 EXPORT_PC 2620 FETCH w0, 1 // w0<- field ref BBBB 2621 ldr x1, [xFP, #OFF_FP_METHOD] 2622 mov x2, xSELF 2623 bl artGetByteStaticFromCode 2624 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 2625 lsr w2, wINST, #8 // w2<- AA 2626 sxtb w0, w0 2627 PREFETCH_INST 2 2628 cbnz x3, MterpException // bail out 2629 .if 0 2630 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0 2631 .else 2632 SET_VREG w0, w2 // fp[AA]<- w0 2633 .endif 2634 ADVANCE 2 2635 GET_INST_OPCODE ip // extract opcode from rINST 2636 GOTO_OPCODE ip 2637 2638 2639 /* ------------------------------ */ 2640 .balign 128 2641 .L_op_sget_char: /* 0x65 */ 2642 /* File: arm64/op_sget_char.S */ 2643 /* File: arm64/op_sget.S */ 2644 /* 2645 * General SGET handler wrapper. 2646 * 2647 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2648 */ 2649 /* op vAA, field//BBBB */ 2650 2651 .extern artGetCharStaticFromCode 2652 EXPORT_PC 2653 FETCH w0, 1 // w0<- field ref BBBB 2654 ldr x1, [xFP, #OFF_FP_METHOD] 2655 mov x2, xSELF 2656 bl artGetCharStaticFromCode 2657 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 2658 lsr w2, wINST, #8 // w2<- AA 2659 uxth w0, w0 2660 PREFETCH_INST 2 2661 cbnz x3, MterpException // bail out 2662 .if 0 2663 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0 2664 .else 2665 SET_VREG w0, w2 // fp[AA]<- w0 2666 .endif 2667 ADVANCE 2 2668 GET_INST_OPCODE ip // extract opcode from rINST 2669 GOTO_OPCODE ip 2670 2671 2672 /* ------------------------------ */ 2673 .balign 128 2674 .L_op_sget_short: /* 0x66 */ 2675 /* File: arm64/op_sget_short.S */ 2676 /* File: arm64/op_sget.S */ 2677 /* 2678 * General SGET handler wrapper. 2679 * 2680 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2681 */ 2682 /* op vAA, field//BBBB */ 2683 2684 .extern artGetShortStaticFromCode 2685 EXPORT_PC 2686 FETCH w0, 1 // w0<- field ref BBBB 2687 ldr x1, [xFP, #OFF_FP_METHOD] 2688 mov x2, xSELF 2689 bl artGetShortStaticFromCode 2690 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 2691 lsr w2, wINST, #8 // w2<- AA 2692 sxth w0, w0 2693 PREFETCH_INST 2 2694 cbnz x3, MterpException // bail out 2695 .if 0 2696 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0 2697 .else 2698 SET_VREG w0, w2 // fp[AA]<- w0 2699 .endif 2700 ADVANCE 2 2701 GET_INST_OPCODE ip // extract opcode from rINST 2702 GOTO_OPCODE ip 2703 2704 2705 /* ------------------------------ */ 2706 .balign 128 2707 .L_op_sput: /* 0x67 */ 2708 /* File: arm64/op_sput.S */ 2709 /* 2710 * General SPUT handler wrapper. 2711 * 2712 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2713 */ 2714 /* op vAA, field//BBBB */ 2715 EXPORT_PC 2716 FETCH w0, 1 // r0<- field ref BBBB 2717 lsr w3, wINST, #8 // r3<- AA 2718 GET_VREG w1, w3 // r1<= fp[AA] 2719 ldr x2, [xFP, #OFF_FP_METHOD] 2720 mov x3, xSELF 2721 PREFETCH_INST 2 // Get next inst, but don't advance rPC 2722 bl artSet32StaticFromCode 2723 cbnz w0, MterpException // 0 on success 2724 ADVANCE 2 // Past exception point - now advance rPC 2725 GET_INST_OPCODE ip // extract opcode from rINST 2726 GOTO_OPCODE ip // jump to next instruction 2727 2728 /* ------------------------------ */ 2729 .balign 128 2730 .L_op_sput_wide: /* 0x68 */ 2731 /* File: arm64/op_sput_wide.S */ 2732 /* 2733 * SPUT_WIDE handler wrapper. 2734 * 2735 */ 2736 /* sput-wide vAA, field//BBBB */ 2737 .extern artSet64IndirectStaticFromMterp 2738 EXPORT_PC 2739 FETCH w0, 1 // w0<- field ref BBBB 2740 ldr x1, [xFP, #OFF_FP_METHOD] 2741 lsr w2, wINST, #8 // w3<- AA 2742 VREG_INDEX_TO_ADDR x2, w2 2743 mov x3, xSELF 2744 PREFETCH_INST 2 // Get next inst, but don't advance rPC 2745 bl artSet64IndirectStaticFromMterp 2746 cbnz w0, MterpException // 0 on success, -1 on failure 2747 ADVANCE 2 // Past exception point - now advance rPC 2748 GET_INST_OPCODE ip // extract opcode from wINST 2749 GOTO_OPCODE ip // jump to next instruction 2750 2751 /* ------------------------------ */ 2752 .balign 128 2753 .L_op_sput_object: /* 0x69 */ 2754 /* File: arm64/op_sput_object.S */ 2755 EXPORT_PC 2756 add x0, xFP, #OFF_FP_SHADOWFRAME 2757 mov x1, xPC 2758 mov x2, xINST 2759 mov x3, xSELF 2760 bl MterpSputObject 2761 cbz w0, MterpException 2762 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 2763 GET_INST_OPCODE ip // extract opcode from rINST 2764 GOTO_OPCODE ip // jump to next instruction 2765 2766 /* ------------------------------ */ 2767 .balign 128 2768 .L_op_sput_boolean: /* 0x6a */ 2769 /* File: arm64/op_sput_boolean.S */ 2770 /* File: arm64/op_sput.S */ 2771 /* 2772 * General SPUT handler wrapper. 2773 * 2774 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2775 */ 2776 /* op vAA, field//BBBB */ 2777 EXPORT_PC 2778 FETCH w0, 1 // r0<- field ref BBBB 2779 lsr w3, wINST, #8 // r3<- AA 2780 GET_VREG w1, w3 // r1<= fp[AA] 2781 ldr x2, [xFP, #OFF_FP_METHOD] 2782 mov x3, xSELF 2783 PREFETCH_INST 2 // Get next inst, but don't advance rPC 2784 bl artSet8StaticFromCode 2785 cbnz w0, MterpException // 0 on success 2786 ADVANCE 2 // Past exception point - now advance rPC 2787 GET_INST_OPCODE ip // extract opcode from rINST 2788 GOTO_OPCODE ip // jump to next instruction 2789 2790 2791 /* ------------------------------ */ 2792 .balign 128 2793 .L_op_sput_byte: /* 0x6b */ 2794 /* File: arm64/op_sput_byte.S */ 2795 /* File: arm64/op_sput.S */ 2796 /* 2797 * General SPUT handler wrapper. 2798 * 2799 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2800 */ 2801 /* op vAA, field//BBBB */ 2802 EXPORT_PC 2803 FETCH w0, 1 // r0<- field ref BBBB 2804 lsr w3, wINST, #8 // r3<- AA 2805 GET_VREG w1, w3 // r1<= fp[AA] 2806 ldr x2, [xFP, #OFF_FP_METHOD] 2807 mov x3, xSELF 2808 PREFETCH_INST 2 // Get next inst, but don't advance rPC 2809 bl artSet8StaticFromCode 2810 cbnz w0, MterpException // 0 on success 2811 ADVANCE 2 // Past exception point - now advance rPC 2812 GET_INST_OPCODE ip // extract opcode from rINST 2813 GOTO_OPCODE ip // jump to next instruction 2814 2815 2816 /* ------------------------------ */ 2817 .balign 128 2818 .L_op_sput_char: /* 0x6c */ 2819 /* File: arm64/op_sput_char.S */ 2820 /* File: arm64/op_sput.S */ 2821 /* 2822 * General SPUT handler wrapper. 2823 * 2824 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2825 */ 2826 /* op vAA, field//BBBB */ 2827 EXPORT_PC 2828 FETCH w0, 1 // r0<- field ref BBBB 2829 lsr w3, wINST, #8 // r3<- AA 2830 GET_VREG w1, w3 // r1<= fp[AA] 2831 ldr x2, [xFP, #OFF_FP_METHOD] 2832 mov x3, xSELF 2833 PREFETCH_INST 2 // Get next inst, but don't advance rPC 2834 bl artSet16StaticFromCode 2835 cbnz w0, MterpException // 0 on success 2836 ADVANCE 2 // Past exception point - now advance rPC 2837 GET_INST_OPCODE ip // extract opcode from rINST 2838 GOTO_OPCODE ip // jump to next instruction 2839 2840 2841 /* ------------------------------ */ 2842 .balign 128 2843 .L_op_sput_short: /* 0x6d */ 2844 /* File: arm64/op_sput_short.S */ 2845 /* File: arm64/op_sput.S */ 2846 /* 2847 * General SPUT handler wrapper. 2848 * 2849 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2850 */ 2851 /* op vAA, field//BBBB */ 2852 EXPORT_PC 2853 FETCH w0, 1 // r0<- field ref BBBB 2854 lsr w3, wINST, #8 // r3<- AA 2855 GET_VREG w1, w3 // r1<= fp[AA] 2856 ldr x2, [xFP, #OFF_FP_METHOD] 2857 mov x3, xSELF 2858 PREFETCH_INST 2 // Get next inst, but don't advance rPC 2859 bl artSet16StaticFromCode 2860 cbnz w0, MterpException // 0 on success 2861 ADVANCE 2 // Past exception point - now advance rPC 2862 GET_INST_OPCODE ip // extract opcode from rINST 2863 GOTO_OPCODE ip // jump to next instruction 2864 2865 2866 /* ------------------------------ */ 2867 .balign 128 2868 .L_op_invoke_virtual: /* 0x6e */ 2869 /* File: arm64/op_invoke_virtual.S */ 2870 /* File: arm64/invoke.S */ 2871 /* 2872 * Generic invoke handler wrapper. 2873 */ 2874 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2875 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2876 .extern MterpInvokeVirtual 2877 EXPORT_PC 2878 mov x0, xSELF 2879 add x1, xFP, #OFF_FP_SHADOWFRAME 2880 mov x2, xPC 2881 mov x3, xINST 2882 bl MterpInvokeVirtual 2883 cbz w0, MterpException 2884 FETCH_ADVANCE_INST 3 2885 bl MterpShouldSwitchInterpreters 2886 cbnz w0, MterpFallback 2887 GET_INST_OPCODE ip 2888 GOTO_OPCODE ip 2889 2890 2891 /* 2892 * Handle a virtual method call. 2893 * 2894 * for: invoke-virtual, invoke-virtual/range 2895 */ 2896 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2897 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2898 2899 /* ------------------------------ */ 2900 .balign 128 2901 .L_op_invoke_super: /* 0x6f */ 2902 /* File: arm64/op_invoke_super.S */ 2903 /* File: arm64/invoke.S */ 2904 /* 2905 * Generic invoke handler wrapper. 2906 */ 2907 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2908 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2909 .extern MterpInvokeSuper 2910 EXPORT_PC 2911 mov x0, xSELF 2912 add x1, xFP, #OFF_FP_SHADOWFRAME 2913 mov x2, xPC 2914 mov x3, xINST 2915 bl MterpInvokeSuper 2916 cbz w0, MterpException 2917 FETCH_ADVANCE_INST 3 2918 bl MterpShouldSwitchInterpreters 2919 cbnz w0, MterpFallback 2920 GET_INST_OPCODE ip 2921 GOTO_OPCODE ip 2922 2923 2924 /* 2925 * Handle a "super" method call. 2926 * 2927 * for: invoke-super, invoke-super/range 2928 */ 2929 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2930 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2931 2932 /* ------------------------------ */ 2933 .balign 128 2934 .L_op_invoke_direct: /* 0x70 */ 2935 /* File: arm64/op_invoke_direct.S */ 2936 /* File: arm64/invoke.S */ 2937 /* 2938 * Generic invoke handler wrapper. 2939 */ 2940 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2941 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2942 .extern MterpInvokeDirect 2943 EXPORT_PC 2944 mov x0, xSELF 2945 add x1, xFP, #OFF_FP_SHADOWFRAME 2946 mov x2, xPC 2947 mov x3, xINST 2948 bl MterpInvokeDirect 2949 cbz w0, MterpException 2950 FETCH_ADVANCE_INST 3 2951 bl MterpShouldSwitchInterpreters 2952 cbnz w0, MterpFallback 2953 GET_INST_OPCODE ip 2954 GOTO_OPCODE ip 2955 2956 2957 2958 /* ------------------------------ */ 2959 .balign 128 2960 .L_op_invoke_static: /* 0x71 */ 2961 /* File: arm64/op_invoke_static.S */ 2962 /* File: arm64/invoke.S */ 2963 /* 2964 * Generic invoke handler wrapper. 2965 */ 2966 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2967 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2968 .extern MterpInvokeStatic 2969 EXPORT_PC 2970 mov x0, xSELF 2971 add x1, xFP, #OFF_FP_SHADOWFRAME 2972 mov x2, xPC 2973 mov x3, xINST 2974 bl MterpInvokeStatic 2975 cbz w0, MterpException 2976 FETCH_ADVANCE_INST 3 2977 bl MterpShouldSwitchInterpreters 2978 cbnz w0, MterpFallback 2979 GET_INST_OPCODE ip 2980 GOTO_OPCODE ip 2981 2982 2983 2984 2985 /* ------------------------------ */ 2986 .balign 128 2987 .L_op_invoke_interface: /* 0x72 */ 2988 /* File: arm64/op_invoke_interface.S */ 2989 /* File: arm64/invoke.S */ 2990 /* 2991 * Generic invoke handler wrapper. 2992 */ 2993 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2994 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2995 .extern MterpInvokeInterface 2996 EXPORT_PC 2997 mov x0, xSELF 2998 add x1, xFP, #OFF_FP_SHADOWFRAME 2999 mov x2, xPC 3000 mov x3, xINST 3001 bl MterpInvokeInterface 3002 cbz w0, MterpException 3003 FETCH_ADVANCE_INST 3 3004 bl MterpShouldSwitchInterpreters 3005 cbnz w0, MterpFallback 3006 GET_INST_OPCODE ip 3007 GOTO_OPCODE ip 3008 3009 3010 /* 3011 * Handle an interface method call. 3012 * 3013 * for: invoke-interface, invoke-interface/range 3014 */ 3015 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3016 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3017 3018 /* ------------------------------ */ 3019 .balign 128 3020 .L_op_return_void_no_barrier: /* 0x73 */ 3021 /* File: arm64/op_return_void_no_barrier.S */ 3022 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET] 3023 mov x0, xSELF 3024 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST) 3025 b.ne .Lop_return_void_no_barrier_check 3026 .Lop_return_void_no_barrier_return: 3027 mov x0, #0 3028 b MterpReturn 3029 .Lop_return_void_no_barrier_check: 3030 bl MterpSuspendCheck // (self) 3031 b .Lop_return_void_no_barrier_return 3032 3033 /* ------------------------------ */ 3034 .balign 128 3035 .L_op_invoke_virtual_range: /* 0x74 */ 3036 /* File: arm64/op_invoke_virtual_range.S */ 3037 /* File: arm64/invoke.S */ 3038 /* 3039 * Generic invoke handler wrapper. 3040 */ 3041 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3042 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3043 .extern MterpInvokeVirtualRange 3044 EXPORT_PC 3045 mov x0, xSELF 3046 add x1, xFP, #OFF_FP_SHADOWFRAME 3047 mov x2, xPC 3048 mov x3, xINST 3049 bl MterpInvokeVirtualRange 3050 cbz w0, MterpException 3051 FETCH_ADVANCE_INST 3 3052 bl MterpShouldSwitchInterpreters 3053 cbnz w0, MterpFallback 3054 GET_INST_OPCODE ip 3055 GOTO_OPCODE ip 3056 3057 3058 3059 /* ------------------------------ */ 3060 .balign 128 3061 .L_op_invoke_super_range: /* 0x75 */ 3062 /* File: arm64/op_invoke_super_range.S */ 3063 /* File: arm64/invoke.S */ 3064 /* 3065 * Generic invoke handler wrapper. 3066 */ 3067 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3068 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3069 .extern MterpInvokeSuperRange 3070 EXPORT_PC 3071 mov x0, xSELF 3072 add x1, xFP, #OFF_FP_SHADOWFRAME 3073 mov x2, xPC 3074 mov x3, xINST 3075 bl MterpInvokeSuperRange 3076 cbz w0, MterpException 3077 FETCH_ADVANCE_INST 3 3078 bl MterpShouldSwitchInterpreters 3079 cbnz w0, MterpFallback 3080 GET_INST_OPCODE ip 3081 GOTO_OPCODE ip 3082 3083 3084 3085 /* ------------------------------ */ 3086 .balign 128 3087 .L_op_invoke_direct_range: /* 0x76 */ 3088 /* File: arm64/op_invoke_direct_range.S */ 3089 /* File: arm64/invoke.S */ 3090 /* 3091 * Generic invoke handler wrapper. 3092 */ 3093 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3094 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3095 .extern MterpInvokeDirectRange 3096 EXPORT_PC 3097 mov x0, xSELF 3098 add x1, xFP, #OFF_FP_SHADOWFRAME 3099 mov x2, xPC 3100 mov x3, xINST 3101 bl MterpInvokeDirectRange 3102 cbz w0, MterpException 3103 FETCH_ADVANCE_INST 3 3104 bl MterpShouldSwitchInterpreters 3105 cbnz w0, MterpFallback 3106 GET_INST_OPCODE ip 3107 GOTO_OPCODE ip 3108 3109 3110 3111 /* ------------------------------ */ 3112 .balign 128 3113 .L_op_invoke_static_range: /* 0x77 */ 3114 /* File: arm64/op_invoke_static_range.S */ 3115 /* File: arm64/invoke.S */ 3116 /* 3117 * Generic invoke handler wrapper. 3118 */ 3119 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3120 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3121 .extern MterpInvokeStaticRange 3122 EXPORT_PC 3123 mov x0, xSELF 3124 add x1, xFP, #OFF_FP_SHADOWFRAME 3125 mov x2, xPC 3126 mov x3, xINST 3127 bl MterpInvokeStaticRange 3128 cbz w0, MterpException 3129 FETCH_ADVANCE_INST 3 3130 bl MterpShouldSwitchInterpreters 3131 cbnz w0, MterpFallback 3132 GET_INST_OPCODE ip 3133 GOTO_OPCODE ip 3134 3135 3136 3137 /* ------------------------------ */ 3138 .balign 128 3139 .L_op_invoke_interface_range: /* 0x78 */ 3140 /* File: arm64/op_invoke_interface_range.S */ 3141 /* File: arm64/invoke.S */ 3142 /* 3143 * Generic invoke handler wrapper. 3144 */ 3145 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3146 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3147 .extern MterpInvokeInterfaceRange 3148 EXPORT_PC 3149 mov x0, xSELF 3150 add x1, xFP, #OFF_FP_SHADOWFRAME 3151 mov x2, xPC 3152 mov x3, xINST 3153 bl MterpInvokeInterfaceRange 3154 cbz w0, MterpException 3155 FETCH_ADVANCE_INST 3 3156 bl MterpShouldSwitchInterpreters 3157 cbnz w0, MterpFallback 3158 GET_INST_OPCODE ip 3159 GOTO_OPCODE ip 3160 3161 3162 3163 /* ------------------------------ */ 3164 .balign 128 3165 .L_op_unused_79: /* 0x79 */ 3166 /* File: arm64/op_unused_79.S */ 3167 /* File: arm64/unused.S */ 3168 /* 3169 * Bail to reference interpreter to throw. 3170 */ 3171 b MterpFallback 3172 3173 3174 /* ------------------------------ */ 3175 .balign 128 3176 .L_op_unused_7a: /* 0x7a */ 3177 /* File: arm64/op_unused_7a.S */ 3178 /* File: arm64/unused.S */ 3179 /* 3180 * Bail to reference interpreter to throw. 3181 */ 3182 b MterpFallback 3183 3184 3185 /* ------------------------------ */ 3186 .balign 128 3187 .L_op_neg_int: /* 0x7b */ 3188 /* File: arm64/op_neg_int.S */ 3189 /* File: arm64/unop.S */ 3190 /* 3191 * Generic 32-bit unary operation. Provide an "instr" line that 3192 * specifies an instruction that performs "result = op w0". 3193 * This could be an ARM instruction or a function call. 3194 * 3195 * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3196 * int-to-byte, int-to-char, int-to-short 3197 */ 3198 /* unop vA, vB */ 3199 lsr w3, wINST, #12 // w3<- B 3200 GET_VREG w0, w3 // w0<- vB 3201 ubfx w9, wINST, #8, #4 // w9<- A 3202 // optional op; may set condition codes 3203 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 3204 sub w0, wzr, w0 // w0<- op, w0-w3 changed 3205 GET_INST_OPCODE ip // extract opcode from rINST 3206 SET_VREG w0, w9 // vAA<- w0 3207 GOTO_OPCODE ip // jump to next instruction 3208 /* 8-9 instructions */ 3209 3210 3211 /* ------------------------------ */ 3212 .balign 128 3213 .L_op_not_int: /* 0x7c */ 3214 /* File: arm64/op_not_int.S */ 3215 /* File: arm64/unop.S */ 3216 /* 3217 * Generic 32-bit unary operation. Provide an "instr" line that 3218 * specifies an instruction that performs "result = op w0". 3219 * This could be an ARM instruction or a function call. 3220 * 3221 * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3222 * int-to-byte, int-to-char, int-to-short 3223 */ 3224 /* unop vA, vB */ 3225 lsr w3, wINST, #12 // w3<- B 3226 GET_VREG w0, w3 // w0<- vB 3227 ubfx w9, wINST, #8, #4 // w9<- A 3228 // optional op; may set condition codes 3229 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 3230 mvn w0, w0 // w0<- op, w0-w3 changed 3231 GET_INST_OPCODE ip // extract opcode from rINST 3232 SET_VREG w0, w9 // vAA<- w0 3233 GOTO_OPCODE ip // jump to next instruction 3234 /* 8-9 instructions */ 3235 3236 3237 /* ------------------------------ */ 3238 .balign 128 3239 .L_op_neg_long: /* 0x7d */ 3240 /* File: arm64/op_neg_long.S */ 3241 /* File: arm64/unopWide.S */ 3242 /* 3243 * Generic 64-bit unary operation. Provide an "instr" line that 3244 * specifies an instruction that performs "result = op x0". 3245 * 3246 * For: neg-long, not-long 3247 */ 3248 /* unop vA, vB */ 3249 lsr w3, wINST, #12 // w3<- B 3250 ubfx w4, wINST, #8, #4 // w4<- A 3251 GET_VREG_WIDE x0, w3 3252 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 3253 3254 sub x0, xzr, x0 3255 GET_INST_OPCODE ip // extract opcode from wINST 3256 SET_VREG_WIDE x0, w4 3257 GOTO_OPCODE ip // jump to next instruction 3258 /* 10-11 instructions */ 3259 3260 3261 /* ------------------------------ */ 3262 .balign 128 3263 .L_op_not_long: /* 0x7e */ 3264 /* File: arm64/op_not_long.S */ 3265 /* File: arm64/unopWide.S */ 3266 /* 3267 * Generic 64-bit unary operation. Provide an "instr" line that 3268 * specifies an instruction that performs "result = op x0". 3269 * 3270 * For: neg-long, not-long 3271 */ 3272 /* unop vA, vB */ 3273 lsr w3, wINST, #12 // w3<- B 3274 ubfx w4, wINST, #8, #4 // w4<- A 3275 GET_VREG_WIDE x0, w3 3276 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 3277 3278 mvn x0, x0 3279 GET_INST_OPCODE ip // extract opcode from wINST 3280 SET_VREG_WIDE x0, w4 3281 GOTO_OPCODE ip // jump to next instruction 3282 /* 10-11 instructions */ 3283 3284 3285 /* ------------------------------ */ 3286 .balign 128 3287 .L_op_neg_float: /* 0x7f */ 3288 /* File: arm64/op_neg_float.S */ 3289 /* File: arm64/unop.S */ 3290 /* 3291 * Generic 32-bit unary operation. Provide an "instr" line that 3292 * specifies an instruction that performs "result = op w0". 3293 * This could be an ARM instruction or a function call. 3294 * 3295 * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3296 * int-to-byte, int-to-char, int-to-short 3297 */ 3298 /* unop vA, vB */ 3299 lsr w3, wINST, #12 // w3<- B 3300 GET_VREG w0, w3 // w0<- vB 3301 ubfx w9, wINST, #8, #4 // w9<- A 3302 mov w4, #0x80000000 // optional op; may set condition codes 3303 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 3304 add w0, w0, w4 // w0<- op, w0-w3 changed 3305 GET_INST_OPCODE ip // extract opcode from rINST 3306 SET_VREG w0, w9 // vAA<- w0 3307 GOTO_OPCODE ip // jump to next instruction 3308 /* 8-9 instructions */ 3309 3310 3311 /* ------------------------------ */ 3312 .balign 128 3313 .L_op_neg_double: /* 0x80 */ 3314 /* File: arm64/op_neg_double.S */ 3315 /* File: arm64/unopWide.S */ 3316 /* 3317 * Generic 64-bit unary operation. Provide an "instr" line that 3318 * specifies an instruction that performs "result = op x0". 3319 * 3320 * For: neg-long, not-long 3321 */ 3322 /* unop vA, vB */ 3323 lsr w3, wINST, #12 // w3<- B 3324 ubfx w4, wINST, #8, #4 // w4<- A 3325 GET_VREG_WIDE x0, w3 3326 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 3327 mov x1, #0x8000000000000000 3328 add x0, x0, x1 3329 GET_INST_OPCODE ip // extract opcode from wINST 3330 SET_VREG_WIDE x0, w4 3331 GOTO_OPCODE ip // jump to next instruction 3332 /* 10-11 instructions */ 3333 3334 3335 /* ------------------------------ */ 3336 .balign 128 3337 .L_op_int_to_long: /* 0x81 */ 3338 /* File: arm64/op_int_to_long.S */ 3339 /* File: arm64/funopWider.S */ 3340 /* 3341 * Generic 32bit-to-64bit floating point unary operation. Provide an 3342 * "instr" line that specifies an instruction that performs "x0 = op w0". 3343 * 3344 * For: int-to-double, float-to-double, float-to-long 3345 */ 3346 /* unop vA, vB */ 3347 lsr w3, wINST, #12 // w3<- B 3348 lsr w4, wINST, #8 // w4<- A+ 3349 GET_VREG w0, w3 3350 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 3351 and w4, w4, #15 // w4<- A 3352 sbfm x0, x0, 0, 31 // d0<- op 3353 GET_INST_OPCODE ip // extract opcode from wINST 3354 SET_VREG_WIDE x0, w4 // vA<- d0 3355 GOTO_OPCODE ip // jump to next instruction 3356 3357 3358 /* ------------------------------ */ 3359 .balign 128 3360 .L_op_int_to_float: /* 0x82 */ 3361 /* File: arm64/op_int_to_float.S */ 3362 /* File: arm64/funopNarrow.S */ 3363 /* 3364 * Generic 32bit-to-32bit floating point unary operation. Provide an 3365 * "instr" line that specifies an instruction that performs "s0 = op w0". 3366 * 3367 * For: int-to-float, float-to-int 3368 * TODO: refactor all of the conversions - parameterize width and use same template. 3369 */ 3370 /* unop vA, vB */ 3371 lsr w3, wINST, #12 // w3<- B 3372 lsr w4, wINST, #8 // w4<- A+ 3373 GET_VREG w0, w3 3374 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 3375 and w4, w4, #15 // w4<- A 3376 scvtf s0, w0 // d0<- op 3377 GET_INST_OPCODE ip // extract opcode from wINST 3378 SET_VREG s0, w4 // vA<- d0 3379 GOTO_OPCODE ip // jump to next instruction 3380 3381 3382 /* ------------------------------ */ 3383 .balign 128 3384 .L_op_int_to_double: /* 0x83 */ 3385 /* File: arm64/op_int_to_double.S */ 3386 /* File: arm64/funopWider.S */ 3387 /* 3388 * Generic 32bit-to-64bit floating point unary operation. Provide an 3389 * "instr" line that specifies an instruction that performs "d0 = op w0". 3390 * 3391 * For: int-to-double, float-to-double, float-to-long 3392 */ 3393 /* unop vA, vB */ 3394 lsr w3, wINST, #12 // w3<- B 3395 lsr w4, wINST, #8 // w4<- A+ 3396 GET_VREG w0, w3 3397 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 3398 and w4, w4, #15 // w4<- A 3399 scvtf d0, w0 // d0<- op 3400 GET_INST_OPCODE ip // extract opcode from wINST 3401 SET_VREG_WIDE d0, w4 // vA<- d0 3402 GOTO_OPCODE ip // jump to next instruction 3403 3404 3405 /* ------------------------------ */ 3406 .balign 128 3407 .L_op_long_to_int: /* 0x84 */ 3408 /* File: arm64/op_long_to_int.S */ 3409 /* File: arm64/funopNarrower.S */ 3410 /* 3411 * Generic 64bit-to-32bit floating point unary operation. Provide an 3412 * "instr" line that specifies an instruction that performs "w0 = op x0". 3413 * 3414 * For: int-to-double, float-to-double, float-to-long 3415 */ 3416 /* unop vA, vB */ 3417 lsr w3, wINST, #12 // w3<- B 3418 lsr w4, wINST, #8 // w4<- A+ 3419 GET_VREG_WIDE x0, w3 3420 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 3421 and w4, w4, #15 // w4<- A 3422 // d0<- op 3423 GET_INST_OPCODE ip // extract opcode from wINST 3424 SET_VREG w0, w4 // vA<- d0 3425 GOTO_OPCODE ip // jump to next instruction 3426 3427 3428 /* ------------------------------ */ 3429 .balign 128 3430 .L_op_long_to_float: /* 0x85 */ 3431 /* File: arm64/op_long_to_float.S */ 3432 /* File: arm64/funopNarrower.S */ 3433 /* 3434 * Generic 64bit-to-32bit floating point unary operation. Provide an 3435 * "instr" line that specifies an instruction that performs "s0 = op x0". 3436 * 3437 * For: int-to-double, float-to-double, float-to-long 3438 */ 3439 /* unop vA, vB */ 3440 lsr w3, wINST, #12 // w3<- B 3441 lsr w4, wINST, #8 // w4<- A+ 3442 GET_VREG_WIDE x0, w3 3443 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 3444 and w4, w4, #15 // w4<- A 3445 scvtf s0, x0 // d0<- op 3446 GET_INST_OPCODE ip // extract opcode from wINST 3447 SET_VREG s0, w4 // vA<- d0 3448 GOTO_OPCODE ip // jump to next instruction 3449 3450 3451 /* ------------------------------ */ 3452 .balign 128 3453 .L_op_long_to_double: /* 0x86 */ 3454 /* File: arm64/op_long_to_double.S */ 3455 /* File: arm64/funopWide.S */ 3456 /* 3457 * Generic 64bit-to-64bit floating point unary operation. Provide an 3458 * "instr" line that specifies an instruction that performs "d0 = op x0". 3459 * 3460 * For: long-to-double, double-to-long 3461 */ 3462 /* unop vA, vB */ 3463 lsr w3, wINST, #12 // w3<- B 3464 lsr w4, wINST, #8 // w4<- A+ 3465 GET_VREG_WIDE x0, w3 3466 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 3467 and w4, w4, #15 // w4<- A 3468 scvtf d0, x0 // d0<- op 3469 GET_INST_OPCODE ip // extract opcode from wINST 3470 SET_VREG_WIDE d0, w4 // vA<- d0 3471 GOTO_OPCODE ip // jump to next instruction 3472 3473 3474 /* ------------------------------ */ 3475 .balign 128 3476 .L_op_float_to_int: /* 0x87 */ 3477 /* File: arm64/op_float_to_int.S */ 3478 /* File: arm64/funopNarrow.S */ 3479 /* 3480 * Generic 32bit-to-32bit floating point unary operation. Provide an 3481 * "instr" line that specifies an instruction that performs "w0 = op s0". 3482 * 3483 * For: int-to-float, float-to-int 3484 * TODO: refactor all of the conversions - parameterize width and use same template. 3485 */ 3486 /* unop vA, vB */ 3487 lsr w3, wINST, #12 // w3<- B 3488 lsr w4, wINST, #8 // w4<- A+ 3489 GET_VREG s0, w3 3490 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 3491 and w4, w4, #15 // w4<- A 3492 fcvtzs w0, s0 // d0<- op 3493 GET_INST_OPCODE ip // extract opcode from wINST 3494 SET_VREG w0, w4 // vA<- d0 3495 GOTO_OPCODE ip // jump to next instruction 3496 3497 3498 /* ------------------------------ */ 3499 .balign 128 3500 .L_op_float_to_long: /* 0x88 */ 3501 /* File: arm64/op_float_to_long.S */ 3502 /* File: arm64/funopWider.S */ 3503 /* 3504 * Generic 32bit-to-64bit floating point unary operation. Provide an 3505 * "instr" line that specifies an instruction that performs "x0 = op s0". 3506 * 3507 * For: int-to-double, float-to-double, float-to-long 3508 */ 3509 /* unop vA, vB */ 3510 lsr w3, wINST, #12 // w3<- B 3511 lsr w4, wINST, #8 // w4<- A+ 3512 GET_VREG s0, w3 3513 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 3514 and w4, w4, #15 // w4<- A 3515 fcvtzs x0, s0 // d0<- op 3516 GET_INST_OPCODE ip // extract opcode from wINST 3517 SET_VREG_WIDE x0, w4 // vA<- d0 3518 GOTO_OPCODE ip // jump to next instruction 3519 3520 3521 /* ------------------------------ */ 3522 .balign 128 3523 .L_op_float_to_double: /* 0x89 */ 3524 /* File: arm64/op_float_to_double.S */ 3525 /* File: arm64/funopWider.S */ 3526 /* 3527 * Generic 32bit-to-64bit floating point unary operation. Provide an 3528 * "instr" line that specifies an instruction that performs "d0 = op s0". 3529 * 3530 * For: int-to-double, float-to-double, float-to-long 3531 */ 3532 /* unop vA, vB */ 3533 lsr w3, wINST, #12 // w3<- B 3534 lsr w4, wINST, #8 // w4<- A+ 3535 GET_VREG s0, w3 3536 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 3537 and w4, w4, #15 // w4<- A 3538 fcvt d0, s0 // d0<- op 3539 GET_INST_OPCODE ip // extract opcode from wINST 3540 SET_VREG_WIDE d0, w4 // vA<- d0 3541 GOTO_OPCODE ip // jump to next instruction 3542 3543 3544 /* ------------------------------ */ 3545 .balign 128 3546 .L_op_double_to_int: /* 0x8a */ 3547 /* File: arm64/op_double_to_int.S */ 3548 /* File: arm64/funopNarrower.S */ 3549 /* 3550 * Generic 64bit-to-32bit floating point unary operation. Provide an 3551 * "instr" line that specifies an instruction that performs "w0 = op d0". 3552 * 3553 * For: int-to-double, float-to-double, float-to-long 3554 */ 3555 /* unop vA, vB */ 3556 lsr w3, wINST, #12 // w3<- B 3557 lsr w4, wINST, #8 // w4<- A+ 3558 GET_VREG_WIDE d0, w3 3559 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 3560 and w4, w4, #15 // w4<- A 3561 fcvtzs w0, d0 // d0<- op 3562 GET_INST_OPCODE ip // extract opcode from wINST 3563 SET_VREG w0, w4 // vA<- d0 3564 GOTO_OPCODE ip // jump to next instruction 3565 3566 3567 /* ------------------------------ */ 3568 .balign 128 3569 .L_op_double_to_long: /* 0x8b */ 3570 /* File: arm64/op_double_to_long.S */ 3571 /* File: arm64/funopWide.S */ 3572 /* 3573 * Generic 64bit-to-64bit floating point unary operation. Provide an 3574 * "instr" line that specifies an instruction that performs "x0 = op d0". 3575 * 3576 * For: long-to-double, double-to-long 3577 */ 3578 /* unop vA, vB */ 3579 lsr w3, wINST, #12 // w3<- B 3580 lsr w4, wINST, #8 // w4<- A+ 3581 GET_VREG_WIDE d0, w3 3582 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 3583 and w4, w4, #15 // w4<- A 3584 fcvtzs x0, d0 // d0<- op 3585 GET_INST_OPCODE ip // extract opcode from wINST 3586 SET_VREG_WIDE x0, w4 // vA<- d0 3587 GOTO_OPCODE ip // jump to next instruction 3588 3589 3590 /* ------------------------------ */ 3591 .balign 128 3592 .L_op_double_to_float: /* 0x8c */ 3593 /* File: arm64/op_double_to_float.S */ 3594 /* File: arm64/funopNarrower.S */ 3595 /* 3596 * Generic 64bit-to-32bit floating point unary operation. Provide an 3597 * "instr" line that specifies an instruction that performs "s0 = op d0". 3598 * 3599 * For: int-to-double, float-to-double, float-to-long 3600 */ 3601 /* unop vA, vB */ 3602 lsr w3, wINST, #12 // w3<- B 3603 lsr w4, wINST, #8 // w4<- A+ 3604 GET_VREG_WIDE d0, w3 3605 FETCH_ADVANCE_INST 1 // advance rPC, load wINST 3606 and w4, w4, #15 // w4<- A 3607 fcvt s0, d0 // d0<- op 3608 GET_INST_OPCODE ip // extract opcode from wINST 3609 SET_VREG s0, w4 // vA<- d0 3610 GOTO_OPCODE ip // jump to next instruction 3611 3612 3613 /* ------------------------------ */ 3614 .balign 128 3615 .L_op_int_to_byte: /* 0x8d */ 3616 /* File: arm64/op_int_to_byte.S */ 3617 /* File: arm64/unop.S */ 3618 /* 3619 * Generic 32-bit unary operation. Provide an "instr" line that 3620 * specifies an instruction that performs "result = op w0". 3621 * This could be an ARM instruction or a function call. 3622 * 3623 * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3624 * int-to-byte, int-to-char, int-to-short 3625 */ 3626 /* unop vA, vB */ 3627 lsr w3, wINST, #12 // w3<- B 3628 GET_VREG w0, w3 // w0<- vB 3629 ubfx w9, wINST, #8, #4 // w9<- A 3630 // optional op; may set condition codes 3631 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 3632 sxtb w0, w0 // w0<- op, w0-w3 changed 3633 GET_INST_OPCODE ip // extract opcode from rINST 3634 SET_VREG w0, w9 // vAA<- w0 3635 GOTO_OPCODE ip // jump to next instruction 3636 /* 8-9 instructions */ 3637 3638 3639 /* ------------------------------ */ 3640 .balign 128 3641 .L_op_int_to_char: /* 0x8e */ 3642 /* File: arm64/op_int_to_char.S */ 3643 /* File: arm64/unop.S */ 3644 /* 3645 * Generic 32-bit unary operation. Provide an "instr" line that 3646 * specifies an instruction that performs "result = op w0". 3647 * This could be an ARM instruction or a function call. 3648 * 3649 * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3650 * int-to-byte, int-to-char, int-to-short 3651 */ 3652 /* unop vA, vB */ 3653 lsr w3, wINST, #12 // w3<- B 3654 GET_VREG w0, w3 // w0<- vB 3655 ubfx w9, wINST, #8, #4 // w9<- A 3656 // optional op; may set condition codes 3657 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 3658 uxth w0, w0 // w0<- op, w0-w3 changed 3659 GET_INST_OPCODE ip // extract opcode from rINST 3660 SET_VREG w0, w9 // vAA<- w0 3661 GOTO_OPCODE ip // jump to next instruction 3662 /* 8-9 instructions */ 3663 3664 3665 /* ------------------------------ */ 3666 .balign 128 3667 .L_op_int_to_short: /* 0x8f */ 3668 /* File: arm64/op_int_to_short.S */ 3669 /* File: arm64/unop.S */ 3670 /* 3671 * Generic 32-bit unary operation. Provide an "instr" line that 3672 * specifies an instruction that performs "result = op w0". 3673 * This could be an ARM instruction or a function call. 3674 * 3675 * for: neg-int, not-int, neg-float, int-to-float, float-to-int, 3676 * int-to-byte, int-to-char, int-to-short 3677 */ 3678 /* unop vA, vB */ 3679 lsr w3, wINST, #12 // w3<- B 3680 GET_VREG w0, w3 // w0<- vB 3681 ubfx w9, wINST, #8, #4 // w9<- A 3682 // optional op; may set condition codes 3683 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 3684 sxth w0, w0 // w0<- op, w0-w3 changed 3685 GET_INST_OPCODE ip // extract opcode from rINST 3686 SET_VREG w0, w9 // vAA<- w0 3687 GOTO_OPCODE ip // jump to next instruction 3688 /* 8-9 instructions */ 3689 3690 3691 /* ------------------------------ */ 3692 .balign 128 3693 .L_op_add_int: /* 0x90 */ 3694 /* File: arm64/op_add_int.S */ 3695 /* File: arm64/binop.S */ 3696 /* 3697 * Generic 32-bit binary operation. Provide an "instr" line that 3698 * specifies an instruction that performs "result = w0 op w1". 3699 * This could be an ARM instruction or a function call. (If the result 3700 * comes back in a register other than w0, you can override "result".) 3701 * 3702 * If "chkzero" is set to 1, we perform a divide-by-zero check on 3703 * vCC (w1). Useful for integer division and modulus. Note that we 3704 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 3705 * handles it correctly. 3706 * 3707 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 3708 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 3709 * mul-float, div-float, rem-float 3710 */ 3711 /* binop vAA, vBB, vCC */ 3712 FETCH w0, 1 // w0<- CCBB 3713 lsr w9, wINST, #8 // w9<- AA 3714 lsr w3, w0, #8 // w3<- CC 3715 and w2, w0, #255 // w2<- BB 3716 GET_VREG w1, w3 // w1<- vCC 3717 GET_VREG w0, w2 // w0<- vBB 3718 .if 0 3719 cbz w1, common_errDivideByZero // is second operand zero? 3720 .endif 3721 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 3722 // optional op; may set condition codes 3723 add w0, w0, w1 // w0<- op, w0-w3 changed 3724 GET_INST_OPCODE ip // extract opcode from rINST 3725 SET_VREG w0, w9 // vAA<- w0 3726 GOTO_OPCODE ip // jump to next instruction 3727 /* 11-14 instructions */ 3728 3729 3730 /* ------------------------------ */ 3731 .balign 128 3732 .L_op_sub_int: /* 0x91 */ 3733 /* File: arm64/op_sub_int.S */ 3734 /* File: arm64/binop.S */ 3735 /* 3736 * Generic 32-bit binary operation. Provide an "instr" line that 3737 * specifies an instruction that performs "result = w0 op w1". 3738 * This could be an ARM instruction or a function call. (If the result 3739 * comes back in a register other than w0, you can override "result".) 3740 * 3741 * If "chkzero" is set to 1, we perform a divide-by-zero check on 3742 * vCC (w1). Useful for integer division and modulus. Note that we 3743 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 3744 * handles it correctly. 3745 * 3746 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 3747 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 3748 * mul-float, div-float, rem-float 3749 */ 3750 /* binop vAA, vBB, vCC */ 3751 FETCH w0, 1 // w0<- CCBB 3752 lsr w9, wINST, #8 // w9<- AA 3753 lsr w3, w0, #8 // w3<- CC 3754 and w2, w0, #255 // w2<- BB 3755 GET_VREG w1, w3 // w1<- vCC 3756 GET_VREG w0, w2 // w0<- vBB 3757 .if 0 3758 cbz w1, common_errDivideByZero // is second operand zero? 3759 .endif 3760 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 3761 // optional op; may set condition codes 3762 sub w0, w0, w1 // w0<- op, w0-w3 changed 3763 GET_INST_OPCODE ip // extract opcode from rINST 3764 SET_VREG w0, w9 // vAA<- w0 3765 GOTO_OPCODE ip // jump to next instruction 3766 /* 11-14 instructions */ 3767 3768 3769 /* ------------------------------ */ 3770 .balign 128 3771 .L_op_mul_int: /* 0x92 */ 3772 /* File: arm64/op_mul_int.S */ 3773 /* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */ 3774 /* File: arm64/binop.S */ 3775 /* 3776 * Generic 32-bit binary operation. Provide an "instr" line that 3777 * specifies an instruction that performs "result = w0 op w1". 3778 * This could be an ARM instruction or a function call. (If the result 3779 * comes back in a register other than w0, you can override "result".) 3780 * 3781 * If "chkzero" is set to 1, we perform a divide-by-zero check on 3782 * vCC (w1). Useful for integer division and modulus. Note that we 3783 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 3784 * handles it correctly. 3785 * 3786 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 3787 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 3788 * mul-float, div-float, rem-float 3789 */ 3790 /* binop vAA, vBB, vCC */ 3791 FETCH w0, 1 // w0<- CCBB 3792 lsr w9, wINST, #8 // w9<- AA 3793 lsr w3, w0, #8 // w3<- CC 3794 and w2, w0, #255 // w2<- BB 3795 GET_VREG w1, w3 // w1<- vCC 3796 GET_VREG w0, w2 // w0<- vBB 3797 .if 0 3798 cbz w1, common_errDivideByZero // is second operand zero? 3799 .endif 3800 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 3801 // optional op; may set condition codes 3802 mul w0, w1, w0 // w0<- op, w0-w3 changed 3803 GET_INST_OPCODE ip // extract opcode from rINST 3804 SET_VREG w0, w9 // vAA<- w0 3805 GOTO_OPCODE ip // jump to next instruction 3806 /* 11-14 instructions */ 3807 3808 3809 /* ------------------------------ */ 3810 .balign 128 3811 .L_op_div_int: /* 0x93 */ 3812 /* File: arm64/op_div_int.S */ 3813 /* File: arm64/binop.S */ 3814 /* 3815 * Generic 32-bit binary operation. Provide an "instr" line that 3816 * specifies an instruction that performs "result = w0 op w1". 3817 * This could be an ARM instruction or a function call. (If the result 3818 * comes back in a register other than w0, you can override "result".) 3819 * 3820 * If "chkzero" is set to 1, we perform a divide-by-zero check on 3821 * vCC (w1). Useful for integer division and modulus. Note that we 3822 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 3823 * handles it correctly. 3824 * 3825 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 3826 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 3827 * mul-float, div-float, rem-float 3828 */ 3829 /* binop vAA, vBB, vCC */ 3830 FETCH w0, 1 // w0<- CCBB 3831 lsr w9, wINST, #8 // w9<- AA 3832 lsr w3, w0, #8 // w3<- CC 3833 and w2, w0, #255 // w2<- BB 3834 GET_VREG w1, w3 // w1<- vCC 3835 GET_VREG w0, w2 // w0<- vBB 3836 .if 1 3837 cbz w1, common_errDivideByZero // is second operand zero? 3838 .endif 3839 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 3840 // optional op; may set condition codes 3841 sdiv w0, w0, w1 // w0<- op, w0-w3 changed 3842 GET_INST_OPCODE ip // extract opcode from rINST 3843 SET_VREG w0, w9 // vAA<- w0 3844 GOTO_OPCODE ip // jump to next instruction 3845 /* 11-14 instructions */ 3846 3847 3848 /* ------------------------------ */ 3849 .balign 128 3850 .L_op_rem_int: /* 0x94 */ 3851 /* File: arm64/op_rem_int.S */ 3852 /* File: arm64/binop.S */ 3853 /* 3854 * Generic 32-bit binary operation. Provide an "instr" line that 3855 * specifies an instruction that performs "result = w0 op w1". 3856 * This could be an ARM instruction or a function call. (If the result 3857 * comes back in a register other than w0, you can override "result".) 3858 * 3859 * If "chkzero" is set to 1, we perform a divide-by-zero check on 3860 * vCC (w1). Useful for integer division and modulus. Note that we 3861 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 3862 * handles it correctly. 3863 * 3864 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 3865 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 3866 * mul-float, div-float, rem-float 3867 */ 3868 /* binop vAA, vBB, vCC */ 3869 FETCH w0, 1 // w0<- CCBB 3870 lsr w9, wINST, #8 // w9<- AA 3871 lsr w3, w0, #8 // w3<- CC 3872 and w2, w0, #255 // w2<- BB 3873 GET_VREG w1, w3 // w1<- vCC 3874 GET_VREG w0, w2 // w0<- vBB 3875 .if 1 3876 cbz w1, common_errDivideByZero // is second operand zero? 3877 .endif 3878 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 3879 sdiv w2, w0, w1 // optional op; may set condition codes 3880 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed 3881 GET_INST_OPCODE ip // extract opcode from rINST 3882 SET_VREG w0, w9 // vAA<- w0 3883 GOTO_OPCODE ip // jump to next instruction 3884 /* 11-14 instructions */ 3885 3886 3887 /* ------------------------------ */ 3888 .balign 128 3889 .L_op_and_int: /* 0x95 */ 3890 /* File: arm64/op_and_int.S */ 3891 /* File: arm64/binop.S */ 3892 /* 3893 * Generic 32-bit binary operation. Provide an "instr" line that 3894 * specifies an instruction that performs "result = w0 op w1". 3895 * This could be an ARM instruction or a function call. (If the result 3896 * comes back in a register other than w0, you can override "result".) 3897 * 3898 * If "chkzero" is set to 1, we perform a divide-by-zero check on 3899 * vCC (w1). Useful for integer division and modulus. Note that we 3900 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 3901 * handles it correctly. 3902 * 3903 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 3904 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 3905 * mul-float, div-float, rem-float 3906 */ 3907 /* binop vAA, vBB, vCC */ 3908 FETCH w0, 1 // w0<- CCBB 3909 lsr w9, wINST, #8 // w9<- AA 3910 lsr w3, w0, #8 // w3<- CC 3911 and w2, w0, #255 // w2<- BB 3912 GET_VREG w1, w3 // w1<- vCC 3913 GET_VREG w0, w2 // w0<- vBB 3914 .if 0 3915 cbz w1, common_errDivideByZero // is second operand zero? 3916 .endif 3917 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 3918 // optional op; may set condition codes 3919 and w0, w0, w1 // w0<- op, w0-w3 changed 3920 GET_INST_OPCODE ip // extract opcode from rINST 3921 SET_VREG w0, w9 // vAA<- w0 3922 GOTO_OPCODE ip // jump to next instruction 3923 /* 11-14 instructions */ 3924 3925 3926 /* ------------------------------ */ 3927 .balign 128 3928 .L_op_or_int: /* 0x96 */ 3929 /* File: arm64/op_or_int.S */ 3930 /* File: arm64/binop.S */ 3931 /* 3932 * Generic 32-bit binary operation. Provide an "instr" line that 3933 * specifies an instruction that performs "result = w0 op w1". 3934 * This could be an ARM instruction or a function call. (If the result 3935 * comes back in a register other than w0, you can override "result".) 3936 * 3937 * If "chkzero" is set to 1, we perform a divide-by-zero check on 3938 * vCC (w1). Useful for integer division and modulus. Note that we 3939 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 3940 * handles it correctly. 3941 * 3942 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 3943 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 3944 * mul-float, div-float, rem-float 3945 */ 3946 /* binop vAA, vBB, vCC */ 3947 FETCH w0, 1 // w0<- CCBB 3948 lsr w9, wINST, #8 // w9<- AA 3949 lsr w3, w0, #8 // w3<- CC 3950 and w2, w0, #255 // w2<- BB 3951 GET_VREG w1, w3 // w1<- vCC 3952 GET_VREG w0, w2 // w0<- vBB 3953 .if 0 3954 cbz w1, common_errDivideByZero // is second operand zero? 3955 .endif 3956 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 3957 // optional op; may set condition codes 3958 orr w0, w0, w1 // w0<- op, w0-w3 changed 3959 GET_INST_OPCODE ip // extract opcode from rINST 3960 SET_VREG w0, w9 // vAA<- w0 3961 GOTO_OPCODE ip // jump to next instruction 3962 /* 11-14 instructions */ 3963 3964 3965 /* ------------------------------ */ 3966 .balign 128 3967 .L_op_xor_int: /* 0x97 */ 3968 /* File: arm64/op_xor_int.S */ 3969 /* File: arm64/binop.S */ 3970 /* 3971 * Generic 32-bit binary operation. Provide an "instr" line that 3972 * specifies an instruction that performs "result = w0 op w1". 3973 * This could be an ARM instruction or a function call. (If the result 3974 * comes back in a register other than w0, you can override "result".) 3975 * 3976 * If "chkzero" is set to 1, we perform a divide-by-zero check on 3977 * vCC (w1). Useful for integer division and modulus. Note that we 3978 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 3979 * handles it correctly. 3980 * 3981 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 3982 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 3983 * mul-float, div-float, rem-float 3984 */ 3985 /* binop vAA, vBB, vCC */ 3986 FETCH w0, 1 // w0<- CCBB 3987 lsr w9, wINST, #8 // w9<- AA 3988 lsr w3, w0, #8 // w3<- CC 3989 and w2, w0, #255 // w2<- BB 3990 GET_VREG w1, w3 // w1<- vCC 3991 GET_VREG w0, w2 // w0<- vBB 3992 .if 0 3993 cbz w1, common_errDivideByZero // is second operand zero? 3994 .endif 3995 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 3996 // optional op; may set condition codes 3997 eor w0, w0, w1 // w0<- op, w0-w3 changed 3998 GET_INST_OPCODE ip // extract opcode from rINST 3999 SET_VREG w0, w9 // vAA<- w0 4000 GOTO_OPCODE ip // jump to next instruction 4001 /* 11-14 instructions */ 4002 4003 4004 /* ------------------------------ */ 4005 .balign 128 4006 .L_op_shl_int: /* 0x98 */ 4007 /* File: arm64/op_shl_int.S */ 4008 /* File: arm64/binop.S */ 4009 /* 4010 * Generic 32-bit binary operation. Provide an "instr" line that 4011 * specifies an instruction that performs "result = w0 op w1". 4012 * This could be an ARM instruction or a function call. (If the result 4013 * comes back in a register other than w0, you can override "result".) 4014 * 4015 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4016 * vCC (w1). Useful for integer division and modulus. Note that we 4017 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4018 * handles it correctly. 4019 * 4020 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4021 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4022 * mul-float, div-float, rem-float 4023 */ 4024 /* binop vAA, vBB, vCC */ 4025 FETCH w0, 1 // w0<- CCBB 4026 lsr w9, wINST, #8 // w9<- AA 4027 lsr w3, w0, #8 // w3<- CC 4028 and w2, w0, #255 // w2<- BB 4029 GET_VREG w1, w3 // w1<- vCC 4030 GET_VREG w0, w2 // w0<- vBB 4031 .if 0 4032 cbz w1, common_errDivideByZero // is second operand zero? 4033 .endif 4034 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4035 and w1, w1, #31 // optional op; may set condition codes 4036 lsl w0, w0, w1 // w0<- op, w0-w3 changed 4037 GET_INST_OPCODE ip // extract opcode from rINST 4038 SET_VREG w0, w9 // vAA<- w0 4039 GOTO_OPCODE ip // jump to next instruction 4040 /* 11-14 instructions */ 4041 4042 4043 /* ------------------------------ */ 4044 .balign 128 4045 .L_op_shr_int: /* 0x99 */ 4046 /* File: arm64/op_shr_int.S */ 4047 /* File: arm64/binop.S */ 4048 /* 4049 * Generic 32-bit binary operation. Provide an "instr" line that 4050 * specifies an instruction that performs "result = w0 op w1". 4051 * This could be an ARM instruction or a function call. (If the result 4052 * comes back in a register other than w0, you can override "result".) 4053 * 4054 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4055 * vCC (w1). Useful for integer division and modulus. Note that we 4056 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4057 * handles it correctly. 4058 * 4059 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4060 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4061 * mul-float, div-float, rem-float 4062 */ 4063 /* binop vAA, vBB, vCC */ 4064 FETCH w0, 1 // w0<- CCBB 4065 lsr w9, wINST, #8 // w9<- AA 4066 lsr w3, w0, #8 // w3<- CC 4067 and w2, w0, #255 // w2<- BB 4068 GET_VREG w1, w3 // w1<- vCC 4069 GET_VREG w0, w2 // w0<- vBB 4070 .if 0 4071 cbz w1, common_errDivideByZero // is second operand zero? 4072 .endif 4073 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4074 and w1, w1, #31 // optional op; may set condition codes 4075 asr w0, w0, w1 // w0<- op, w0-w3 changed 4076 GET_INST_OPCODE ip // extract opcode from rINST 4077 SET_VREG w0, w9 // vAA<- w0 4078 GOTO_OPCODE ip // jump to next instruction 4079 /* 11-14 instructions */ 4080 4081 4082 /* ------------------------------ */ 4083 .balign 128 4084 .L_op_ushr_int: /* 0x9a */ 4085 /* File: arm64/op_ushr_int.S */ 4086 /* File: arm64/binop.S */ 4087 /* 4088 * Generic 32-bit binary operation. Provide an "instr" line that 4089 * specifies an instruction that performs "result = w0 op w1". 4090 * This could be an ARM instruction or a function call. (If the result 4091 * comes back in a register other than w0, you can override "result".) 4092 * 4093 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4094 * vCC (w1). Useful for integer division and modulus. Note that we 4095 * *don't* check for (INT_MIN / -1) here, because the ARM math lib 4096 * handles it correctly. 4097 * 4098 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int, 4099 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float, 4100 * mul-float, div-float, rem-float 4101 */ 4102 /* binop vAA, vBB, vCC */ 4103 FETCH w0, 1 // w0<- CCBB 4104 lsr w9, wINST, #8 // w9<- AA 4105 lsr w3, w0, #8 // w3<- CC 4106 and w2, w0, #255 // w2<- BB 4107 GET_VREG w1, w3 // w1<- vCC 4108 GET_VREG w0, w2 // w0<- vBB 4109 .if 0 4110 cbz w1, common_errDivideByZero // is second operand zero? 4111 .endif 4112 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4113 and w1, w1, #31 // optional op; may set condition codes 4114 lsr w0, w0, w1 // w0<- op, w0-w3 changed 4115 GET_INST_OPCODE ip // extract opcode from rINST 4116 SET_VREG w0, w9 // vAA<- w0 4117 GOTO_OPCODE ip // jump to next instruction 4118 /* 11-14 instructions */ 4119 4120 4121 /* ------------------------------ */ 4122 .balign 128 4123 .L_op_add_long: /* 0x9b */ 4124 /* File: arm64/op_add_long.S */ 4125 /* File: arm64/binopWide.S */ 4126 /* 4127 * Generic 64-bit binary operation. Provide an "instr" line that 4128 * specifies an instruction that performs "result = x1 op x2". 4129 * This could be an ARM instruction or a function call. (If the result 4130 * comes back in a register other than x0, you can override "result".) 4131 * 4132 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4133 * vCC (w1). Useful for integer division and modulus. 4134 * 4135 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long, 4136 * xor-long, add-double, sub-double, mul-double, div-double, rem-double 4137 */ 4138 /* binop vAA, vBB, vCC */ 4139 FETCH w0, 1 // w0<- CCBB 4140 lsr w4, wINST, #8 // w4<- AA 4141 lsr w2, w0, #8 // w2<- CC 4142 and w1, w0, #255 // w1<- BB 4143 GET_VREG_WIDE x2, w2 // w2<- vCC 4144 GET_VREG_WIDE x1, w1 // w1<- vBB 4145 .if 0 4146 cbz x2, common_errDivideByZero // is second operand zero? 4147 .endif 4148 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4149 4150 add x0, x1, x2 // x0<- op, w0-w4 changed 4151 GET_INST_OPCODE ip // extract opcode from rINST 4152 SET_VREG_WIDE x0, w4 // vAA<- x0 4153 GOTO_OPCODE ip // jump to next instruction 4154 /* 11-14 instructions */ 4155 4156 4157 /* ------------------------------ */ 4158 .balign 128 4159 .L_op_sub_long: /* 0x9c */ 4160 /* File: arm64/op_sub_long.S */ 4161 /* File: arm64/binopWide.S */ 4162 /* 4163 * Generic 64-bit binary operation. Provide an "instr" line that 4164 * specifies an instruction that performs "result = x1 op x2". 4165 * This could be an ARM instruction or a function call. (If the result 4166 * comes back in a register other than x0, you can override "result".) 4167 * 4168 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4169 * vCC (w1). Useful for integer division and modulus. 4170 * 4171 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long, 4172 * xor-long, add-double, sub-double, mul-double, div-double, rem-double 4173 */ 4174 /* binop vAA, vBB, vCC */ 4175 FETCH w0, 1 // w0<- CCBB 4176 lsr w4, wINST, #8 // w4<- AA 4177 lsr w2, w0, #8 // w2<- CC 4178 and w1, w0, #255 // w1<- BB 4179 GET_VREG_WIDE x2, w2 // w2<- vCC 4180 GET_VREG_WIDE x1, w1 // w1<- vBB 4181 .if 0 4182 cbz x2, common_errDivideByZero // is second operand zero? 4183 .endif 4184 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4185 4186 sub x0, x1, x2 // x0<- op, w0-w4 changed 4187 GET_INST_OPCODE ip // extract opcode from rINST 4188 SET_VREG_WIDE x0, w4 // vAA<- x0 4189 GOTO_OPCODE ip // jump to next instruction 4190 /* 11-14 instructions */ 4191 4192 4193 /* ------------------------------ */ 4194 .balign 128 4195 .L_op_mul_long: /* 0x9d */ 4196 /* File: arm64/op_mul_long.S */ 4197 /* File: arm64/binopWide.S */ 4198 /* 4199 * Generic 64-bit binary operation. Provide an "instr" line that 4200 * specifies an instruction that performs "result = x1 op x2". 4201 * This could be an ARM instruction or a function call. (If the result 4202 * comes back in a register other than x0, you can override "result".) 4203 * 4204 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4205 * vCC (w1). Useful for integer division and modulus. 4206 * 4207 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long, 4208 * xor-long, add-double, sub-double, mul-double, div-double, rem-double 4209 */ 4210 /* binop vAA, vBB, vCC */ 4211 FETCH w0, 1 // w0<- CCBB 4212 lsr w4, wINST, #8 // w4<- AA 4213 lsr w2, w0, #8 // w2<- CC 4214 and w1, w0, #255 // w1<- BB 4215 GET_VREG_WIDE x2, w2 // w2<- vCC 4216 GET_VREG_WIDE x1, w1 // w1<- vBB 4217 .if 0 4218 cbz x2, common_errDivideByZero // is second operand zero? 4219 .endif 4220 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4221 4222 mul x0, x1, x2 // x0<- op, w0-w4 changed 4223 GET_INST_OPCODE ip // extract opcode from rINST 4224 SET_VREG_WIDE x0, w4 // vAA<- x0 4225 GOTO_OPCODE ip // jump to next instruction 4226 /* 11-14 instructions */ 4227 4228 4229 /* ------------------------------ */ 4230 .balign 128 4231 .L_op_div_long: /* 0x9e */ 4232 /* File: arm64/op_div_long.S */ 4233 /* File: arm64/binopWide.S */ 4234 /* 4235 * Generic 64-bit binary operation. Provide an "instr" line that 4236 * specifies an instruction that performs "result = x1 op x2". 4237 * This could be an ARM instruction or a function call. (If the result 4238 * comes back in a register other than x0, you can override "result".) 4239 * 4240 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4241 * vCC (w1). Useful for integer division and modulus. 4242 * 4243 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long, 4244 * xor-long, add-double, sub-double, mul-double, div-double, rem-double 4245 */ 4246 /* binop vAA, vBB, vCC */ 4247 FETCH w0, 1 // w0<- CCBB 4248 lsr w4, wINST, #8 // w4<- AA 4249 lsr w2, w0, #8 // w2<- CC 4250 and w1, w0, #255 // w1<- BB 4251 GET_VREG_WIDE x2, w2 // w2<- vCC 4252 GET_VREG_WIDE x1, w1 // w1<- vBB 4253 .if 1 4254 cbz x2, common_errDivideByZero // is second operand zero? 4255 .endif 4256 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4257 4258 sdiv x0, x1, x2 // x0<- op, w0-w4 changed 4259 GET_INST_OPCODE ip // extract opcode from rINST 4260 SET_VREG_WIDE x0, w4 // vAA<- x0 4261 GOTO_OPCODE ip // jump to next instruction 4262 /* 11-14 instructions */ 4263 4264 4265 /* ------------------------------ */ 4266 .balign 128 4267 .L_op_rem_long: /* 0x9f */ 4268 /* File: arm64/op_rem_long.S */ 4269 /* File: arm64/binopWide.S */ 4270 /* 4271 * Generic 64-bit binary operation. Provide an "instr" line that 4272 * specifies an instruction that performs "result = x1 op x2". 4273 * This could be an ARM instruction or a function call. (If the result 4274 * comes back in a register other than x0, you can override "result".) 4275 * 4276 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4277 * vCC (w1). Useful for integer division and modulus. 4278 * 4279 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long, 4280 * xor-long, add-double, sub-double, mul-double, div-double, rem-double 4281 */ 4282 /* binop vAA, vBB, vCC */ 4283 FETCH w0, 1 // w0<- CCBB 4284 lsr w4, wINST, #8 // w4<- AA 4285 lsr w2, w0, #8 // w2<- CC 4286 and w1, w0, #255 // w1<- BB 4287 GET_VREG_WIDE x2, w2 // w2<- vCC 4288 GET_VREG_WIDE x1, w1 // w1<- vBB 4289 .if 1 4290 cbz x2, common_errDivideByZero // is second operand zero? 4291 .endif 4292 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4293 sdiv x3, x1, x2 4294 msub x0, x3, x2, x1 // x0<- op, w0-w4 changed 4295 GET_INST_OPCODE ip // extract opcode from rINST 4296 SET_VREG_WIDE x0, w4 // vAA<- x0 4297 GOTO_OPCODE ip // jump to next instruction 4298 /* 11-14 instructions */ 4299 4300 4301 /* ------------------------------ */ 4302 .balign 128 4303 .L_op_and_long: /* 0xa0 */ 4304 /* File: arm64/op_and_long.S */ 4305 /* File: arm64/binopWide.S */ 4306 /* 4307 * Generic 64-bit binary operation. Provide an "instr" line that 4308 * specifies an instruction that performs "result = x1 op x2". 4309 * This could be an ARM instruction or a function call. (If the result 4310 * comes back in a register other than x0, you can override "result".) 4311 * 4312 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4313 * vCC (w1). Useful for integer division and modulus. 4314 * 4315 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long, 4316 * xor-long, add-double, sub-double, mul-double, div-double, rem-double 4317 */ 4318 /* binop vAA, vBB, vCC */ 4319 FETCH w0, 1 // w0<- CCBB 4320 lsr w4, wINST, #8 // w4<- AA 4321 lsr w2, w0, #8 // w2<- CC 4322 and w1, w0, #255 // w1<- BB 4323 GET_VREG_WIDE x2, w2 // w2<- vCC 4324 GET_VREG_WIDE x1, w1 // w1<- vBB 4325 .if 0 4326 cbz x2, common_errDivideByZero // is second operand zero? 4327 .endif 4328 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4329 4330 and x0, x1, x2 // x0<- op, w0-w4 changed 4331 GET_INST_OPCODE ip // extract opcode from rINST 4332 SET_VREG_WIDE x0, w4 // vAA<- x0 4333 GOTO_OPCODE ip // jump to next instruction 4334 /* 11-14 instructions */ 4335 4336 4337 /* ------------------------------ */ 4338 .balign 128 4339 .L_op_or_long: /* 0xa1 */ 4340 /* File: arm64/op_or_long.S */ 4341 /* File: arm64/binopWide.S */ 4342 /* 4343 * Generic 64-bit binary operation. Provide an "instr" line that 4344 * specifies an instruction that performs "result = x1 op x2". 4345 * This could be an ARM instruction or a function call. (If the result 4346 * comes back in a register other than x0, you can override "result".) 4347 * 4348 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4349 * vCC (w1). Useful for integer division and modulus. 4350 * 4351 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long, 4352 * xor-long, add-double, sub-double, mul-double, div-double, rem-double 4353 */ 4354 /* binop vAA, vBB, vCC */ 4355 FETCH w0, 1 // w0<- CCBB 4356 lsr w4, wINST, #8 // w4<- AA 4357 lsr w2, w0, #8 // w2<- CC 4358 and w1, w0, #255 // w1<- BB 4359 GET_VREG_WIDE x2, w2 // w2<- vCC 4360 GET_VREG_WIDE x1, w1 // w1<- vBB 4361 .if 0 4362 cbz x2, common_errDivideByZero // is second operand zero? 4363 .endif 4364 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4365 4366 orr x0, x1, x2 // x0<- op, w0-w4 changed 4367 GET_INST_OPCODE ip // extract opcode from rINST 4368 SET_VREG_WIDE x0, w4 // vAA<- x0 4369 GOTO_OPCODE ip // jump to next instruction 4370 /* 11-14 instructions */ 4371 4372 4373 /* ------------------------------ */ 4374 .balign 128 4375 .L_op_xor_long: /* 0xa2 */ 4376 /* File: arm64/op_xor_long.S */ 4377 /* File: arm64/binopWide.S */ 4378 /* 4379 * Generic 64-bit binary operation. Provide an "instr" line that 4380 * specifies an instruction that performs "result = x1 op x2". 4381 * This could be an ARM instruction or a function call. (If the result 4382 * comes back in a register other than x0, you can override "result".) 4383 * 4384 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4385 * vCC (w1). Useful for integer division and modulus. 4386 * 4387 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long, 4388 * xor-long, add-double, sub-double, mul-double, div-double, rem-double 4389 */ 4390 /* binop vAA, vBB, vCC */ 4391 FETCH w0, 1 // w0<- CCBB 4392 lsr w4, wINST, #8 // w4<- AA 4393 lsr w2, w0, #8 // w2<- CC 4394 and w1, w0, #255 // w1<- BB 4395 GET_VREG_WIDE x2, w2 // w2<- vCC 4396 GET_VREG_WIDE x1, w1 // w1<- vBB 4397 .if 0 4398 cbz x2, common_errDivideByZero // is second operand zero? 4399 .endif 4400 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4401 4402 eor x0, x1, x2 // x0<- op, w0-w4 changed 4403 GET_INST_OPCODE ip // extract opcode from rINST 4404 SET_VREG_WIDE x0, w4 // vAA<- x0 4405 GOTO_OPCODE ip // jump to next instruction 4406 /* 11-14 instructions */ 4407 4408 4409 /* ------------------------------ */ 4410 .balign 128 4411 .L_op_shl_long: /* 0xa3 */ 4412 /* File: arm64/op_shl_long.S */ 4413 /* File: arm64/shiftWide.S */ 4414 /* 4415 * 64-bit shift operation. 4416 * 4417 * For: shl-long, shr-long, ushr-long 4418 */ 4419 /* binop vAA, vBB, vCC */ 4420 FETCH w0, 1 // w0<- CCBB 4421 lsr w3, wINST, #8 // w3<- AA 4422 lsr w2, w0, #8 // w2<- CC 4423 GET_VREG w2, w2 // w2<- vCC (shift count) 4424 and w1, w0, #255 // w1<- BB 4425 GET_VREG_WIDE x1, w1 // x1<- vBB 4426 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4427 and x2, x2, #63 // Mask low 6 4428 lsl x0, x1, x2 // Do the shift. 4429 GET_INST_OPCODE ip // extract opcode from rINST 4430 SET_VREG_WIDE x0, w3 // vAA<- x0 4431 GOTO_OPCODE ip // jump to next instruction 4432 /* 11-14 instructions */ 4433 4434 4435 /* ------------------------------ */ 4436 .balign 128 4437 .L_op_shr_long: /* 0xa4 */ 4438 /* File: arm64/op_shr_long.S */ 4439 /* File: arm64/shiftWide.S */ 4440 /* 4441 * 64-bit shift operation. 4442 * 4443 * For: shl-long, shr-long, ushr-long 4444 */ 4445 /* binop vAA, vBB, vCC */ 4446 FETCH w0, 1 // w0<- CCBB 4447 lsr w3, wINST, #8 // w3<- AA 4448 lsr w2, w0, #8 // w2<- CC 4449 GET_VREG w2, w2 // w2<- vCC (shift count) 4450 and w1, w0, #255 // w1<- BB 4451 GET_VREG_WIDE x1, w1 // x1<- vBB 4452 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4453 and x2, x2, #63 // Mask low 6 4454 asr x0, x1, x2 // Do the shift. 4455 GET_INST_OPCODE ip // extract opcode from rINST 4456 SET_VREG_WIDE x0, w3 // vAA<- x0 4457 GOTO_OPCODE ip // jump to next instruction 4458 /* 11-14 instructions */ 4459 4460 4461 /* ------------------------------ */ 4462 .balign 128 4463 .L_op_ushr_long: /* 0xa5 */ 4464 /* File: arm64/op_ushr_long.S */ 4465 /* File: arm64/shiftWide.S */ 4466 /* 4467 * 64-bit shift operation. 4468 * 4469 * For: shl-long, shr-long, ushr-long 4470 */ 4471 /* binop vAA, vBB, vCC */ 4472 FETCH w0, 1 // w0<- CCBB 4473 lsr w3, wINST, #8 // w3<- AA 4474 lsr w2, w0, #8 // w2<- CC 4475 GET_VREG w2, w2 // w2<- vCC (shift count) 4476 and w1, w0, #255 // w1<- BB 4477 GET_VREG_WIDE x1, w1 // x1<- vBB 4478 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4479 and x2, x2, #63 // Mask low 6 4480 lsr x0, x1, x2 // Do the shift. 4481 GET_INST_OPCODE ip // extract opcode from rINST 4482 SET_VREG_WIDE x0, w3 // vAA<- x0 4483 GOTO_OPCODE ip // jump to next instruction 4484 /* 11-14 instructions */ 4485 4486 4487 /* ------------------------------ */ 4488 .balign 128 4489 .L_op_add_float: /* 0xa6 */ 4490 /* File: arm64/op_add_float.S */ 4491 /* File: arm64/fbinop.S */ 4492 /*: 4493 * Generic 32-bit floating-point operation. 4494 * 4495 * For: add-float, sub-float, mul-float, div-float 4496 * form: <op> s0, s0, s1 4497 */ 4498 /* floatop vAA, vBB, vCC */ 4499 FETCH w0, 1 // r0<- CCBB 4500 lsr w1, w0, #8 // r2<- CC 4501 and w0, w0, #255 // r1<- BB 4502 GET_VREG s1, w1 4503 GET_VREG s0, w0 4504 fadd s0, s0, s1 // s0<- op 4505 lsr w1, wINST, #8 // r1<- AA 4506 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4507 GET_INST_OPCODE ip // extract opcode from rINST 4508 SET_VREG s0, w1 4509 GOTO_OPCODE ip // jump to next instruction 4510 4511 4512 /* ------------------------------ */ 4513 .balign 128 4514 .L_op_sub_float: /* 0xa7 */ 4515 /* File: arm64/op_sub_float.S */ 4516 /* File: arm64/fbinop.S */ 4517 /*: 4518 * Generic 32-bit floating-point operation. 4519 * 4520 * For: add-float, sub-float, mul-float, div-float 4521 * form: <op> s0, s0, s1 4522 */ 4523 /* floatop vAA, vBB, vCC */ 4524 FETCH w0, 1 // r0<- CCBB 4525 lsr w1, w0, #8 // r2<- CC 4526 and w0, w0, #255 // r1<- BB 4527 GET_VREG s1, w1 4528 GET_VREG s0, w0 4529 fsub s0, s0, s1 // s0<- op 4530 lsr w1, wINST, #8 // r1<- AA 4531 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4532 GET_INST_OPCODE ip // extract opcode from rINST 4533 SET_VREG s0, w1 4534 GOTO_OPCODE ip // jump to next instruction 4535 4536 4537 /* ------------------------------ */ 4538 .balign 128 4539 .L_op_mul_float: /* 0xa8 */ 4540 /* File: arm64/op_mul_float.S */ 4541 /* File: arm64/fbinop.S */ 4542 /*: 4543 * Generic 32-bit floating-point operation. 4544 * 4545 * For: add-float, sub-float, mul-float, div-float 4546 * form: <op> s0, s0, s1 4547 */ 4548 /* floatop vAA, vBB, vCC */ 4549 FETCH w0, 1 // r0<- CCBB 4550 lsr w1, w0, #8 // r2<- CC 4551 and w0, w0, #255 // r1<- BB 4552 GET_VREG s1, w1 4553 GET_VREG s0, w0 4554 fmul s0, s0, s1 // s0<- op 4555 lsr w1, wINST, #8 // r1<- AA 4556 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4557 GET_INST_OPCODE ip // extract opcode from rINST 4558 SET_VREG s0, w1 4559 GOTO_OPCODE ip // jump to next instruction 4560 4561 4562 /* ------------------------------ */ 4563 .balign 128 4564 .L_op_div_float: /* 0xa9 */ 4565 /* File: arm64/op_div_float.S */ 4566 /* File: arm64/fbinop.S */ 4567 /*: 4568 * Generic 32-bit floating-point operation. 4569 * 4570 * For: add-float, sub-float, mul-float, div-float 4571 * form: <op> s0, s0, s1 4572 */ 4573 /* floatop vAA, vBB, vCC */ 4574 FETCH w0, 1 // r0<- CCBB 4575 lsr w1, w0, #8 // r2<- CC 4576 and w0, w0, #255 // r1<- BB 4577 GET_VREG s1, w1 4578 GET_VREG s0, w0 4579 fdiv s0, s0, s1 // s0<- op 4580 lsr w1, wINST, #8 // r1<- AA 4581 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4582 GET_INST_OPCODE ip // extract opcode from rINST 4583 SET_VREG s0, w1 4584 GOTO_OPCODE ip // jump to next instruction 4585 4586 4587 /* ------------------------------ */ 4588 .balign 128 4589 .L_op_rem_float: /* 0xaa */ 4590 /* File: arm64/op_rem_float.S */ 4591 /* EABI doesn't define a float remainder function, but libm does */ 4592 /* File: arm64/fbinop.S */ 4593 /*: 4594 * Generic 32-bit floating-point operation. 4595 * 4596 * For: add-float, sub-float, mul-float, div-float 4597 * form: <op> s0, s0, s1 4598 */ 4599 /* floatop vAA, vBB, vCC */ 4600 FETCH w0, 1 // r0<- CCBB 4601 lsr w1, w0, #8 // r2<- CC 4602 and w0, w0, #255 // r1<- BB 4603 GET_VREG s1, w1 4604 GET_VREG s0, w0 4605 bl fmodf // s0<- op 4606 lsr w1, wINST, #8 // r1<- AA 4607 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4608 GET_INST_OPCODE ip // extract opcode from rINST 4609 SET_VREG s0, w1 4610 GOTO_OPCODE ip // jump to next instruction 4611 4612 4613 /* ------------------------------ */ 4614 .balign 128 4615 .L_op_add_double: /* 0xab */ 4616 /* File: arm64/op_add_double.S */ 4617 /* File: arm64/binopWide.S */ 4618 /* 4619 * Generic 64-bit binary operation. Provide an "instr" line that 4620 * specifies an instruction that performs "result = x1 op x2". 4621 * This could be an ARM instruction or a function call. (If the result 4622 * comes back in a register other than x0, you can override "result".) 4623 * 4624 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4625 * vCC (w1). Useful for integer division and modulus. 4626 * 4627 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long, 4628 * xor-long, add-double, sub-double, mul-double, div-double, rem-double 4629 */ 4630 /* binop vAA, vBB, vCC */ 4631 FETCH w0, 1 // w0<- CCBB 4632 lsr w4, wINST, #8 // w4<- AA 4633 lsr w2, w0, #8 // w2<- CC 4634 and w1, w0, #255 // w1<- BB 4635 GET_VREG_WIDE d2, w2 // w2<- vCC 4636 GET_VREG_WIDE d1, w1 // w1<- vBB 4637 .if 0 4638 cbz d2, common_errDivideByZero // is second operand zero? 4639 .endif 4640 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4641 4642 fadd d0, d1, d2 // d0<- op, w0-w4 changed 4643 GET_INST_OPCODE ip // extract opcode from rINST 4644 SET_VREG_WIDE d0, w4 // vAA<- d0 4645 GOTO_OPCODE ip // jump to next instruction 4646 /* 11-14 instructions */ 4647 4648 4649 /* ------------------------------ */ 4650 .balign 128 4651 .L_op_sub_double: /* 0xac */ 4652 /* File: arm64/op_sub_double.S */ 4653 /* File: arm64/binopWide.S */ 4654 /* 4655 * Generic 64-bit binary operation. Provide an "instr" line that 4656 * specifies an instruction that performs "result = x1 op x2". 4657 * This could be an ARM instruction or a function call. (If the result 4658 * comes back in a register other than x0, you can override "result".) 4659 * 4660 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4661 * vCC (w1). Useful for integer division and modulus. 4662 * 4663 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long, 4664 * xor-long, add-double, sub-double, mul-double, div-double, rem-double 4665 */ 4666 /* binop vAA, vBB, vCC */ 4667 FETCH w0, 1 // w0<- CCBB 4668 lsr w4, wINST, #8 // w4<- AA 4669 lsr w2, w0, #8 // w2<- CC 4670 and w1, w0, #255 // w1<- BB 4671 GET_VREG_WIDE d2, w2 // w2<- vCC 4672 GET_VREG_WIDE d1, w1 // w1<- vBB 4673 .if 0 4674 cbz d2, common_errDivideByZero // is second operand zero? 4675 .endif 4676 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4677 4678 fsub d0, d1, d2 // d0<- op, w0-w4 changed 4679 GET_INST_OPCODE ip // extract opcode from rINST 4680 SET_VREG_WIDE d0, w4 // vAA<- d0 4681 GOTO_OPCODE ip // jump to next instruction 4682 /* 11-14 instructions */ 4683 4684 4685 /* ------------------------------ */ 4686 .balign 128 4687 .L_op_mul_double: /* 0xad */ 4688 /* File: arm64/op_mul_double.S */ 4689 /* File: arm64/binopWide.S */ 4690 /* 4691 * Generic 64-bit binary operation. Provide an "instr" line that 4692 * specifies an instruction that performs "result = x1 op x2". 4693 * This could be an ARM instruction or a function call. (If the result 4694 * comes back in a register other than x0, you can override "result".) 4695 * 4696 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4697 * vCC (w1). Useful for integer division and modulus. 4698 * 4699 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long, 4700 * xor-long, add-double, sub-double, mul-double, div-double, rem-double 4701 */ 4702 /* binop vAA, vBB, vCC */ 4703 FETCH w0, 1 // w0<- CCBB 4704 lsr w4, wINST, #8 // w4<- AA 4705 lsr w2, w0, #8 // w2<- CC 4706 and w1, w0, #255 // w1<- BB 4707 GET_VREG_WIDE d2, w2 // w2<- vCC 4708 GET_VREG_WIDE d1, w1 // w1<- vBB 4709 .if 0 4710 cbz d2, common_errDivideByZero // is second operand zero? 4711 .endif 4712 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4713 4714 fmul d0, d1, d2 // d0<- op, w0-w4 changed 4715 GET_INST_OPCODE ip // extract opcode from rINST 4716 SET_VREG_WIDE d0, w4 // vAA<- d0 4717 GOTO_OPCODE ip // jump to next instruction 4718 /* 11-14 instructions */ 4719 4720 4721 /* ------------------------------ */ 4722 .balign 128 4723 .L_op_div_double: /* 0xae */ 4724 /* File: arm64/op_div_double.S */ 4725 /* File: arm64/binopWide.S */ 4726 /* 4727 * Generic 64-bit binary operation. Provide an "instr" line that 4728 * specifies an instruction that performs "result = x1 op x2". 4729 * This could be an ARM instruction or a function call. (If the result 4730 * comes back in a register other than x0, you can override "result".) 4731 * 4732 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4733 * vCC (w1). Useful for integer division and modulus. 4734 * 4735 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long, 4736 * xor-long, add-double, sub-double, mul-double, div-double, rem-double 4737 */ 4738 /* binop vAA, vBB, vCC */ 4739 FETCH w0, 1 // w0<- CCBB 4740 lsr w4, wINST, #8 // w4<- AA 4741 lsr w2, w0, #8 // w2<- CC 4742 and w1, w0, #255 // w1<- BB 4743 GET_VREG_WIDE d2, w2 // w2<- vCC 4744 GET_VREG_WIDE d1, w1 // w1<- vBB 4745 .if 0 4746 cbz d2, common_errDivideByZero // is second operand zero? 4747 .endif 4748 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4749 4750 fdiv d0, d1, d2 // d0<- op, w0-w4 changed 4751 GET_INST_OPCODE ip // extract opcode from rINST 4752 SET_VREG_WIDE d0, w4 // vAA<- d0 4753 GOTO_OPCODE ip // jump to next instruction 4754 /* 11-14 instructions */ 4755 4756 4757 /* ------------------------------ */ 4758 .balign 128 4759 .L_op_rem_double: /* 0xaf */ 4760 /* File: arm64/op_rem_double.S */ 4761 /* rem vAA, vBB, vCC */ 4762 FETCH w0, 1 // w0<- CCBB 4763 lsr w2, w0, #8 // w2<- CC 4764 and w1, w0, #255 // w1<- BB 4765 GET_VREG_WIDE d1, w2 // d1<- vCC 4766 GET_VREG_WIDE d0, w1 // d0<- vBB 4767 bl fmod 4768 lsr w4, wINST, #8 // w4<- AA 4769 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 4770 GET_INST_OPCODE ip // extract opcode from rINST 4771 SET_VREG_WIDE d0, w4 // vAA<- result 4772 GOTO_OPCODE ip // jump to next instruction 4773 /* 11-14 instructions */ 4774 4775 /* ------------------------------ */ 4776 .balign 128 4777 .L_op_add_int_2addr: /* 0xb0 */ 4778 /* File: arm64/op_add_int_2addr.S */ 4779 /* File: arm64/binop2addr.S */ 4780 /* 4781 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4782 * that specifies an instruction that performs "result = w0 op w1". 4783 * This could be an ARM instruction or a function call. (If the result 4784 * comes back in a register other than w0, you can override "result".) 4785 * 4786 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4787 * vCC (w1). Useful for integer division and modulus. 4788 * 4789 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4790 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4791 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4792 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4793 */ 4794 /* binop/2addr vA, vB */ 4795 lsr w3, wINST, #12 // w3<- B 4796 ubfx w9, wINST, #8, #4 // w9<- A 4797 GET_VREG w1, w3 // w1<- vB 4798 GET_VREG w0, w9 // w0<- vA 4799 .if 0 4800 cbz w1, common_errDivideByZero 4801 .endif 4802 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 4803 // optional op; may set condition codes 4804 add w0, w0, w1 // w0<- op, w0-w3 changed 4805 GET_INST_OPCODE ip // extract opcode from rINST 4806 SET_VREG w0, w9 // vAA<- w0 4807 GOTO_OPCODE ip // jump to next instruction 4808 /* 10-13 instructions */ 4809 4810 4811 /* ------------------------------ */ 4812 .balign 128 4813 .L_op_sub_int_2addr: /* 0xb1 */ 4814 /* File: arm64/op_sub_int_2addr.S */ 4815 /* File: arm64/binop2addr.S */ 4816 /* 4817 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4818 * that specifies an instruction that performs "result = w0 op w1". 4819 * This could be an ARM instruction or a function call. (If the result 4820 * comes back in a register other than w0, you can override "result".) 4821 * 4822 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4823 * vCC (w1). Useful for integer division and modulus. 4824 * 4825 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4826 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4827 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4828 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4829 */ 4830 /* binop/2addr vA, vB */ 4831 lsr w3, wINST, #12 // w3<- B 4832 ubfx w9, wINST, #8, #4 // w9<- A 4833 GET_VREG w1, w3 // w1<- vB 4834 GET_VREG w0, w9 // w0<- vA 4835 .if 0 4836 cbz w1, common_errDivideByZero 4837 .endif 4838 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 4839 // optional op; may set condition codes 4840 sub w0, w0, w1 // w0<- op, w0-w3 changed 4841 GET_INST_OPCODE ip // extract opcode from rINST 4842 SET_VREG w0, w9 // vAA<- w0 4843 GOTO_OPCODE ip // jump to next instruction 4844 /* 10-13 instructions */ 4845 4846 4847 /* ------------------------------ */ 4848 .balign 128 4849 .L_op_mul_int_2addr: /* 0xb2 */ 4850 /* File: arm64/op_mul_int_2addr.S */ 4851 /* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */ 4852 /* File: arm64/binop2addr.S */ 4853 /* 4854 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4855 * that specifies an instruction that performs "result = w0 op w1". 4856 * This could be an ARM instruction or a function call. (If the result 4857 * comes back in a register other than w0, you can override "result".) 4858 * 4859 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4860 * vCC (w1). Useful for integer division and modulus. 4861 * 4862 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4863 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4864 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4865 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4866 */ 4867 /* binop/2addr vA, vB */ 4868 lsr w3, wINST, #12 // w3<- B 4869 ubfx w9, wINST, #8, #4 // w9<- A 4870 GET_VREG w1, w3 // w1<- vB 4871 GET_VREG w0, w9 // w0<- vA 4872 .if 0 4873 cbz w1, common_errDivideByZero 4874 .endif 4875 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 4876 // optional op; may set condition codes 4877 mul w0, w1, w0 // w0<- op, w0-w3 changed 4878 GET_INST_OPCODE ip // extract opcode from rINST 4879 SET_VREG w0, w9 // vAA<- w0 4880 GOTO_OPCODE ip // jump to next instruction 4881 /* 10-13 instructions */ 4882 4883 4884 /* ------------------------------ */ 4885 .balign 128 4886 .L_op_div_int_2addr: /* 0xb3 */ 4887 /* File: arm64/op_div_int_2addr.S */ 4888 /* File: arm64/binop2addr.S */ 4889 /* 4890 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4891 * that specifies an instruction that performs "result = w0 op w1". 4892 * This could be an ARM instruction or a function call. (If the result 4893 * comes back in a register other than w0, you can override "result".) 4894 * 4895 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4896 * vCC (w1). Useful for integer division and modulus. 4897 * 4898 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4899 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4900 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4901 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4902 */ 4903 /* binop/2addr vA, vB */ 4904 lsr w3, wINST, #12 // w3<- B 4905 ubfx w9, wINST, #8, #4 // w9<- A 4906 GET_VREG w1, w3 // w1<- vB 4907 GET_VREG w0, w9 // w0<- vA 4908 .if 1 4909 cbz w1, common_errDivideByZero 4910 .endif 4911 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 4912 // optional op; may set condition codes 4913 sdiv w0, w0, w1 // w0<- op, w0-w3 changed 4914 GET_INST_OPCODE ip // extract opcode from rINST 4915 SET_VREG w0, w9 // vAA<- w0 4916 GOTO_OPCODE ip // jump to next instruction 4917 /* 10-13 instructions */ 4918 4919 4920 /* ------------------------------ */ 4921 .balign 128 4922 .L_op_rem_int_2addr: /* 0xb4 */ 4923 /* File: arm64/op_rem_int_2addr.S */ 4924 /* File: arm64/binop2addr.S */ 4925 /* 4926 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4927 * that specifies an instruction that performs "result = w0 op w1". 4928 * This could be an ARM instruction or a function call. (If the result 4929 * comes back in a register other than w0, you can override "result".) 4930 * 4931 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4932 * vCC (w1). Useful for integer division and modulus. 4933 * 4934 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4935 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4936 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4937 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4938 */ 4939 /* binop/2addr vA, vB */ 4940 lsr w3, wINST, #12 // w3<- B 4941 ubfx w9, wINST, #8, #4 // w9<- A 4942 GET_VREG w1, w3 // w1<- vB 4943 GET_VREG w0, w9 // w0<- vA 4944 .if 1 4945 cbz w1, common_errDivideByZero 4946 .endif 4947 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 4948 sdiv w2, w0, w1 // optional op; may set condition codes 4949 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed 4950 GET_INST_OPCODE ip // extract opcode from rINST 4951 SET_VREG w0, w9 // vAA<- w0 4952 GOTO_OPCODE ip // jump to next instruction 4953 /* 10-13 instructions */ 4954 4955 4956 /* ------------------------------ */ 4957 .balign 128 4958 .L_op_and_int_2addr: /* 0xb5 */ 4959 /* File: arm64/op_and_int_2addr.S */ 4960 /* File: arm64/binop2addr.S */ 4961 /* 4962 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4963 * that specifies an instruction that performs "result = w0 op w1". 4964 * This could be an ARM instruction or a function call. (If the result 4965 * comes back in a register other than w0, you can override "result".) 4966 * 4967 * If "chkzero" is set to 1, we perform a divide-by-zero check on 4968 * vCC (w1). Useful for integer division and modulus. 4969 * 4970 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4971 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4972 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4973 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4974 */ 4975 /* binop/2addr vA, vB */ 4976 lsr w3, wINST, #12 // w3<- B 4977 ubfx w9, wINST, #8, #4 // w9<- A 4978 GET_VREG w1, w3 // w1<- vB 4979 GET_VREG w0, w9 // w0<- vA 4980 .if 0 4981 cbz w1, common_errDivideByZero 4982 .endif 4983 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 4984 // optional op; may set condition codes 4985 and w0, w0, w1 // w0<- op, w0-w3 changed 4986 GET_INST_OPCODE ip // extract opcode from rINST 4987 SET_VREG w0, w9 // vAA<- w0 4988 GOTO_OPCODE ip // jump to next instruction 4989 /* 10-13 instructions */ 4990 4991 4992 /* ------------------------------ */ 4993 .balign 128 4994 .L_op_or_int_2addr: /* 0xb6 */ 4995 /* File: arm64/op_or_int_2addr.S */ 4996 /* File: arm64/binop2addr.S */ 4997 /* 4998 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4999 * that specifies an instruction that performs "result = w0 op w1". 5000 * This could be an ARM instruction or a function call. (If the result 5001 * comes back in a register other than w0, you can override "result".) 5002 * 5003 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5004 * vCC (w1). Useful for integer division and modulus. 5005 * 5006 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5007 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5008 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5009 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5010 */ 5011 /* binop/2addr vA, vB */ 5012 lsr w3, wINST, #12 // w3<- B 5013 ubfx w9, wINST, #8, #4 // w9<- A 5014 GET_VREG w1, w3 // w1<- vB 5015 GET_VREG w0, w9 // w0<- vA 5016 .if 0 5017 cbz w1, common_errDivideByZero 5018 .endif 5019 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5020 // optional op; may set condition codes 5021 orr w0, w0, w1 // w0<- op, w0-w3 changed 5022 GET_INST_OPCODE ip // extract opcode from rINST 5023 SET_VREG w0, w9 // vAA<- w0 5024 GOTO_OPCODE ip // jump to next instruction 5025 /* 10-13 instructions */ 5026 5027 5028 /* ------------------------------ */ 5029 .balign 128 5030 .L_op_xor_int_2addr: /* 0xb7 */ 5031 /* File: arm64/op_xor_int_2addr.S */ 5032 /* File: arm64/binop2addr.S */ 5033 /* 5034 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5035 * that specifies an instruction that performs "result = w0 op w1". 5036 * This could be an ARM instruction or a function call. (If the result 5037 * comes back in a register other than w0, you can override "result".) 5038 * 5039 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5040 * vCC (w1). Useful for integer division and modulus. 5041 * 5042 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5043 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5044 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5045 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5046 */ 5047 /* binop/2addr vA, vB */ 5048 lsr w3, wINST, #12 // w3<- B 5049 ubfx w9, wINST, #8, #4 // w9<- A 5050 GET_VREG w1, w3 // w1<- vB 5051 GET_VREG w0, w9 // w0<- vA 5052 .if 0 5053 cbz w1, common_errDivideByZero 5054 .endif 5055 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5056 // optional op; may set condition codes 5057 eor w0, w0, w1 // w0<- op, w0-w3 changed 5058 GET_INST_OPCODE ip // extract opcode from rINST 5059 SET_VREG w0, w9 // vAA<- w0 5060 GOTO_OPCODE ip // jump to next instruction 5061 /* 10-13 instructions */ 5062 5063 5064 /* ------------------------------ */ 5065 .balign 128 5066 .L_op_shl_int_2addr: /* 0xb8 */ 5067 /* File: arm64/op_shl_int_2addr.S */ 5068 /* File: arm64/binop2addr.S */ 5069 /* 5070 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5071 * that specifies an instruction that performs "result = w0 op w1". 5072 * This could be an ARM instruction or a function call. (If the result 5073 * comes back in a register other than w0, you can override "result".) 5074 * 5075 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5076 * vCC (w1). Useful for integer division and modulus. 5077 * 5078 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5079 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5080 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5081 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5082 */ 5083 /* binop/2addr vA, vB */ 5084 lsr w3, wINST, #12 // w3<- B 5085 ubfx w9, wINST, #8, #4 // w9<- A 5086 GET_VREG w1, w3 // w1<- vB 5087 GET_VREG w0, w9 // w0<- vA 5088 .if 0 5089 cbz w1, common_errDivideByZero 5090 .endif 5091 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5092 and w1, w1, #31 // optional op; may set condition codes 5093 lsl w0, w0, w1 // w0<- op, w0-w3 changed 5094 GET_INST_OPCODE ip // extract opcode from rINST 5095 SET_VREG w0, w9 // vAA<- w0 5096 GOTO_OPCODE ip // jump to next instruction 5097 /* 10-13 instructions */ 5098 5099 5100 /* ------------------------------ */ 5101 .balign 128 5102 .L_op_shr_int_2addr: /* 0xb9 */ 5103 /* File: arm64/op_shr_int_2addr.S */ 5104 /* File: arm64/binop2addr.S */ 5105 /* 5106 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5107 * that specifies an instruction that performs "result = w0 op w1". 5108 * This could be an ARM instruction or a function call. (If the result 5109 * comes back in a register other than w0, you can override "result".) 5110 * 5111 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5112 * vCC (w1). Useful for integer division and modulus. 5113 * 5114 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5115 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5116 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5117 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5118 */ 5119 /* binop/2addr vA, vB */ 5120 lsr w3, wINST, #12 // w3<- B 5121 ubfx w9, wINST, #8, #4 // w9<- A 5122 GET_VREG w1, w3 // w1<- vB 5123 GET_VREG w0, w9 // w0<- vA 5124 .if 0 5125 cbz w1, common_errDivideByZero 5126 .endif 5127 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5128 and w1, w1, #31 // optional op; may set condition codes 5129 asr w0, w0, w1 // w0<- op, w0-w3 changed 5130 GET_INST_OPCODE ip // extract opcode from rINST 5131 SET_VREG w0, w9 // vAA<- w0 5132 GOTO_OPCODE ip // jump to next instruction 5133 /* 10-13 instructions */ 5134 5135 5136 /* ------------------------------ */ 5137 .balign 128 5138 .L_op_ushr_int_2addr: /* 0xba */ 5139 /* File: arm64/op_ushr_int_2addr.S */ 5140 /* File: arm64/binop2addr.S */ 5141 /* 5142 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 5143 * that specifies an instruction that performs "result = w0 op w1". 5144 * This could be an ARM instruction or a function call. (If the result 5145 * comes back in a register other than w0, you can override "result".) 5146 * 5147 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5148 * vCC (w1). Useful for integer division and modulus. 5149 * 5150 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 5151 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 5152 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 5153 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 5154 */ 5155 /* binop/2addr vA, vB */ 5156 lsr w3, wINST, #12 // w3<- B 5157 ubfx w9, wINST, #8, #4 // w9<- A 5158 GET_VREG w1, w3 // w1<- vB 5159 GET_VREG w0, w9 // w0<- vA 5160 .if 0 5161 cbz w1, common_errDivideByZero 5162 .endif 5163 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5164 and w1, w1, #31 // optional op; may set condition codes 5165 lsr w0, w0, w1 // w0<- op, w0-w3 changed 5166 GET_INST_OPCODE ip // extract opcode from rINST 5167 SET_VREG w0, w9 // vAA<- w0 5168 GOTO_OPCODE ip // jump to next instruction 5169 /* 10-13 instructions */ 5170 5171 5172 /* ------------------------------ */ 5173 .balign 128 5174 .L_op_add_long_2addr: /* 0xbb */ 5175 /* File: arm64/op_add_long_2addr.S */ 5176 /* File: arm64/binopWide2addr.S */ 5177 /* 5178 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5179 * that specifies an instruction that performs "x0 = x0 op x1". 5180 * This must not be a function call, as we keep w2 live across it. 5181 * 5182 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5183 * vCC (w1). Useful for integer division and modulus. 5184 * 5185 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr, 5186 * and-long/2addr, or-long/2addr, xor-long/2addr, 5187 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr, 5188 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr 5189 */ 5190 /* binop/2addr vA, vB */ 5191 lsr w1, wINST, #12 // w1<- B 5192 ubfx w2, wINST, #8, #4 // w2<- A 5193 GET_VREG_WIDE x1, w1 // x1<- vB 5194 GET_VREG_WIDE x0, w2 // x0<- vA 5195 .if 0 5196 cbz x1, common_errDivideByZero 5197 .endif 5198 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5199 5200 add x0, x0, x1 // result<- op 5201 GET_INST_OPCODE ip // extract opcode from rINST 5202 SET_VREG_WIDE x0, w2 // vAA<- result 5203 GOTO_OPCODE ip // jump to next instruction 5204 /* 10-13 instructions */ 5205 5206 5207 /* ------------------------------ */ 5208 .balign 128 5209 .L_op_sub_long_2addr: /* 0xbc */ 5210 /* File: arm64/op_sub_long_2addr.S */ 5211 /* File: arm64/binopWide2addr.S */ 5212 /* 5213 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5214 * that specifies an instruction that performs "x0 = x0 op x1". 5215 * This must not be a function call, as we keep w2 live across it. 5216 * 5217 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5218 * vCC (w1). Useful for integer division and modulus. 5219 * 5220 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr, 5221 * and-long/2addr, or-long/2addr, xor-long/2addr, 5222 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr, 5223 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr 5224 */ 5225 /* binop/2addr vA, vB */ 5226 lsr w1, wINST, #12 // w1<- B 5227 ubfx w2, wINST, #8, #4 // w2<- A 5228 GET_VREG_WIDE x1, w1 // x1<- vB 5229 GET_VREG_WIDE x0, w2 // x0<- vA 5230 .if 0 5231 cbz x1, common_errDivideByZero 5232 .endif 5233 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5234 5235 sub x0, x0, x1 // result<- op 5236 GET_INST_OPCODE ip // extract opcode from rINST 5237 SET_VREG_WIDE x0, w2 // vAA<- result 5238 GOTO_OPCODE ip // jump to next instruction 5239 /* 10-13 instructions */ 5240 5241 5242 /* ------------------------------ */ 5243 .balign 128 5244 .L_op_mul_long_2addr: /* 0xbd */ 5245 /* File: arm64/op_mul_long_2addr.S */ 5246 /* File: arm64/binopWide2addr.S */ 5247 /* 5248 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5249 * that specifies an instruction that performs "x0 = x0 op x1". 5250 * This must not be a function call, as we keep w2 live across it. 5251 * 5252 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5253 * vCC (w1). Useful for integer division and modulus. 5254 * 5255 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr, 5256 * and-long/2addr, or-long/2addr, xor-long/2addr, 5257 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr, 5258 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr 5259 */ 5260 /* binop/2addr vA, vB */ 5261 lsr w1, wINST, #12 // w1<- B 5262 ubfx w2, wINST, #8, #4 // w2<- A 5263 GET_VREG_WIDE x1, w1 // x1<- vB 5264 GET_VREG_WIDE x0, w2 // x0<- vA 5265 .if 0 5266 cbz x1, common_errDivideByZero 5267 .endif 5268 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5269 5270 mul x0, x0, x1 // result<- op 5271 GET_INST_OPCODE ip // extract opcode from rINST 5272 SET_VREG_WIDE x0, w2 // vAA<- result 5273 GOTO_OPCODE ip // jump to next instruction 5274 /* 10-13 instructions */ 5275 5276 5277 /* ------------------------------ */ 5278 .balign 128 5279 .L_op_div_long_2addr: /* 0xbe */ 5280 /* File: arm64/op_div_long_2addr.S */ 5281 /* File: arm64/binopWide2addr.S */ 5282 /* 5283 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5284 * that specifies an instruction that performs "x0 = x0 op x1". 5285 * This must not be a function call, as we keep w2 live across it. 5286 * 5287 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5288 * vCC (w1). Useful for integer division and modulus. 5289 * 5290 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr, 5291 * and-long/2addr, or-long/2addr, xor-long/2addr, 5292 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr, 5293 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr 5294 */ 5295 /* binop/2addr vA, vB */ 5296 lsr w1, wINST, #12 // w1<- B 5297 ubfx w2, wINST, #8, #4 // w2<- A 5298 GET_VREG_WIDE x1, w1 // x1<- vB 5299 GET_VREG_WIDE x0, w2 // x0<- vA 5300 .if 1 5301 cbz x1, common_errDivideByZero 5302 .endif 5303 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5304 5305 sdiv x0, x0, x1 // result<- op 5306 GET_INST_OPCODE ip // extract opcode from rINST 5307 SET_VREG_WIDE x0, w2 // vAA<- result 5308 GOTO_OPCODE ip // jump to next instruction 5309 /* 10-13 instructions */ 5310 5311 5312 /* ------------------------------ */ 5313 .balign 128 5314 .L_op_rem_long_2addr: /* 0xbf */ 5315 /* File: arm64/op_rem_long_2addr.S */ 5316 /* File: arm64/binopWide2addr.S */ 5317 /* 5318 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5319 * that specifies an instruction that performs "x0 = x0 op x1". 5320 * This must not be a function call, as we keep w2 live across it. 5321 * 5322 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5323 * vCC (w1). Useful for integer division and modulus. 5324 * 5325 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr, 5326 * and-long/2addr, or-long/2addr, xor-long/2addr, 5327 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr, 5328 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr 5329 */ 5330 /* binop/2addr vA, vB */ 5331 lsr w1, wINST, #12 // w1<- B 5332 ubfx w2, wINST, #8, #4 // w2<- A 5333 GET_VREG_WIDE x1, w1 // x1<- vB 5334 GET_VREG_WIDE x0, w2 // x0<- vA 5335 .if 1 5336 cbz x1, common_errDivideByZero 5337 .endif 5338 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5339 sdiv x3, x0, x1 5340 msub x0, x3, x1, x0 // result<- op 5341 GET_INST_OPCODE ip // extract opcode from rINST 5342 SET_VREG_WIDE x0, w2 // vAA<- result 5343 GOTO_OPCODE ip // jump to next instruction 5344 /* 10-13 instructions */ 5345 5346 5347 /* ------------------------------ */ 5348 .balign 128 5349 .L_op_and_long_2addr: /* 0xc0 */ 5350 /* File: arm64/op_and_long_2addr.S */ 5351 /* File: arm64/binopWide2addr.S */ 5352 /* 5353 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5354 * that specifies an instruction that performs "x0 = x0 op x1". 5355 * This must not be a function call, as we keep w2 live across it. 5356 * 5357 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5358 * vCC (w1). Useful for integer division and modulus. 5359 * 5360 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr, 5361 * and-long/2addr, or-long/2addr, xor-long/2addr, 5362 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr, 5363 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr 5364 */ 5365 /* binop/2addr vA, vB */ 5366 lsr w1, wINST, #12 // w1<- B 5367 ubfx w2, wINST, #8, #4 // w2<- A 5368 GET_VREG_WIDE x1, w1 // x1<- vB 5369 GET_VREG_WIDE x0, w2 // x0<- vA 5370 .if 0 5371 cbz x1, common_errDivideByZero 5372 .endif 5373 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5374 5375 and x0, x0, x1 // result<- op 5376 GET_INST_OPCODE ip // extract opcode from rINST 5377 SET_VREG_WIDE x0, w2 // vAA<- result 5378 GOTO_OPCODE ip // jump to next instruction 5379 /* 10-13 instructions */ 5380 5381 5382 /* ------------------------------ */ 5383 .balign 128 5384 .L_op_or_long_2addr: /* 0xc1 */ 5385 /* File: arm64/op_or_long_2addr.S */ 5386 /* File: arm64/binopWide2addr.S */ 5387 /* 5388 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5389 * that specifies an instruction that performs "x0 = x0 op x1". 5390 * This must not be a function call, as we keep w2 live across it. 5391 * 5392 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5393 * vCC (w1). Useful for integer division and modulus. 5394 * 5395 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr, 5396 * and-long/2addr, or-long/2addr, xor-long/2addr, 5397 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr, 5398 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr 5399 */ 5400 /* binop/2addr vA, vB */ 5401 lsr w1, wINST, #12 // w1<- B 5402 ubfx w2, wINST, #8, #4 // w2<- A 5403 GET_VREG_WIDE x1, w1 // x1<- vB 5404 GET_VREG_WIDE x0, w2 // x0<- vA 5405 .if 0 5406 cbz x1, common_errDivideByZero 5407 .endif 5408 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5409 5410 orr x0, x0, x1 // result<- op 5411 GET_INST_OPCODE ip // extract opcode from rINST 5412 SET_VREG_WIDE x0, w2 // vAA<- result 5413 GOTO_OPCODE ip // jump to next instruction 5414 /* 10-13 instructions */ 5415 5416 5417 /* ------------------------------ */ 5418 .balign 128 5419 .L_op_xor_long_2addr: /* 0xc2 */ 5420 /* File: arm64/op_xor_long_2addr.S */ 5421 /* File: arm64/binopWide2addr.S */ 5422 /* 5423 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5424 * that specifies an instruction that performs "x0 = x0 op x1". 5425 * This must not be a function call, as we keep w2 live across it. 5426 * 5427 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5428 * vCC (w1). Useful for integer division and modulus. 5429 * 5430 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr, 5431 * and-long/2addr, or-long/2addr, xor-long/2addr, 5432 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr, 5433 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr 5434 */ 5435 /* binop/2addr vA, vB */ 5436 lsr w1, wINST, #12 // w1<- B 5437 ubfx w2, wINST, #8, #4 // w2<- A 5438 GET_VREG_WIDE x1, w1 // x1<- vB 5439 GET_VREG_WIDE x0, w2 // x0<- vA 5440 .if 0 5441 cbz x1, common_errDivideByZero 5442 .endif 5443 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5444 5445 eor x0, x0, x1 // result<- op 5446 GET_INST_OPCODE ip // extract opcode from rINST 5447 SET_VREG_WIDE x0, w2 // vAA<- result 5448 GOTO_OPCODE ip // jump to next instruction 5449 /* 10-13 instructions */ 5450 5451 5452 /* ------------------------------ */ 5453 .balign 128 5454 .L_op_shl_long_2addr: /* 0xc3 */ 5455 /* File: arm64/op_shl_long_2addr.S */ 5456 /* File: arm64/shiftWide2addr.S */ 5457 /* 5458 * Generic 64-bit shift operation. 5459 */ 5460 /* binop/2addr vA, vB */ 5461 lsr w1, wINST, #12 // w1<- B 5462 ubfx w2, wINST, #8, #4 // w2<- A 5463 GET_VREG w1, w1 // x1<- vB 5464 GET_VREG_WIDE x0, w2 // x0<- vA 5465 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5466 and x1, x1, #63 // Mask low 6 bits. 5467 lsl x0, x0, x1 5468 GET_INST_OPCODE ip // extract opcode from rINST 5469 SET_VREG_WIDE x0, w2 // vAA<- result 5470 GOTO_OPCODE ip // jump to next instruction 5471 /* 10-13 instructions */ 5472 5473 5474 /* ------------------------------ */ 5475 .balign 128 5476 .L_op_shr_long_2addr: /* 0xc4 */ 5477 /* File: arm64/op_shr_long_2addr.S */ 5478 /* File: arm64/shiftWide2addr.S */ 5479 /* 5480 * Generic 64-bit shift operation. 5481 */ 5482 /* binop/2addr vA, vB */ 5483 lsr w1, wINST, #12 // w1<- B 5484 ubfx w2, wINST, #8, #4 // w2<- A 5485 GET_VREG w1, w1 // x1<- vB 5486 GET_VREG_WIDE x0, w2 // x0<- vA 5487 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5488 and x1, x1, #63 // Mask low 6 bits. 5489 asr x0, x0, x1 5490 GET_INST_OPCODE ip // extract opcode from rINST 5491 SET_VREG_WIDE x0, w2 // vAA<- result 5492 GOTO_OPCODE ip // jump to next instruction 5493 /* 10-13 instructions */ 5494 5495 5496 /* ------------------------------ */ 5497 .balign 128 5498 .L_op_ushr_long_2addr: /* 0xc5 */ 5499 /* File: arm64/op_ushr_long_2addr.S */ 5500 /* File: arm64/shiftWide2addr.S */ 5501 /* 5502 * Generic 64-bit shift operation. 5503 */ 5504 /* binop/2addr vA, vB */ 5505 lsr w1, wINST, #12 // w1<- B 5506 ubfx w2, wINST, #8, #4 // w2<- A 5507 GET_VREG w1, w1 // x1<- vB 5508 GET_VREG_WIDE x0, w2 // x0<- vA 5509 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5510 and x1, x1, #63 // Mask low 6 bits. 5511 lsr x0, x0, x1 5512 GET_INST_OPCODE ip // extract opcode from rINST 5513 SET_VREG_WIDE x0, w2 // vAA<- result 5514 GOTO_OPCODE ip // jump to next instruction 5515 /* 10-13 instructions */ 5516 5517 5518 /* ------------------------------ */ 5519 .balign 128 5520 .L_op_add_float_2addr: /* 0xc6 */ 5521 /* File: arm64/op_add_float_2addr.S */ 5522 /* File: arm64/fbinop2addr.S */ 5523 /* 5524 * Generic 32-bit floating point "/2addr" binary operation. Provide 5525 * an "instr" line that specifies an instruction that performs 5526 * "s2 = s0 op s1". 5527 * 5528 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr 5529 */ 5530 /* binop/2addr vA, vB */ 5531 lsr w3, wINST, #12 // w3<- B 5532 lsr w9, wINST, #8 // w9<- A+ 5533 and w9, w9, #15 // w9<- A 5534 GET_VREG s1, w3 5535 GET_VREG s0, w9 5536 fadd s2, s0, s1 // s2<- op 5537 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5538 GET_INST_OPCODE ip // extract opcode from rINST 5539 SET_VREG s2, w9 5540 GOTO_OPCODE ip // jump to next instruction 5541 5542 5543 /* ------------------------------ */ 5544 .balign 128 5545 .L_op_sub_float_2addr: /* 0xc7 */ 5546 /* File: arm64/op_sub_float_2addr.S */ 5547 /* File: arm64/fbinop2addr.S */ 5548 /* 5549 * Generic 32-bit floating point "/2addr" binary operation. Provide 5550 * an "instr" line that specifies an instruction that performs 5551 * "s2 = s0 op s1". 5552 * 5553 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr 5554 */ 5555 /* binop/2addr vA, vB */ 5556 lsr w3, wINST, #12 // w3<- B 5557 lsr w9, wINST, #8 // w9<- A+ 5558 and w9, w9, #15 // w9<- A 5559 GET_VREG s1, w3 5560 GET_VREG s0, w9 5561 fsub s2, s0, s1 // s2<- op 5562 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5563 GET_INST_OPCODE ip // extract opcode from rINST 5564 SET_VREG s2, w9 5565 GOTO_OPCODE ip // jump to next instruction 5566 5567 5568 /* ------------------------------ */ 5569 .balign 128 5570 .L_op_mul_float_2addr: /* 0xc8 */ 5571 /* File: arm64/op_mul_float_2addr.S */ 5572 /* File: arm64/fbinop2addr.S */ 5573 /* 5574 * Generic 32-bit floating point "/2addr" binary operation. Provide 5575 * an "instr" line that specifies an instruction that performs 5576 * "s2 = s0 op s1". 5577 * 5578 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr 5579 */ 5580 /* binop/2addr vA, vB */ 5581 lsr w3, wINST, #12 // w3<- B 5582 lsr w9, wINST, #8 // w9<- A+ 5583 and w9, w9, #15 // w9<- A 5584 GET_VREG s1, w3 5585 GET_VREG s0, w9 5586 fmul s2, s0, s1 // s2<- op 5587 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5588 GET_INST_OPCODE ip // extract opcode from rINST 5589 SET_VREG s2, w9 5590 GOTO_OPCODE ip // jump to next instruction 5591 5592 5593 /* ------------------------------ */ 5594 .balign 128 5595 .L_op_div_float_2addr: /* 0xc9 */ 5596 /* File: arm64/op_div_float_2addr.S */ 5597 /* File: arm64/fbinop2addr.S */ 5598 /* 5599 * Generic 32-bit floating point "/2addr" binary operation. Provide 5600 * an "instr" line that specifies an instruction that performs 5601 * "s2 = s0 op s1". 5602 * 5603 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr 5604 */ 5605 /* binop/2addr vA, vB */ 5606 lsr w3, wINST, #12 // w3<- B 5607 lsr w9, wINST, #8 // w9<- A+ 5608 and w9, w9, #15 // w9<- A 5609 GET_VREG s1, w3 5610 GET_VREG s0, w9 5611 fdiv s2, s0, s1 // s2<- op 5612 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5613 GET_INST_OPCODE ip // extract opcode from rINST 5614 SET_VREG s2, w9 5615 GOTO_OPCODE ip // jump to next instruction 5616 5617 5618 /* ------------------------------ */ 5619 .balign 128 5620 .L_op_rem_float_2addr: /* 0xca */ 5621 /* File: arm64/op_rem_float_2addr.S */ 5622 /* rem vA, vB */ 5623 lsr w3, wINST, #12 // w3<- B 5624 lsr w9, wINST, #8 // w9<- A+ 5625 and w9, w9, #15 // w9<- A 5626 GET_VREG s1, w3 5627 GET_VREG s0, w9 5628 bl fmodf 5629 lsr w9, wINST, #8 // w9<- A+ 5630 and w9, w9, #15 // w9<- A 5631 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5632 GET_INST_OPCODE ip // extract opcode from rINST 5633 SET_VREG s0, w9 5634 GOTO_OPCODE ip // jump to next instruction 5635 5636 /* ------------------------------ */ 5637 .balign 128 5638 .L_op_add_double_2addr: /* 0xcb */ 5639 /* File: arm64/op_add_double_2addr.S */ 5640 /* File: arm64/binopWide2addr.S */ 5641 /* 5642 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5643 * that specifies an instruction that performs "x0 = x0 op x1". 5644 * This must not be a function call, as we keep w2 live across it. 5645 * 5646 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5647 * vCC (w1). Useful for integer division and modulus. 5648 * 5649 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr, 5650 * and-long/2addr, or-long/2addr, xor-long/2addr, 5651 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr, 5652 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr 5653 */ 5654 /* binop/2addr vA, vB */ 5655 lsr w1, wINST, #12 // w1<- B 5656 ubfx w2, wINST, #8, #4 // w2<- A 5657 GET_VREG_WIDE d1, w1 // x1<- vB 5658 GET_VREG_WIDE d0, w2 // x0<- vA 5659 .if 0 5660 cbz d1, common_errDivideByZero 5661 .endif 5662 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5663 5664 fadd d0, d0, d1 // result<- op 5665 GET_INST_OPCODE ip // extract opcode from rINST 5666 SET_VREG_WIDE d0, w2 // vAA<- result 5667 GOTO_OPCODE ip // jump to next instruction 5668 /* 10-13 instructions */ 5669 5670 5671 /* ------------------------------ */ 5672 .balign 128 5673 .L_op_sub_double_2addr: /* 0xcc */ 5674 /* File: arm64/op_sub_double_2addr.S */ 5675 /* File: arm64/binopWide2addr.S */ 5676 /* 5677 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5678 * that specifies an instruction that performs "x0 = x0 op x1". 5679 * This must not be a function call, as we keep w2 live across it. 5680 * 5681 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5682 * vCC (w1). Useful for integer division and modulus. 5683 * 5684 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr, 5685 * and-long/2addr, or-long/2addr, xor-long/2addr, 5686 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr, 5687 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr 5688 */ 5689 /* binop/2addr vA, vB */ 5690 lsr w1, wINST, #12 // w1<- B 5691 ubfx w2, wINST, #8, #4 // w2<- A 5692 GET_VREG_WIDE d1, w1 // x1<- vB 5693 GET_VREG_WIDE d0, w2 // x0<- vA 5694 .if 0 5695 cbz d1, common_errDivideByZero 5696 .endif 5697 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5698 5699 fsub d0, d0, d1 // result<- op 5700 GET_INST_OPCODE ip // extract opcode from rINST 5701 SET_VREG_WIDE d0, w2 // vAA<- result 5702 GOTO_OPCODE ip // jump to next instruction 5703 /* 10-13 instructions */ 5704 5705 5706 /* ------------------------------ */ 5707 .balign 128 5708 .L_op_mul_double_2addr: /* 0xcd */ 5709 /* File: arm64/op_mul_double_2addr.S */ 5710 /* File: arm64/binopWide2addr.S */ 5711 /* 5712 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5713 * that specifies an instruction that performs "x0 = x0 op x1". 5714 * This must not be a function call, as we keep w2 live across it. 5715 * 5716 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5717 * vCC (w1). Useful for integer division and modulus. 5718 * 5719 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr, 5720 * and-long/2addr, or-long/2addr, xor-long/2addr, 5721 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr, 5722 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr 5723 */ 5724 /* binop/2addr vA, vB */ 5725 lsr w1, wINST, #12 // w1<- B 5726 ubfx w2, wINST, #8, #4 // w2<- A 5727 GET_VREG_WIDE d1, w1 // x1<- vB 5728 GET_VREG_WIDE d0, w2 // x0<- vA 5729 .if 0 5730 cbz d1, common_errDivideByZero 5731 .endif 5732 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5733 5734 fmul d0, d0, d1 // result<- op 5735 GET_INST_OPCODE ip // extract opcode from rINST 5736 SET_VREG_WIDE d0, w2 // vAA<- result 5737 GOTO_OPCODE ip // jump to next instruction 5738 /* 10-13 instructions */ 5739 5740 5741 /* ------------------------------ */ 5742 .balign 128 5743 .L_op_div_double_2addr: /* 0xce */ 5744 /* File: arm64/op_div_double_2addr.S */ 5745 /* File: arm64/binopWide2addr.S */ 5746 /* 5747 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line 5748 * that specifies an instruction that performs "x0 = x0 op x1". 5749 * This must not be a function call, as we keep w2 live across it. 5750 * 5751 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5752 * vCC (w1). Useful for integer division and modulus. 5753 * 5754 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr, 5755 * and-long/2addr, or-long/2addr, xor-long/2addr, 5756 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr, 5757 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr 5758 */ 5759 /* binop/2addr vA, vB */ 5760 lsr w1, wINST, #12 // w1<- B 5761 ubfx w2, wINST, #8, #4 // w2<- A 5762 GET_VREG_WIDE d1, w1 // x1<- vB 5763 GET_VREG_WIDE d0, w2 // x0<- vA 5764 .if 0 5765 cbz d1, common_errDivideByZero 5766 .endif 5767 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5768 5769 fdiv d0, d0, d1 // result<- op 5770 GET_INST_OPCODE ip // extract opcode from rINST 5771 SET_VREG_WIDE d0, w2 // vAA<- result 5772 GOTO_OPCODE ip // jump to next instruction 5773 /* 10-13 instructions */ 5774 5775 5776 /* ------------------------------ */ 5777 .balign 128 5778 .L_op_rem_double_2addr: /* 0xcf */ 5779 /* File: arm64/op_rem_double_2addr.S */ 5780 /* rem vA, vB */ 5781 lsr w1, wINST, #12 // w1<- B 5782 ubfx w2, wINST, #8, #4 // w2<- A 5783 GET_VREG_WIDE d1, w1 // d1<- vB 5784 GET_VREG_WIDE d0, w2 // d0<- vA 5785 bl fmod 5786 ubfx w2, wINST, #8, #4 // w2<- A (need to reload - killed across call) 5787 FETCH_ADVANCE_INST 1 // advance rPC, load rINST 5788 GET_INST_OPCODE ip // extract opcode from rINST 5789 SET_VREG_WIDE d0, w2 // vAA<- result 5790 GOTO_OPCODE ip // jump to next instruction 5791 /* 10-13 instructions */ 5792 5793 /* ------------------------------ */ 5794 .balign 128 5795 .L_op_add_int_lit16: /* 0xd0 */ 5796 /* File: arm64/op_add_int_lit16.S */ 5797 /* File: arm64/binopLit16.S */ 5798 /* 5799 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5800 * that specifies an instruction that performs "result = w0 op w1". 5801 * This could be an ARM instruction or a function call. (If the result 5802 * comes back in a register other than w0, you can override "result".) 5803 * 5804 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5805 * vCC (w1). Useful for integer division and modulus. 5806 * 5807 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 5808 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 5809 */ 5810 /* binop/lit16 vA, vB, #+CCCC */ 5811 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended) 5812 lsr w2, wINST, #12 // w2<- B 5813 ubfx w9, wINST, #8, #4 // w9<- A 5814 GET_VREG w0, w2 // w0<- vB 5815 .if 0 5816 cbz w1, common_errDivideByZero 5817 .endif 5818 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 5819 5820 add w0, w0, w1 // w0<- op, w0-w3 changed 5821 GET_INST_OPCODE ip // extract opcode from rINST 5822 SET_VREG w0, w9 // vAA<- w0 5823 GOTO_OPCODE ip // jump to next instruction 5824 /* 10-13 instructions */ 5825 5826 5827 /* ------------------------------ */ 5828 .balign 128 5829 .L_op_rsub_int: /* 0xd1 */ 5830 /* File: arm64/op_rsub_int.S */ 5831 /* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */ 5832 /* File: arm64/binopLit16.S */ 5833 /* 5834 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5835 * that specifies an instruction that performs "result = w0 op w1". 5836 * This could be an ARM instruction or a function call. (If the result 5837 * comes back in a register other than w0, you can override "result".) 5838 * 5839 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5840 * vCC (w1). Useful for integer division and modulus. 5841 * 5842 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 5843 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 5844 */ 5845 /* binop/lit16 vA, vB, #+CCCC */ 5846 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended) 5847 lsr w2, wINST, #12 // w2<- B 5848 ubfx w9, wINST, #8, #4 // w9<- A 5849 GET_VREG w0, w2 // w0<- vB 5850 .if 0 5851 cbz w1, common_errDivideByZero 5852 .endif 5853 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 5854 5855 sub w0, w1, w0 // w0<- op, w0-w3 changed 5856 GET_INST_OPCODE ip // extract opcode from rINST 5857 SET_VREG w0, w9 // vAA<- w0 5858 GOTO_OPCODE ip // jump to next instruction 5859 /* 10-13 instructions */ 5860 5861 5862 /* ------------------------------ */ 5863 .balign 128 5864 .L_op_mul_int_lit16: /* 0xd2 */ 5865 /* File: arm64/op_mul_int_lit16.S */ 5866 /* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */ 5867 /* File: arm64/binopLit16.S */ 5868 /* 5869 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5870 * that specifies an instruction that performs "result = w0 op w1". 5871 * This could be an ARM instruction or a function call. (If the result 5872 * comes back in a register other than w0, you can override "result".) 5873 * 5874 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5875 * vCC (w1). Useful for integer division and modulus. 5876 * 5877 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 5878 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 5879 */ 5880 /* binop/lit16 vA, vB, #+CCCC */ 5881 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended) 5882 lsr w2, wINST, #12 // w2<- B 5883 ubfx w9, wINST, #8, #4 // w9<- A 5884 GET_VREG w0, w2 // w0<- vB 5885 .if 0 5886 cbz w1, common_errDivideByZero 5887 .endif 5888 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 5889 5890 mul w0, w1, w0 // w0<- op, w0-w3 changed 5891 GET_INST_OPCODE ip // extract opcode from rINST 5892 SET_VREG w0, w9 // vAA<- w0 5893 GOTO_OPCODE ip // jump to next instruction 5894 /* 10-13 instructions */ 5895 5896 5897 /* ------------------------------ */ 5898 .balign 128 5899 .L_op_div_int_lit16: /* 0xd3 */ 5900 /* File: arm64/op_div_int_lit16.S */ 5901 /* File: arm64/binopLit16.S */ 5902 /* 5903 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5904 * that specifies an instruction that performs "result = w0 op w1". 5905 * This could be an ARM instruction or a function call. (If the result 5906 * comes back in a register other than w0, you can override "result".) 5907 * 5908 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5909 * vCC (w1). Useful for integer division and modulus. 5910 * 5911 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 5912 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 5913 */ 5914 /* binop/lit16 vA, vB, #+CCCC */ 5915 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended) 5916 lsr w2, wINST, #12 // w2<- B 5917 ubfx w9, wINST, #8, #4 // w9<- A 5918 GET_VREG w0, w2 // w0<- vB 5919 .if 1 5920 cbz w1, common_errDivideByZero 5921 .endif 5922 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 5923 5924 sdiv w0, w0, w1 // w0<- op, w0-w3 changed 5925 GET_INST_OPCODE ip // extract opcode from rINST 5926 SET_VREG w0, w9 // vAA<- w0 5927 GOTO_OPCODE ip // jump to next instruction 5928 /* 10-13 instructions */ 5929 5930 5931 /* ------------------------------ */ 5932 .balign 128 5933 .L_op_rem_int_lit16: /* 0xd4 */ 5934 /* File: arm64/op_rem_int_lit16.S */ 5935 /* File: arm64/binopLit16.S */ 5936 /* 5937 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5938 * that specifies an instruction that performs "result = w0 op w1". 5939 * This could be an ARM instruction or a function call. (If the result 5940 * comes back in a register other than w0, you can override "result".) 5941 * 5942 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5943 * vCC (w1). Useful for integer division and modulus. 5944 * 5945 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 5946 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 5947 */ 5948 /* binop/lit16 vA, vB, #+CCCC */ 5949 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended) 5950 lsr w2, wINST, #12 // w2<- B 5951 ubfx w9, wINST, #8, #4 // w9<- A 5952 GET_VREG w0, w2 // w0<- vB 5953 .if 1 5954 cbz w1, common_errDivideByZero 5955 .endif 5956 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 5957 sdiv w3, w0, w1 5958 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed 5959 GET_INST_OPCODE ip // extract opcode from rINST 5960 SET_VREG w0, w9 // vAA<- w0 5961 GOTO_OPCODE ip // jump to next instruction 5962 /* 10-13 instructions */ 5963 5964 5965 /* ------------------------------ */ 5966 .balign 128 5967 .L_op_and_int_lit16: /* 0xd5 */ 5968 /* File: arm64/op_and_int_lit16.S */ 5969 /* File: arm64/binopLit16.S */ 5970 /* 5971 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5972 * that specifies an instruction that performs "result = w0 op w1". 5973 * This could be an ARM instruction or a function call. (If the result 5974 * comes back in a register other than w0, you can override "result".) 5975 * 5976 * If "chkzero" is set to 1, we perform a divide-by-zero check on 5977 * vCC (w1). Useful for integer division and modulus. 5978 * 5979 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 5980 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 5981 */ 5982 /* binop/lit16 vA, vB, #+CCCC */ 5983 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended) 5984 lsr w2, wINST, #12 // w2<- B 5985 ubfx w9, wINST, #8, #4 // w9<- A 5986 GET_VREG w0, w2 // w0<- vB 5987 .if 0 5988 cbz w1, common_errDivideByZero 5989 .endif 5990 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 5991 5992 and w0, w0, w1 // w0<- op, w0-w3 changed 5993 GET_INST_OPCODE ip // extract opcode from rINST 5994 SET_VREG w0, w9 // vAA<- w0 5995 GOTO_OPCODE ip // jump to next instruction 5996 /* 10-13 instructions */ 5997 5998 5999 /* ------------------------------ */ 6000 .balign 128 6001 .L_op_or_int_lit16: /* 0xd6 */ 6002 /* File: arm64/op_or_int_lit16.S */ 6003 /* File: arm64/binopLit16.S */ 6004 /* 6005 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6006 * that specifies an instruction that performs "result = w0 op w1". 6007 * This could be an ARM instruction or a function call. (If the result 6008 * comes back in a register other than w0, you can override "result".) 6009 * 6010 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6011 * vCC (w1). Useful for integer division and modulus. 6012 * 6013 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6014 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6015 */ 6016 /* binop/lit16 vA, vB, #+CCCC */ 6017 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended) 6018 lsr w2, wINST, #12 // w2<- B 6019 ubfx w9, wINST, #8, #4 // w9<- A 6020 GET_VREG w0, w2 // w0<- vB 6021 .if 0 6022 cbz w1, common_errDivideByZero 6023 .endif 6024 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6025 6026 orr w0, w0, w1 // w0<- op, w0-w3 changed 6027 GET_INST_OPCODE ip // extract opcode from rINST 6028 SET_VREG w0, w9 // vAA<- w0 6029 GOTO_OPCODE ip // jump to next instruction 6030 /* 10-13 instructions */ 6031 6032 6033 /* ------------------------------ */ 6034 .balign 128 6035 .L_op_xor_int_lit16: /* 0xd7 */ 6036 /* File: arm64/op_xor_int_lit16.S */ 6037 /* File: arm64/binopLit16.S */ 6038 /* 6039 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 6040 * that specifies an instruction that performs "result = w0 op w1". 6041 * This could be an ARM instruction or a function call. (If the result 6042 * comes back in a register other than w0, you can override "result".) 6043 * 6044 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6045 * vCC (w1). Useful for integer division and modulus. 6046 * 6047 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16, 6048 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16 6049 */ 6050 /* binop/lit16 vA, vB, #+CCCC */ 6051 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended) 6052 lsr w2, wINST, #12 // w2<- B 6053 ubfx w9, wINST, #8, #4 // w9<- A 6054 GET_VREG w0, w2 // w0<- vB 6055 .if 0 6056 cbz w1, common_errDivideByZero 6057 .endif 6058 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6059 6060 eor w0, w0, w1 // w0<- op, w0-w3 changed 6061 GET_INST_OPCODE ip // extract opcode from rINST 6062 SET_VREG w0, w9 // vAA<- w0 6063 GOTO_OPCODE ip // jump to next instruction 6064 /* 10-13 instructions */ 6065 6066 6067 /* ------------------------------ */ 6068 .balign 128 6069 .L_op_add_int_lit8: /* 0xd8 */ 6070 /* File: arm64/op_add_int_lit8.S */ 6071 /* File: arm64/binopLit8.S */ 6072 /* 6073 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6074 * that specifies an instruction that performs "result = w0 op w1". 6075 * This could be an ARM instruction or a function call. (If the result 6076 * comes back in a register other than w0, you can override "result".) 6077 * 6078 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6079 * vCC (w1). Useful for integer division and modulus. 6080 * 6081 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6082 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6083 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6084 */ 6085 /* binop/lit8 vAA, vBB, #+CC */ 6086 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC 6087 lsr w9, wINST, #8 // w9<- AA 6088 and w2, w3, #255 // w2<- BB 6089 GET_VREG w0, w2 // w0<- vBB 6090 asr w1, w3, #8 // w1<- ssssssCC (sign extended) 6091 .if 0 6092 cbz w1, common_errDivideByZero 6093 .endif 6094 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6095 // optional op; may set condition codes 6096 add w0, w0, w1 // w0<- op, w0-w3 changed 6097 GET_INST_OPCODE ip // extract opcode from rINST 6098 SET_VREG w0, w9 // vAA<- w0 6099 GOTO_OPCODE ip // jump to next instruction 6100 /* 10-12 instructions */ 6101 6102 6103 /* ------------------------------ */ 6104 .balign 128 6105 .L_op_rsub_int_lit8: /* 0xd9 */ 6106 /* File: arm64/op_rsub_int_lit8.S */ 6107 /* File: arm64/binopLit8.S */ 6108 /* 6109 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6110 * that specifies an instruction that performs "result = w0 op w1". 6111 * This could be an ARM instruction or a function call. (If the result 6112 * comes back in a register other than w0, you can override "result".) 6113 * 6114 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6115 * vCC (w1). Useful for integer division and modulus. 6116 * 6117 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6118 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6119 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6120 */ 6121 /* binop/lit8 vAA, vBB, #+CC */ 6122 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC 6123 lsr w9, wINST, #8 // w9<- AA 6124 and w2, w3, #255 // w2<- BB 6125 GET_VREG w0, w2 // w0<- vBB 6126 asr w1, w3, #8 // w1<- ssssssCC (sign extended) 6127 .if 0 6128 cbz w1, common_errDivideByZero 6129 .endif 6130 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6131 // optional op; may set condition codes 6132 sub w0, w1, w0 // w0<- op, w0-w3 changed 6133 GET_INST_OPCODE ip // extract opcode from rINST 6134 SET_VREG w0, w9 // vAA<- w0 6135 GOTO_OPCODE ip // jump to next instruction 6136 /* 10-12 instructions */ 6137 6138 6139 /* ------------------------------ */ 6140 .balign 128 6141 .L_op_mul_int_lit8: /* 0xda */ 6142 /* File: arm64/op_mul_int_lit8.S */ 6143 /* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */ 6144 /* File: arm64/binopLit8.S */ 6145 /* 6146 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6147 * that specifies an instruction that performs "result = w0 op w1". 6148 * This could be an ARM instruction or a function call. (If the result 6149 * comes back in a register other than w0, you can override "result".) 6150 * 6151 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6152 * vCC (w1). Useful for integer division and modulus. 6153 * 6154 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6155 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6156 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6157 */ 6158 /* binop/lit8 vAA, vBB, #+CC */ 6159 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC 6160 lsr w9, wINST, #8 // w9<- AA 6161 and w2, w3, #255 // w2<- BB 6162 GET_VREG w0, w2 // w0<- vBB 6163 asr w1, w3, #8 // w1<- ssssssCC (sign extended) 6164 .if 0 6165 cbz w1, common_errDivideByZero 6166 .endif 6167 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6168 // optional op; may set condition codes 6169 mul w0, w1, w0 // w0<- op, w0-w3 changed 6170 GET_INST_OPCODE ip // extract opcode from rINST 6171 SET_VREG w0, w9 // vAA<- w0 6172 GOTO_OPCODE ip // jump to next instruction 6173 /* 10-12 instructions */ 6174 6175 6176 /* ------------------------------ */ 6177 .balign 128 6178 .L_op_div_int_lit8: /* 0xdb */ 6179 /* File: arm64/op_div_int_lit8.S */ 6180 /* File: arm64/binopLit8.S */ 6181 /* 6182 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6183 * that specifies an instruction that performs "result = w0 op w1". 6184 * This could be an ARM instruction or a function call. (If the result 6185 * comes back in a register other than w0, you can override "result".) 6186 * 6187 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6188 * vCC (w1). Useful for integer division and modulus. 6189 * 6190 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6191 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6192 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6193 */ 6194 /* binop/lit8 vAA, vBB, #+CC */ 6195 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC 6196 lsr w9, wINST, #8 // w9<- AA 6197 and w2, w3, #255 // w2<- BB 6198 GET_VREG w0, w2 // w0<- vBB 6199 asr w1, w3, #8 // w1<- ssssssCC (sign extended) 6200 .if 1 6201 cbz w1, common_errDivideByZero 6202 .endif 6203 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6204 // optional op; may set condition codes 6205 sdiv w0, w0, w1 // w0<- op, w0-w3 changed 6206 GET_INST_OPCODE ip // extract opcode from rINST 6207 SET_VREG w0, w9 // vAA<- w0 6208 GOTO_OPCODE ip // jump to next instruction 6209 /* 10-12 instructions */ 6210 6211 6212 /* ------------------------------ */ 6213 .balign 128 6214 .L_op_rem_int_lit8: /* 0xdc */ 6215 /* File: arm64/op_rem_int_lit8.S */ 6216 /* File: arm64/binopLit8.S */ 6217 /* 6218 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6219 * that specifies an instruction that performs "result = w0 op w1". 6220 * This could be an ARM instruction or a function call. (If the result 6221 * comes back in a register other than w0, you can override "result".) 6222 * 6223 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6224 * vCC (w1). Useful for integer division and modulus. 6225 * 6226 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6227 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6228 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6229 */ 6230 /* binop/lit8 vAA, vBB, #+CC */ 6231 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC 6232 lsr w9, wINST, #8 // w9<- AA 6233 and w2, w3, #255 // w2<- BB 6234 GET_VREG w0, w2 // w0<- vBB 6235 asr w1, w3, #8 // w1<- ssssssCC (sign extended) 6236 .if 1 6237 cbz w1, common_errDivideByZero 6238 .endif 6239 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6240 sdiv w3, w0, w1 // optional op; may set condition codes 6241 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed 6242 GET_INST_OPCODE ip // extract opcode from rINST 6243 SET_VREG w0, w9 // vAA<- w0 6244 GOTO_OPCODE ip // jump to next instruction 6245 /* 10-12 instructions */ 6246 6247 6248 /* ------------------------------ */ 6249 .balign 128 6250 .L_op_and_int_lit8: /* 0xdd */ 6251 /* File: arm64/op_and_int_lit8.S */ 6252 /* File: arm64/binopLit8.S */ 6253 /* 6254 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6255 * that specifies an instruction that performs "result = w0 op w1". 6256 * This could be an ARM instruction or a function call. (If the result 6257 * comes back in a register other than w0, you can override "result".) 6258 * 6259 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6260 * vCC (w1). Useful for integer division and modulus. 6261 * 6262 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6263 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6264 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6265 */ 6266 /* binop/lit8 vAA, vBB, #+CC */ 6267 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC 6268 lsr w9, wINST, #8 // w9<- AA 6269 and w2, w3, #255 // w2<- BB 6270 GET_VREG w0, w2 // w0<- vBB 6271 asr w1, w3, #8 // w1<- ssssssCC (sign extended) 6272 .if 0 6273 cbz w1, common_errDivideByZero 6274 .endif 6275 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6276 // optional op; may set condition codes 6277 and w0, w0, w1 // w0<- op, w0-w3 changed 6278 GET_INST_OPCODE ip // extract opcode from rINST 6279 SET_VREG w0, w9 // vAA<- w0 6280 GOTO_OPCODE ip // jump to next instruction 6281 /* 10-12 instructions */ 6282 6283 6284 /* ------------------------------ */ 6285 .balign 128 6286 .L_op_or_int_lit8: /* 0xde */ 6287 /* File: arm64/op_or_int_lit8.S */ 6288 /* File: arm64/binopLit8.S */ 6289 /* 6290 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6291 * that specifies an instruction that performs "result = w0 op w1". 6292 * This could be an ARM instruction or a function call. (If the result 6293 * comes back in a register other than w0, you can override "result".) 6294 * 6295 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6296 * vCC (w1). Useful for integer division and modulus. 6297 * 6298 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6299 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6300 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6301 */ 6302 /* binop/lit8 vAA, vBB, #+CC */ 6303 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC 6304 lsr w9, wINST, #8 // w9<- AA 6305 and w2, w3, #255 // w2<- BB 6306 GET_VREG w0, w2 // w0<- vBB 6307 asr w1, w3, #8 // w1<- ssssssCC (sign extended) 6308 .if 0 6309 cbz w1, common_errDivideByZero 6310 .endif 6311 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6312 // optional op; may set condition codes 6313 orr w0, w0, w1 // w0<- op, w0-w3 changed 6314 GET_INST_OPCODE ip // extract opcode from rINST 6315 SET_VREG w0, w9 // vAA<- w0 6316 GOTO_OPCODE ip // jump to next instruction 6317 /* 10-12 instructions */ 6318 6319 6320 /* ------------------------------ */ 6321 .balign 128 6322 .L_op_xor_int_lit8: /* 0xdf */ 6323 /* File: arm64/op_xor_int_lit8.S */ 6324 /* File: arm64/binopLit8.S */ 6325 /* 6326 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6327 * that specifies an instruction that performs "result = w0 op w1". 6328 * This could be an ARM instruction or a function call. (If the result 6329 * comes back in a register other than w0, you can override "result".) 6330 * 6331 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6332 * vCC (w1). Useful for integer division and modulus. 6333 * 6334 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6335 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6336 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6337 */ 6338 /* binop/lit8 vAA, vBB, #+CC */ 6339 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC 6340 lsr w9, wINST, #8 // w9<- AA 6341 and w2, w3, #255 // w2<- BB 6342 GET_VREG w0, w2 // w0<- vBB 6343 asr w1, w3, #8 // w1<- ssssssCC (sign extended) 6344 .if 0 6345 cbz w1, common_errDivideByZero 6346 .endif 6347 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6348 // optional op; may set condition codes 6349 eor w0, w0, w1 // w0<- op, w0-w3 changed 6350 GET_INST_OPCODE ip // extract opcode from rINST 6351 SET_VREG w0, w9 // vAA<- w0 6352 GOTO_OPCODE ip // jump to next instruction 6353 /* 10-12 instructions */ 6354 6355 6356 /* ------------------------------ */ 6357 .balign 128 6358 .L_op_shl_int_lit8: /* 0xe0 */ 6359 /* File: arm64/op_shl_int_lit8.S */ 6360 /* File: arm64/binopLit8.S */ 6361 /* 6362 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6363 * that specifies an instruction that performs "result = w0 op w1". 6364 * This could be an ARM instruction or a function call. (If the result 6365 * comes back in a register other than w0, you can override "result".) 6366 * 6367 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6368 * vCC (w1). Useful for integer division and modulus. 6369 * 6370 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6371 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6372 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6373 */ 6374 /* binop/lit8 vAA, vBB, #+CC */ 6375 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC 6376 lsr w9, wINST, #8 // w9<- AA 6377 and w2, w3, #255 // w2<- BB 6378 GET_VREG w0, w2 // w0<- vBB 6379 asr w1, w3, #8 // w1<- ssssssCC (sign extended) 6380 .if 0 6381 cbz w1, common_errDivideByZero 6382 .endif 6383 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6384 and w1, w1, #31 // optional op; may set condition codes 6385 lsl w0, w0, w1 // w0<- op, w0-w3 changed 6386 GET_INST_OPCODE ip // extract opcode from rINST 6387 SET_VREG w0, w9 // vAA<- w0 6388 GOTO_OPCODE ip // jump to next instruction 6389 /* 10-12 instructions */ 6390 6391 6392 /* ------------------------------ */ 6393 .balign 128 6394 .L_op_shr_int_lit8: /* 0xe1 */ 6395 /* File: arm64/op_shr_int_lit8.S */ 6396 /* File: arm64/binopLit8.S */ 6397 /* 6398 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6399 * that specifies an instruction that performs "result = w0 op w1". 6400 * This could be an ARM instruction or a function call. (If the result 6401 * comes back in a register other than w0, you can override "result".) 6402 * 6403 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6404 * vCC (w1). Useful for integer division and modulus. 6405 * 6406 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6407 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6408 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6409 */ 6410 /* binop/lit8 vAA, vBB, #+CC */ 6411 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC 6412 lsr w9, wINST, #8 // w9<- AA 6413 and w2, w3, #255 // w2<- BB 6414 GET_VREG w0, w2 // w0<- vBB 6415 asr w1, w3, #8 // w1<- ssssssCC (sign extended) 6416 .if 0 6417 cbz w1, common_errDivideByZero 6418 .endif 6419 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6420 and w1, w1, #31 // optional op; may set condition codes 6421 asr w0, w0, w1 // w0<- op, w0-w3 changed 6422 GET_INST_OPCODE ip // extract opcode from rINST 6423 SET_VREG w0, w9 // vAA<- w0 6424 GOTO_OPCODE ip // jump to next instruction 6425 /* 10-12 instructions */ 6426 6427 6428 /* ------------------------------ */ 6429 .balign 128 6430 .L_op_ushr_int_lit8: /* 0xe2 */ 6431 /* File: arm64/op_ushr_int_lit8.S */ 6432 /* File: arm64/binopLit8.S */ 6433 /* 6434 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 6435 * that specifies an instruction that performs "result = w0 op w1". 6436 * This could be an ARM instruction or a function call. (If the result 6437 * comes back in a register other than w0, you can override "result".) 6438 * 6439 * If "chkzero" is set to 1, we perform a divide-by-zero check on 6440 * vCC (w1). Useful for integer division and modulus. 6441 * 6442 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8, 6443 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8, 6444 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 6445 */ 6446 /* binop/lit8 vAA, vBB, #+CC */ 6447 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC 6448 lsr w9, wINST, #8 // w9<- AA 6449 and w2, w3, #255 // w2<- BB 6450 GET_VREG w0, w2 // w0<- vBB 6451 asr w1, w3, #8 // w1<- ssssssCC (sign extended) 6452 .if 0 6453 cbz w1, common_errDivideByZero 6454 .endif 6455 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6456 and w1, w1, #31 // optional op; may set condition codes 6457 lsr w0, w0, w1 // w0<- op, w0-w3 changed 6458 GET_INST_OPCODE ip // extract opcode from rINST 6459 SET_VREG w0, w9 // vAA<- w0 6460 GOTO_OPCODE ip // jump to next instruction 6461 /* 10-12 instructions */ 6462 6463 6464 /* ------------------------------ */ 6465 .balign 128 6466 .L_op_iget_quick: /* 0xe3 */ 6467 /* File: arm64/op_iget_quick.S */ 6468 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */ 6469 /* op vA, vB, offset//CCCC */ 6470 lsr w2, wINST, #12 // w2<- B 6471 FETCH w1, 1 // w1<- field byte offset 6472 GET_VREG w3, w2 // w3<- object we're operating on 6473 ubfx w2, wINST, #8, #4 // w2<- A 6474 cmp x3, #0 // check object for null 6475 beq common_errNullObject // object was null 6476 ldr w0, [x3, x1] // w0<- obj.field 6477 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6478 6479 SET_VREG w0, w2 // fp[A]<- w0 6480 GET_INST_OPCODE ip // extract opcode from rINST 6481 GOTO_OPCODE ip // jump to next instruction 6482 6483 /* ------------------------------ */ 6484 .balign 128 6485 .L_op_iget_wide_quick: /* 0xe4 */ 6486 /* File: arm64/op_iget_wide_quick.S */ 6487 /* iget-wide-quick vA, vB, offset//CCCC */ 6488 lsr w2, wINST, #12 // w2<- B 6489 FETCH w4, 1 // w4<- field byte offset 6490 GET_VREG w3, w2 // w3<- object we're operating on 6491 ubfx w2, wINST, #8, #4 // w2<- A 6492 cbz w3, common_errNullObject // object was null 6493 add x4, x3, x4 // create direct pointer 6494 ldr x0, [x4] 6495 FETCH_ADVANCE_INST 2 // advance rPC, load wINST 6496 SET_VREG_WIDE x0, w2 6497 GET_INST_OPCODE ip // extract opcode from wINST 6498 GOTO_OPCODE ip // jump to next instruction 6499 6500 /* ------------------------------ */ 6501 .balign 128 6502 .L_op_iget_object_quick: /* 0xe5 */ 6503 /* File: arm64/op_iget_object_quick.S */ 6504 /* For: iget-object-quick */ 6505 /* op vA, vB, offset//CCCC */ 6506 lsr w2, wINST, #12 // w2<- B 6507 FETCH w1, 1 // w1<- field byte offset 6508 EXPORT_PC 6509 GET_VREG w0, w2 // w0<- object we're operating on 6510 bl artIGetObjectFromMterp // (obj, offset) 6511 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET] 6512 ubfx w2, wINST, #8, #4 // w2<- A 6513 PREFETCH_INST 2 6514 cbnz w3, MterpPossibleException // bail out 6515 SET_VREG_OBJECT w0, w2 // fp[A]<- w0 6516 ADVANCE 2 // advance rPC 6517 GET_INST_OPCODE ip // extract opcode from wINST 6518 GOTO_OPCODE ip // jump to next instruction 6519 6520 /* ------------------------------ */ 6521 .balign 128 6522 .L_op_iput_quick: /* 0xe6 */ 6523 /* File: arm64/op_iput_quick.S */ 6524 /* For: iput-quick, iput-object-quick */ 6525 /* op vA, vB, offset//CCCC */ 6526 lsr w2, wINST, #12 // w2<- B 6527 FETCH w1, 1 // w1<- field byte offset 6528 GET_VREG w3, w2 // w3<- fp[B], the object pointer 6529 ubfx w2, wINST, #8, #4 // w2<- A 6530 cmp w3, #0 // check object for null 6531 cbz w3, common_errNullObject // object was null 6532 GET_VREG w0, w2 // w0<- fp[A] 6533 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6534 str w0, [x3, x1] // obj.field<- w0 6535 GET_INST_OPCODE ip // extract opcode from rINST 6536 GOTO_OPCODE ip // jump to next instruction 6537 6538 /* ------------------------------ */ 6539 .balign 128 6540 .L_op_iput_wide_quick: /* 0xe7 */ 6541 /* File: arm64/op_iput_wide_quick.S */ 6542 /* iput-wide-quick vA, vB, offset//CCCC */ 6543 lsr w2, wINST, #12 // w2<- B 6544 FETCH w3, 1 // w3<- field byte offset 6545 GET_VREG w2, w2 // w2<- fp[B], the object pointer 6546 ubfx w0, wINST, #8, #4 // w0<- A 6547 cmp w2, #0 // check object for null 6548 beq common_errNullObject // object was null 6549 GET_VREG_WIDE x0, w0 // x0-< fp[A] 6550 FETCH_ADVANCE_INST 2 // advance rPC, load wINST 6551 add x1, x2, x3 // create a direct pointer 6552 str x0, [x1] 6553 GET_INST_OPCODE ip // extract opcode from wINST 6554 GOTO_OPCODE ip // jump to next instruction 6555 6556 /* ------------------------------ */ 6557 .balign 128 6558 .L_op_iput_object_quick: /* 0xe8 */ 6559 /* File: arm64/op_iput_object_quick.S */ 6560 EXPORT_PC 6561 add x0, xFP, #OFF_FP_SHADOWFRAME 6562 mov x1, xPC 6563 mov w2, wINST 6564 bl MterpIputObjectQuick 6565 cbz w0, MterpException 6566 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6567 GET_INST_OPCODE ip // extract opcode from rINST 6568 GOTO_OPCODE ip // jump to next instruction 6569 6570 /* ------------------------------ */ 6571 .balign 128 6572 .L_op_invoke_virtual_quick: /* 0xe9 */ 6573 /* File: arm64/op_invoke_virtual_quick.S */ 6574 /* File: arm64/invoke.S */ 6575 /* 6576 * Generic invoke handler wrapper. 6577 */ 6578 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 6579 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 6580 .extern MterpInvokeVirtualQuick 6581 EXPORT_PC 6582 mov x0, xSELF 6583 add x1, xFP, #OFF_FP_SHADOWFRAME 6584 mov x2, xPC 6585 mov x3, xINST 6586 bl MterpInvokeVirtualQuick 6587 cbz w0, MterpException 6588 FETCH_ADVANCE_INST 3 6589 bl MterpShouldSwitchInterpreters 6590 cbnz w0, MterpFallback 6591 GET_INST_OPCODE ip 6592 GOTO_OPCODE ip 6593 6594 6595 6596 /* ------------------------------ */ 6597 .balign 128 6598 .L_op_invoke_virtual_range_quick: /* 0xea */ 6599 /* File: arm64/op_invoke_virtual_range_quick.S */ 6600 /* File: arm64/invoke.S */ 6601 /* 6602 * Generic invoke handler wrapper. 6603 */ 6604 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 6605 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 6606 .extern MterpInvokeVirtualQuickRange 6607 EXPORT_PC 6608 mov x0, xSELF 6609 add x1, xFP, #OFF_FP_SHADOWFRAME 6610 mov x2, xPC 6611 mov x3, xINST 6612 bl MterpInvokeVirtualQuickRange 6613 cbz w0, MterpException 6614 FETCH_ADVANCE_INST 3 6615 bl MterpShouldSwitchInterpreters 6616 cbnz w0, MterpFallback 6617 GET_INST_OPCODE ip 6618 GOTO_OPCODE ip 6619 6620 6621 6622 /* ------------------------------ */ 6623 .balign 128 6624 .L_op_iput_boolean_quick: /* 0xeb */ 6625 /* File: arm64/op_iput_boolean_quick.S */ 6626 /* File: arm64/op_iput_quick.S */ 6627 /* For: iput-quick, iput-object-quick */ 6628 /* op vA, vB, offset//CCCC */ 6629 lsr w2, wINST, #12 // w2<- B 6630 FETCH w1, 1 // w1<- field byte offset 6631 GET_VREG w3, w2 // w3<- fp[B], the object pointer 6632 ubfx w2, wINST, #8, #4 // w2<- A 6633 cmp w3, #0 // check object for null 6634 cbz w3, common_errNullObject // object was null 6635 GET_VREG w0, w2 // w0<- fp[A] 6636 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6637 strb w0, [x3, x1] // obj.field<- w0 6638 GET_INST_OPCODE ip // extract opcode from rINST 6639 GOTO_OPCODE ip // jump to next instruction 6640 6641 6642 /* ------------------------------ */ 6643 .balign 128 6644 .L_op_iput_byte_quick: /* 0xec */ 6645 /* File: arm64/op_iput_byte_quick.S */ 6646 /* File: arm64/op_iput_quick.S */ 6647 /* For: iput-quick, iput-object-quick */ 6648 /* op vA, vB, offset//CCCC */ 6649 lsr w2, wINST, #12 // w2<- B 6650 FETCH w1, 1 // w1<- field byte offset 6651 GET_VREG w3, w2 // w3<- fp[B], the object pointer 6652 ubfx w2, wINST, #8, #4 // w2<- A 6653 cmp w3, #0 // check object for null 6654 cbz w3, common_errNullObject // object was null 6655 GET_VREG w0, w2 // w0<- fp[A] 6656 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6657 strb w0, [x3, x1] // obj.field<- w0 6658 GET_INST_OPCODE ip // extract opcode from rINST 6659 GOTO_OPCODE ip // jump to next instruction 6660 6661 6662 /* ------------------------------ */ 6663 .balign 128 6664 .L_op_iput_char_quick: /* 0xed */ 6665 /* File: arm64/op_iput_char_quick.S */ 6666 /* File: arm64/op_iput_quick.S */ 6667 /* For: iput-quick, iput-object-quick */ 6668 /* op vA, vB, offset//CCCC */ 6669 lsr w2, wINST, #12 // w2<- B 6670 FETCH w1, 1 // w1<- field byte offset 6671 GET_VREG w3, w2 // w3<- fp[B], the object pointer 6672 ubfx w2, wINST, #8, #4 // w2<- A 6673 cmp w3, #0 // check object for null 6674 cbz w3, common_errNullObject // object was null 6675 GET_VREG w0, w2 // w0<- fp[A] 6676 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6677 strh w0, [x3, x1] // obj.field<- w0 6678 GET_INST_OPCODE ip // extract opcode from rINST 6679 GOTO_OPCODE ip // jump to next instruction 6680 6681 6682 /* ------------------------------ */ 6683 .balign 128 6684 .L_op_iput_short_quick: /* 0xee */ 6685 /* File: arm64/op_iput_short_quick.S */ 6686 /* File: arm64/op_iput_quick.S */ 6687 /* For: iput-quick, iput-object-quick */ 6688 /* op vA, vB, offset//CCCC */ 6689 lsr w2, wINST, #12 // w2<- B 6690 FETCH w1, 1 // w1<- field byte offset 6691 GET_VREG w3, w2 // w3<- fp[B], the object pointer 6692 ubfx w2, wINST, #8, #4 // w2<- A 6693 cmp w3, #0 // check object for null 6694 cbz w3, common_errNullObject // object was null 6695 GET_VREG w0, w2 // w0<- fp[A] 6696 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6697 strh w0, [x3, x1] // obj.field<- w0 6698 GET_INST_OPCODE ip // extract opcode from rINST 6699 GOTO_OPCODE ip // jump to next instruction 6700 6701 6702 /* ------------------------------ */ 6703 .balign 128 6704 .L_op_iget_boolean_quick: /* 0xef */ 6705 /* File: arm64/op_iget_boolean_quick.S */ 6706 /* File: arm64/op_iget_quick.S */ 6707 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */ 6708 /* op vA, vB, offset//CCCC */ 6709 lsr w2, wINST, #12 // w2<- B 6710 FETCH w1, 1 // w1<- field byte offset 6711 GET_VREG w3, w2 // w3<- object we're operating on 6712 ubfx w2, wINST, #8, #4 // w2<- A 6713 cmp x3, #0 // check object for null 6714 beq common_errNullObject // object was null 6715 ldrb w0, [x3, x1] // w0<- obj.field 6716 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6717 6718 SET_VREG w0, w2 // fp[A]<- w0 6719 GET_INST_OPCODE ip // extract opcode from rINST 6720 GOTO_OPCODE ip // jump to next instruction 6721 6722 6723 /* ------------------------------ */ 6724 .balign 128 6725 .L_op_iget_byte_quick: /* 0xf0 */ 6726 /* File: arm64/op_iget_byte_quick.S */ 6727 /* File: arm64/op_iget_quick.S */ 6728 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */ 6729 /* op vA, vB, offset//CCCC */ 6730 lsr w2, wINST, #12 // w2<- B 6731 FETCH w1, 1 // w1<- field byte offset 6732 GET_VREG w3, w2 // w3<- object we're operating on 6733 ubfx w2, wINST, #8, #4 // w2<- A 6734 cmp x3, #0 // check object for null 6735 beq common_errNullObject // object was null 6736 ldrsb w0, [x3, x1] // w0<- obj.field 6737 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6738 6739 SET_VREG w0, w2 // fp[A]<- w0 6740 GET_INST_OPCODE ip // extract opcode from rINST 6741 GOTO_OPCODE ip // jump to next instruction 6742 6743 6744 /* ------------------------------ */ 6745 .balign 128 6746 .L_op_iget_char_quick: /* 0xf1 */ 6747 /* File: arm64/op_iget_char_quick.S */ 6748 /* File: arm64/op_iget_quick.S */ 6749 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */ 6750 /* op vA, vB, offset//CCCC */ 6751 lsr w2, wINST, #12 // w2<- B 6752 FETCH w1, 1 // w1<- field byte offset 6753 GET_VREG w3, w2 // w3<- object we're operating on 6754 ubfx w2, wINST, #8, #4 // w2<- A 6755 cmp x3, #0 // check object for null 6756 beq common_errNullObject // object was null 6757 ldrh w0, [x3, x1] // w0<- obj.field 6758 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6759 6760 SET_VREG w0, w2 // fp[A]<- w0 6761 GET_INST_OPCODE ip // extract opcode from rINST 6762 GOTO_OPCODE ip // jump to next instruction 6763 6764 6765 /* ------------------------------ */ 6766 .balign 128 6767 .L_op_iget_short_quick: /* 0xf2 */ 6768 /* File: arm64/op_iget_short_quick.S */ 6769 /* File: arm64/op_iget_quick.S */ 6770 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */ 6771 /* op vA, vB, offset//CCCC */ 6772 lsr w2, wINST, #12 // w2<- B 6773 FETCH w1, 1 // w1<- field byte offset 6774 GET_VREG w3, w2 // w3<- object we're operating on 6775 ubfx w2, wINST, #8, #4 // w2<- A 6776 cmp x3, #0 // check object for null 6777 beq common_errNullObject // object was null 6778 ldrsh w0, [x3, x1] // w0<- obj.field 6779 FETCH_ADVANCE_INST 2 // advance rPC, load rINST 6780 6781 SET_VREG w0, w2 // fp[A]<- w0 6782 GET_INST_OPCODE ip // extract opcode from rINST 6783 GOTO_OPCODE ip // jump to next instruction 6784 6785 6786 /* ------------------------------ */ 6787 .balign 128 6788 .L_op_invoke_lambda: /* 0xf3 */ 6789 /* Transfer stub to alternate interpreter */ 6790 b MterpFallback 6791 6792 6793 /* ------------------------------ */ 6794 .balign 128 6795 .L_op_unused_f4: /* 0xf4 */ 6796 /* File: arm64/op_unused_f4.S */ 6797 /* File: arm64/unused.S */ 6798 /* 6799 * Bail to reference interpreter to throw. 6800 */ 6801 b MterpFallback 6802 6803 6804 /* ------------------------------ */ 6805 .balign 128 6806 .L_op_capture_variable: /* 0xf5 */ 6807 /* Transfer stub to alternate interpreter */ 6808 b MterpFallback 6809 6810 6811 /* ------------------------------ */ 6812 .balign 128 6813 .L_op_create_lambda: /* 0xf6 */ 6814 /* Transfer stub to alternate interpreter */ 6815 b MterpFallback 6816 6817 6818 /* ------------------------------ */ 6819 .balign 128 6820 .L_op_liberate_variable: /* 0xf7 */ 6821 /* Transfer stub to alternate interpreter */ 6822 b MterpFallback 6823 6824 6825 /* ------------------------------ */ 6826 .balign 128 6827 .L_op_box_lambda: /* 0xf8 */ 6828 /* Transfer stub to alternate interpreter */ 6829 b MterpFallback 6830 6831 6832 /* ------------------------------ */ 6833 .balign 128 6834 .L_op_unbox_lambda: /* 0xf9 */ 6835 /* Transfer stub to alternate interpreter */ 6836 b MterpFallback 6837 6838 6839 /* ------------------------------ */ 6840 .balign 128 6841 .L_op_unused_fa: /* 0xfa */ 6842 /* File: arm64/op_unused_fa.S */ 6843 /* File: arm64/unused.S */ 6844 /* 6845 * Bail to reference interpreter to throw. 6846 */ 6847 b MterpFallback 6848 6849 6850 /* ------------------------------ */ 6851 .balign 128 6852 .L_op_unused_fb: /* 0xfb */ 6853 /* File: arm64/op_unused_fb.S */ 6854 /* File: arm64/unused.S */ 6855 /* 6856 * Bail to reference interpreter to throw. 6857 */ 6858 b MterpFallback 6859 6860 6861 /* ------------------------------ */ 6862 .balign 128 6863 .L_op_unused_fc: /* 0xfc */ 6864 /* File: arm64/op_unused_fc.S */ 6865 /* File: arm64/unused.S */ 6866 /* 6867 * Bail to reference interpreter to throw. 6868 */ 6869 b MterpFallback 6870 6871 6872 /* ------------------------------ */ 6873 .balign 128 6874 .L_op_unused_fd: /* 0xfd */ 6875 /* File: arm64/op_unused_fd.S */ 6876 /* File: arm64/unused.S */ 6877 /* 6878 * Bail to reference interpreter to throw. 6879 */ 6880 b MterpFallback 6881 6882 6883 /* ------------------------------ */ 6884 .balign 128 6885 .L_op_unused_fe: /* 0xfe */ 6886 /* File: arm64/op_unused_fe.S */ 6887 /* File: arm64/unused.S */ 6888 /* 6889 * Bail to reference interpreter to throw. 6890 */ 6891 b MterpFallback 6892 6893 6894 /* ------------------------------ */ 6895 .balign 128 6896 .L_op_unused_ff: /* 0xff */ 6897 /* File: arm64/op_unused_ff.S */ 6898 /* File: arm64/unused.S */ 6899 /* 6900 * Bail to reference interpreter to throw. 6901 */ 6902 b MterpFallback 6903 6904 6905 .balign 128 6906 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart 6907 .global artMterpAsmInstructionEnd 6908 artMterpAsmInstructionEnd: 6909 6910 /* 6911 * =========================================================================== 6912 * Sister implementations 6913 * =========================================================================== 6914 */ 6915 .global artMterpAsmSisterStart 6916 .type artMterpAsmSisterStart, %function 6917 .text 6918 .balign 4 6919 artMterpAsmSisterStart: 6920 6921 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart 6922 .global artMterpAsmSisterEnd 6923 artMterpAsmSisterEnd: 6924 6925 6926 .global artMterpAsmAltInstructionStart 6927 .type artMterpAsmAltInstructionStart, %function 6928 .text 6929 6930 artMterpAsmAltInstructionStart = .L_ALT_op_nop 6931 /* ------------------------------ */ 6932 .balign 128 6933 .L_ALT_op_nop: /* 0x00 */ 6934 /* File: arm64/alt_stub.S */ 6935 /* 6936 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6937 * any interesting requests and then jump to the real instruction 6938 * handler. Note that the call to MterpCheckBefore is done as a tail call. 6939 */ 6940 .extern MterpCheckBefore 6941 EXPORT_PC 6942 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 6943 adr lr, artMterpAsmInstructionStart + (0 * 128) // Addr of primary handler. 6944 mov x0, xSELF 6945 add x1, xFP, #OFF_FP_SHADOWFRAME 6946 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 6947 6948 /* ------------------------------ */ 6949 .balign 128 6950 .L_ALT_op_move: /* 0x01 */ 6951 /* File: arm64/alt_stub.S */ 6952 /* 6953 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6954 * any interesting requests and then jump to the real instruction 6955 * handler. Note that the call to MterpCheckBefore is done as a tail call. 6956 */ 6957 .extern MterpCheckBefore 6958 EXPORT_PC 6959 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 6960 adr lr, artMterpAsmInstructionStart + (1 * 128) // Addr of primary handler. 6961 mov x0, xSELF 6962 add x1, xFP, #OFF_FP_SHADOWFRAME 6963 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 6964 6965 /* ------------------------------ */ 6966 .balign 128 6967 .L_ALT_op_move_from16: /* 0x02 */ 6968 /* File: arm64/alt_stub.S */ 6969 /* 6970 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6971 * any interesting requests and then jump to the real instruction 6972 * handler. Note that the call to MterpCheckBefore is done as a tail call. 6973 */ 6974 .extern MterpCheckBefore 6975 EXPORT_PC 6976 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 6977 adr lr, artMterpAsmInstructionStart + (2 * 128) // Addr of primary handler. 6978 mov x0, xSELF 6979 add x1, xFP, #OFF_FP_SHADOWFRAME 6980 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 6981 6982 /* ------------------------------ */ 6983 .balign 128 6984 .L_ALT_op_move_16: /* 0x03 */ 6985 /* File: arm64/alt_stub.S */ 6986 /* 6987 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6988 * any interesting requests and then jump to the real instruction 6989 * handler. Note that the call to MterpCheckBefore is done as a tail call. 6990 */ 6991 .extern MterpCheckBefore 6992 EXPORT_PC 6993 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 6994 adr lr, artMterpAsmInstructionStart + (3 * 128) // Addr of primary handler. 6995 mov x0, xSELF 6996 add x1, xFP, #OFF_FP_SHADOWFRAME 6997 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 6998 6999 /* ------------------------------ */ 7000 .balign 128 7001 .L_ALT_op_move_wide: /* 0x04 */ 7002 /* File: arm64/alt_stub.S */ 7003 /* 7004 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7005 * any interesting requests and then jump to the real instruction 7006 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7007 */ 7008 .extern MterpCheckBefore 7009 EXPORT_PC 7010 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7011 adr lr, artMterpAsmInstructionStart + (4 * 128) // Addr of primary handler. 7012 mov x0, xSELF 7013 add x1, xFP, #OFF_FP_SHADOWFRAME 7014 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7015 7016 /* ------------------------------ */ 7017 .balign 128 7018 .L_ALT_op_move_wide_from16: /* 0x05 */ 7019 /* File: arm64/alt_stub.S */ 7020 /* 7021 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7022 * any interesting requests and then jump to the real instruction 7023 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7024 */ 7025 .extern MterpCheckBefore 7026 EXPORT_PC 7027 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7028 adr lr, artMterpAsmInstructionStart + (5 * 128) // Addr of primary handler. 7029 mov x0, xSELF 7030 add x1, xFP, #OFF_FP_SHADOWFRAME 7031 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7032 7033 /* ------------------------------ */ 7034 .balign 128 7035 .L_ALT_op_move_wide_16: /* 0x06 */ 7036 /* File: arm64/alt_stub.S */ 7037 /* 7038 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7039 * any interesting requests and then jump to the real instruction 7040 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7041 */ 7042 .extern MterpCheckBefore 7043 EXPORT_PC 7044 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7045 adr lr, artMterpAsmInstructionStart + (6 * 128) // Addr of primary handler. 7046 mov x0, xSELF 7047 add x1, xFP, #OFF_FP_SHADOWFRAME 7048 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7049 7050 /* ------------------------------ */ 7051 .balign 128 7052 .L_ALT_op_move_object: /* 0x07 */ 7053 /* File: arm64/alt_stub.S */ 7054 /* 7055 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7056 * any interesting requests and then jump to the real instruction 7057 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7058 */ 7059 .extern MterpCheckBefore 7060 EXPORT_PC 7061 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7062 adr lr, artMterpAsmInstructionStart + (7 * 128) // Addr of primary handler. 7063 mov x0, xSELF 7064 add x1, xFP, #OFF_FP_SHADOWFRAME 7065 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7066 7067 /* ------------------------------ */ 7068 .balign 128 7069 .L_ALT_op_move_object_from16: /* 0x08 */ 7070 /* File: arm64/alt_stub.S */ 7071 /* 7072 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7073 * any interesting requests and then jump to the real instruction 7074 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7075 */ 7076 .extern MterpCheckBefore 7077 EXPORT_PC 7078 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7079 adr lr, artMterpAsmInstructionStart + (8 * 128) // Addr of primary handler. 7080 mov x0, xSELF 7081 add x1, xFP, #OFF_FP_SHADOWFRAME 7082 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7083 7084 /* ------------------------------ */ 7085 .balign 128 7086 .L_ALT_op_move_object_16: /* 0x09 */ 7087 /* File: arm64/alt_stub.S */ 7088 /* 7089 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7090 * any interesting requests and then jump to the real instruction 7091 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7092 */ 7093 .extern MterpCheckBefore 7094 EXPORT_PC 7095 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7096 adr lr, artMterpAsmInstructionStart + (9 * 128) // Addr of primary handler. 7097 mov x0, xSELF 7098 add x1, xFP, #OFF_FP_SHADOWFRAME 7099 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7100 7101 /* ------------------------------ */ 7102 .balign 128 7103 .L_ALT_op_move_result: /* 0x0a */ 7104 /* File: arm64/alt_stub.S */ 7105 /* 7106 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7107 * any interesting requests and then jump to the real instruction 7108 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7109 */ 7110 .extern MterpCheckBefore 7111 EXPORT_PC 7112 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7113 adr lr, artMterpAsmInstructionStart + (10 * 128) // Addr of primary handler. 7114 mov x0, xSELF 7115 add x1, xFP, #OFF_FP_SHADOWFRAME 7116 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7117 7118 /* ------------------------------ */ 7119 .balign 128 7120 .L_ALT_op_move_result_wide: /* 0x0b */ 7121 /* File: arm64/alt_stub.S */ 7122 /* 7123 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7124 * any interesting requests and then jump to the real instruction 7125 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7126 */ 7127 .extern MterpCheckBefore 7128 EXPORT_PC 7129 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7130 adr lr, artMterpAsmInstructionStart + (11 * 128) // Addr of primary handler. 7131 mov x0, xSELF 7132 add x1, xFP, #OFF_FP_SHADOWFRAME 7133 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7134 7135 /* ------------------------------ */ 7136 .balign 128 7137 .L_ALT_op_move_result_object: /* 0x0c */ 7138 /* File: arm64/alt_stub.S */ 7139 /* 7140 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7141 * any interesting requests and then jump to the real instruction 7142 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7143 */ 7144 .extern MterpCheckBefore 7145 EXPORT_PC 7146 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7147 adr lr, artMterpAsmInstructionStart + (12 * 128) // Addr of primary handler. 7148 mov x0, xSELF 7149 add x1, xFP, #OFF_FP_SHADOWFRAME 7150 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7151 7152 /* ------------------------------ */ 7153 .balign 128 7154 .L_ALT_op_move_exception: /* 0x0d */ 7155 /* File: arm64/alt_stub.S */ 7156 /* 7157 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7158 * any interesting requests and then jump to the real instruction 7159 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7160 */ 7161 .extern MterpCheckBefore 7162 EXPORT_PC 7163 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7164 adr lr, artMterpAsmInstructionStart + (13 * 128) // Addr of primary handler. 7165 mov x0, xSELF 7166 add x1, xFP, #OFF_FP_SHADOWFRAME 7167 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7168 7169 /* ------------------------------ */ 7170 .balign 128 7171 .L_ALT_op_return_void: /* 0x0e */ 7172 /* File: arm64/alt_stub.S */ 7173 /* 7174 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7175 * any interesting requests and then jump to the real instruction 7176 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7177 */ 7178 .extern MterpCheckBefore 7179 EXPORT_PC 7180 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7181 adr lr, artMterpAsmInstructionStart + (14 * 128) // Addr of primary handler. 7182 mov x0, xSELF 7183 add x1, xFP, #OFF_FP_SHADOWFRAME 7184 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7185 7186 /* ------------------------------ */ 7187 .balign 128 7188 .L_ALT_op_return: /* 0x0f */ 7189 /* File: arm64/alt_stub.S */ 7190 /* 7191 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7192 * any interesting requests and then jump to the real instruction 7193 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7194 */ 7195 .extern MterpCheckBefore 7196 EXPORT_PC 7197 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7198 adr lr, artMterpAsmInstructionStart + (15 * 128) // Addr of primary handler. 7199 mov x0, xSELF 7200 add x1, xFP, #OFF_FP_SHADOWFRAME 7201 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7202 7203 /* ------------------------------ */ 7204 .balign 128 7205 .L_ALT_op_return_wide: /* 0x10 */ 7206 /* File: arm64/alt_stub.S */ 7207 /* 7208 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7209 * any interesting requests and then jump to the real instruction 7210 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7211 */ 7212 .extern MterpCheckBefore 7213 EXPORT_PC 7214 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7215 adr lr, artMterpAsmInstructionStart + (16 * 128) // Addr of primary handler. 7216 mov x0, xSELF 7217 add x1, xFP, #OFF_FP_SHADOWFRAME 7218 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7219 7220 /* ------------------------------ */ 7221 .balign 128 7222 .L_ALT_op_return_object: /* 0x11 */ 7223 /* File: arm64/alt_stub.S */ 7224 /* 7225 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7226 * any interesting requests and then jump to the real instruction 7227 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7228 */ 7229 .extern MterpCheckBefore 7230 EXPORT_PC 7231 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7232 adr lr, artMterpAsmInstructionStart + (17 * 128) // Addr of primary handler. 7233 mov x0, xSELF 7234 add x1, xFP, #OFF_FP_SHADOWFRAME 7235 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7236 7237 /* ------------------------------ */ 7238 .balign 128 7239 .L_ALT_op_const_4: /* 0x12 */ 7240 /* File: arm64/alt_stub.S */ 7241 /* 7242 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7243 * any interesting requests and then jump to the real instruction 7244 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7245 */ 7246 .extern MterpCheckBefore 7247 EXPORT_PC 7248 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7249 adr lr, artMterpAsmInstructionStart + (18 * 128) // Addr of primary handler. 7250 mov x0, xSELF 7251 add x1, xFP, #OFF_FP_SHADOWFRAME 7252 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7253 7254 /* ------------------------------ */ 7255 .balign 128 7256 .L_ALT_op_const_16: /* 0x13 */ 7257 /* File: arm64/alt_stub.S */ 7258 /* 7259 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7260 * any interesting requests and then jump to the real instruction 7261 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7262 */ 7263 .extern MterpCheckBefore 7264 EXPORT_PC 7265 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7266 adr lr, artMterpAsmInstructionStart + (19 * 128) // Addr of primary handler. 7267 mov x0, xSELF 7268 add x1, xFP, #OFF_FP_SHADOWFRAME 7269 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7270 7271 /* ------------------------------ */ 7272 .balign 128 7273 .L_ALT_op_const: /* 0x14 */ 7274 /* File: arm64/alt_stub.S */ 7275 /* 7276 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7277 * any interesting requests and then jump to the real instruction 7278 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7279 */ 7280 .extern MterpCheckBefore 7281 EXPORT_PC 7282 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7283 adr lr, artMterpAsmInstructionStart + (20 * 128) // Addr of primary handler. 7284 mov x0, xSELF 7285 add x1, xFP, #OFF_FP_SHADOWFRAME 7286 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7287 7288 /* ------------------------------ */ 7289 .balign 128 7290 .L_ALT_op_const_high16: /* 0x15 */ 7291 /* File: arm64/alt_stub.S */ 7292 /* 7293 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7294 * any interesting requests and then jump to the real instruction 7295 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7296 */ 7297 .extern MterpCheckBefore 7298 EXPORT_PC 7299 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7300 adr lr, artMterpAsmInstructionStart + (21 * 128) // Addr of primary handler. 7301 mov x0, xSELF 7302 add x1, xFP, #OFF_FP_SHADOWFRAME 7303 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7304 7305 /* ------------------------------ */ 7306 .balign 128 7307 .L_ALT_op_const_wide_16: /* 0x16 */ 7308 /* File: arm64/alt_stub.S */ 7309 /* 7310 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7311 * any interesting requests and then jump to the real instruction 7312 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7313 */ 7314 .extern MterpCheckBefore 7315 EXPORT_PC 7316 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7317 adr lr, artMterpAsmInstructionStart + (22 * 128) // Addr of primary handler. 7318 mov x0, xSELF 7319 add x1, xFP, #OFF_FP_SHADOWFRAME 7320 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7321 7322 /* ------------------------------ */ 7323 .balign 128 7324 .L_ALT_op_const_wide_32: /* 0x17 */ 7325 /* File: arm64/alt_stub.S */ 7326 /* 7327 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7328 * any interesting requests and then jump to the real instruction 7329 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7330 */ 7331 .extern MterpCheckBefore 7332 EXPORT_PC 7333 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7334 adr lr, artMterpAsmInstructionStart + (23 * 128) // Addr of primary handler. 7335 mov x0, xSELF 7336 add x1, xFP, #OFF_FP_SHADOWFRAME 7337 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7338 7339 /* ------------------------------ */ 7340 .balign 128 7341 .L_ALT_op_const_wide: /* 0x18 */ 7342 /* File: arm64/alt_stub.S */ 7343 /* 7344 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7345 * any interesting requests and then jump to the real instruction 7346 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7347 */ 7348 .extern MterpCheckBefore 7349 EXPORT_PC 7350 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7351 adr lr, artMterpAsmInstructionStart + (24 * 128) // Addr of primary handler. 7352 mov x0, xSELF 7353 add x1, xFP, #OFF_FP_SHADOWFRAME 7354 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7355 7356 /* ------------------------------ */ 7357 .balign 128 7358 .L_ALT_op_const_wide_high16: /* 0x19 */ 7359 /* File: arm64/alt_stub.S */ 7360 /* 7361 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7362 * any interesting requests and then jump to the real instruction 7363 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7364 */ 7365 .extern MterpCheckBefore 7366 EXPORT_PC 7367 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7368 adr lr, artMterpAsmInstructionStart + (25 * 128) // Addr of primary handler. 7369 mov x0, xSELF 7370 add x1, xFP, #OFF_FP_SHADOWFRAME 7371 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7372 7373 /* ------------------------------ */ 7374 .balign 128 7375 .L_ALT_op_const_string: /* 0x1a */ 7376 /* File: arm64/alt_stub.S */ 7377 /* 7378 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7379 * any interesting requests and then jump to the real instruction 7380 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7381 */ 7382 .extern MterpCheckBefore 7383 EXPORT_PC 7384 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7385 adr lr, artMterpAsmInstructionStart + (26 * 128) // Addr of primary handler. 7386 mov x0, xSELF 7387 add x1, xFP, #OFF_FP_SHADOWFRAME 7388 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7389 7390 /* ------------------------------ */ 7391 .balign 128 7392 .L_ALT_op_const_string_jumbo: /* 0x1b */ 7393 /* File: arm64/alt_stub.S */ 7394 /* 7395 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7396 * any interesting requests and then jump to the real instruction 7397 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7398 */ 7399 .extern MterpCheckBefore 7400 EXPORT_PC 7401 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7402 adr lr, artMterpAsmInstructionStart + (27 * 128) // Addr of primary handler. 7403 mov x0, xSELF 7404 add x1, xFP, #OFF_FP_SHADOWFRAME 7405 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7406 7407 /* ------------------------------ */ 7408 .balign 128 7409 .L_ALT_op_const_class: /* 0x1c */ 7410 /* File: arm64/alt_stub.S */ 7411 /* 7412 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7413 * any interesting requests and then jump to the real instruction 7414 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7415 */ 7416 .extern MterpCheckBefore 7417 EXPORT_PC 7418 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7419 adr lr, artMterpAsmInstructionStart + (28 * 128) // Addr of primary handler. 7420 mov x0, xSELF 7421 add x1, xFP, #OFF_FP_SHADOWFRAME 7422 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7423 7424 /* ------------------------------ */ 7425 .balign 128 7426 .L_ALT_op_monitor_enter: /* 0x1d */ 7427 /* File: arm64/alt_stub.S */ 7428 /* 7429 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7430 * any interesting requests and then jump to the real instruction 7431 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7432 */ 7433 .extern MterpCheckBefore 7434 EXPORT_PC 7435 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7436 adr lr, artMterpAsmInstructionStart + (29 * 128) // Addr of primary handler. 7437 mov x0, xSELF 7438 add x1, xFP, #OFF_FP_SHADOWFRAME 7439 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7440 7441 /* ------------------------------ */ 7442 .balign 128 7443 .L_ALT_op_monitor_exit: /* 0x1e */ 7444 /* File: arm64/alt_stub.S */ 7445 /* 7446 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7447 * any interesting requests and then jump to the real instruction 7448 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7449 */ 7450 .extern MterpCheckBefore 7451 EXPORT_PC 7452 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7453 adr lr, artMterpAsmInstructionStart + (30 * 128) // Addr of primary handler. 7454 mov x0, xSELF 7455 add x1, xFP, #OFF_FP_SHADOWFRAME 7456 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7457 7458 /* ------------------------------ */ 7459 .balign 128 7460 .L_ALT_op_check_cast: /* 0x1f */ 7461 /* File: arm64/alt_stub.S */ 7462 /* 7463 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7464 * any interesting requests and then jump to the real instruction 7465 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7466 */ 7467 .extern MterpCheckBefore 7468 EXPORT_PC 7469 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7470 adr lr, artMterpAsmInstructionStart + (31 * 128) // Addr of primary handler. 7471 mov x0, xSELF 7472 add x1, xFP, #OFF_FP_SHADOWFRAME 7473 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7474 7475 /* ------------------------------ */ 7476 .balign 128 7477 .L_ALT_op_instance_of: /* 0x20 */ 7478 /* File: arm64/alt_stub.S */ 7479 /* 7480 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7481 * any interesting requests and then jump to the real instruction 7482 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7483 */ 7484 .extern MterpCheckBefore 7485 EXPORT_PC 7486 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7487 adr lr, artMterpAsmInstructionStart + (32 * 128) // Addr of primary handler. 7488 mov x0, xSELF 7489 add x1, xFP, #OFF_FP_SHADOWFRAME 7490 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7491 7492 /* ------------------------------ */ 7493 .balign 128 7494 .L_ALT_op_array_length: /* 0x21 */ 7495 /* File: arm64/alt_stub.S */ 7496 /* 7497 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7498 * any interesting requests and then jump to the real instruction 7499 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7500 */ 7501 .extern MterpCheckBefore 7502 EXPORT_PC 7503 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7504 adr lr, artMterpAsmInstructionStart + (33 * 128) // Addr of primary handler. 7505 mov x0, xSELF 7506 add x1, xFP, #OFF_FP_SHADOWFRAME 7507 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7508 7509 /* ------------------------------ */ 7510 .balign 128 7511 .L_ALT_op_new_instance: /* 0x22 */ 7512 /* File: arm64/alt_stub.S */ 7513 /* 7514 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7515 * any interesting requests and then jump to the real instruction 7516 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7517 */ 7518 .extern MterpCheckBefore 7519 EXPORT_PC 7520 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7521 adr lr, artMterpAsmInstructionStart + (34 * 128) // Addr of primary handler. 7522 mov x0, xSELF 7523 add x1, xFP, #OFF_FP_SHADOWFRAME 7524 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7525 7526 /* ------------------------------ */ 7527 .balign 128 7528 .L_ALT_op_new_array: /* 0x23 */ 7529 /* File: arm64/alt_stub.S */ 7530 /* 7531 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7532 * any interesting requests and then jump to the real instruction 7533 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7534 */ 7535 .extern MterpCheckBefore 7536 EXPORT_PC 7537 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7538 adr lr, artMterpAsmInstructionStart + (35 * 128) // Addr of primary handler. 7539 mov x0, xSELF 7540 add x1, xFP, #OFF_FP_SHADOWFRAME 7541 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7542 7543 /* ------------------------------ */ 7544 .balign 128 7545 .L_ALT_op_filled_new_array: /* 0x24 */ 7546 /* File: arm64/alt_stub.S */ 7547 /* 7548 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7549 * any interesting requests and then jump to the real instruction 7550 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7551 */ 7552 .extern MterpCheckBefore 7553 EXPORT_PC 7554 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7555 adr lr, artMterpAsmInstructionStart + (36 * 128) // Addr of primary handler. 7556 mov x0, xSELF 7557 add x1, xFP, #OFF_FP_SHADOWFRAME 7558 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7559 7560 /* ------------------------------ */ 7561 .balign 128 7562 .L_ALT_op_filled_new_array_range: /* 0x25 */ 7563 /* File: arm64/alt_stub.S */ 7564 /* 7565 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7566 * any interesting requests and then jump to the real instruction 7567 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7568 */ 7569 .extern MterpCheckBefore 7570 EXPORT_PC 7571 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7572 adr lr, artMterpAsmInstructionStart + (37 * 128) // Addr of primary handler. 7573 mov x0, xSELF 7574 add x1, xFP, #OFF_FP_SHADOWFRAME 7575 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7576 7577 /* ------------------------------ */ 7578 .balign 128 7579 .L_ALT_op_fill_array_data: /* 0x26 */ 7580 /* File: arm64/alt_stub.S */ 7581 /* 7582 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7583 * any interesting requests and then jump to the real instruction 7584 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7585 */ 7586 .extern MterpCheckBefore 7587 EXPORT_PC 7588 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7589 adr lr, artMterpAsmInstructionStart + (38 * 128) // Addr of primary handler. 7590 mov x0, xSELF 7591 add x1, xFP, #OFF_FP_SHADOWFRAME 7592 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7593 7594 /* ------------------------------ */ 7595 .balign 128 7596 .L_ALT_op_throw: /* 0x27 */ 7597 /* File: arm64/alt_stub.S */ 7598 /* 7599 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7600 * any interesting requests and then jump to the real instruction 7601 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7602 */ 7603 .extern MterpCheckBefore 7604 EXPORT_PC 7605 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7606 adr lr, artMterpAsmInstructionStart + (39 * 128) // Addr of primary handler. 7607 mov x0, xSELF 7608 add x1, xFP, #OFF_FP_SHADOWFRAME 7609 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7610 7611 /* ------------------------------ */ 7612 .balign 128 7613 .L_ALT_op_goto: /* 0x28 */ 7614 /* File: arm64/alt_stub.S */ 7615 /* 7616 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7617 * any interesting requests and then jump to the real instruction 7618 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7619 */ 7620 .extern MterpCheckBefore 7621 EXPORT_PC 7622 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7623 adr lr, artMterpAsmInstructionStart + (40 * 128) // Addr of primary handler. 7624 mov x0, xSELF 7625 add x1, xFP, #OFF_FP_SHADOWFRAME 7626 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7627 7628 /* ------------------------------ */ 7629 .balign 128 7630 .L_ALT_op_goto_16: /* 0x29 */ 7631 /* File: arm64/alt_stub.S */ 7632 /* 7633 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7634 * any interesting requests and then jump to the real instruction 7635 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7636 */ 7637 .extern MterpCheckBefore 7638 EXPORT_PC 7639 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7640 adr lr, artMterpAsmInstructionStart + (41 * 128) // Addr of primary handler. 7641 mov x0, xSELF 7642 add x1, xFP, #OFF_FP_SHADOWFRAME 7643 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7644 7645 /* ------------------------------ */ 7646 .balign 128 7647 .L_ALT_op_goto_32: /* 0x2a */ 7648 /* File: arm64/alt_stub.S */ 7649 /* 7650 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7651 * any interesting requests and then jump to the real instruction 7652 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7653 */ 7654 .extern MterpCheckBefore 7655 EXPORT_PC 7656 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7657 adr lr, artMterpAsmInstructionStart + (42 * 128) // Addr of primary handler. 7658 mov x0, xSELF 7659 add x1, xFP, #OFF_FP_SHADOWFRAME 7660 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7661 7662 /* ------------------------------ */ 7663 .balign 128 7664 .L_ALT_op_packed_switch: /* 0x2b */ 7665 /* File: arm64/alt_stub.S */ 7666 /* 7667 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7668 * any interesting requests and then jump to the real instruction 7669 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7670 */ 7671 .extern MterpCheckBefore 7672 EXPORT_PC 7673 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7674 adr lr, artMterpAsmInstructionStart + (43 * 128) // Addr of primary handler. 7675 mov x0, xSELF 7676 add x1, xFP, #OFF_FP_SHADOWFRAME 7677 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7678 7679 /* ------------------------------ */ 7680 .balign 128 7681 .L_ALT_op_sparse_switch: /* 0x2c */ 7682 /* File: arm64/alt_stub.S */ 7683 /* 7684 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7685 * any interesting requests and then jump to the real instruction 7686 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7687 */ 7688 .extern MterpCheckBefore 7689 EXPORT_PC 7690 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7691 adr lr, artMterpAsmInstructionStart + (44 * 128) // Addr of primary handler. 7692 mov x0, xSELF 7693 add x1, xFP, #OFF_FP_SHADOWFRAME 7694 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7695 7696 /* ------------------------------ */ 7697 .balign 128 7698 .L_ALT_op_cmpl_float: /* 0x2d */ 7699 /* File: arm64/alt_stub.S */ 7700 /* 7701 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7702 * any interesting requests and then jump to the real instruction 7703 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7704 */ 7705 .extern MterpCheckBefore 7706 EXPORT_PC 7707 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7708 adr lr, artMterpAsmInstructionStart + (45 * 128) // Addr of primary handler. 7709 mov x0, xSELF 7710 add x1, xFP, #OFF_FP_SHADOWFRAME 7711 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7712 7713 /* ------------------------------ */ 7714 .balign 128 7715 .L_ALT_op_cmpg_float: /* 0x2e */ 7716 /* File: arm64/alt_stub.S */ 7717 /* 7718 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7719 * any interesting requests and then jump to the real instruction 7720 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7721 */ 7722 .extern MterpCheckBefore 7723 EXPORT_PC 7724 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7725 adr lr, artMterpAsmInstructionStart + (46 * 128) // Addr of primary handler. 7726 mov x0, xSELF 7727 add x1, xFP, #OFF_FP_SHADOWFRAME 7728 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7729 7730 /* ------------------------------ */ 7731 .balign 128 7732 .L_ALT_op_cmpl_double: /* 0x2f */ 7733 /* File: arm64/alt_stub.S */ 7734 /* 7735 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7736 * any interesting requests and then jump to the real instruction 7737 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7738 */ 7739 .extern MterpCheckBefore 7740 EXPORT_PC 7741 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7742 adr lr, artMterpAsmInstructionStart + (47 * 128) // Addr of primary handler. 7743 mov x0, xSELF 7744 add x1, xFP, #OFF_FP_SHADOWFRAME 7745 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7746 7747 /* ------------------------------ */ 7748 .balign 128 7749 .L_ALT_op_cmpg_double: /* 0x30 */ 7750 /* File: arm64/alt_stub.S */ 7751 /* 7752 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7753 * any interesting requests and then jump to the real instruction 7754 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7755 */ 7756 .extern MterpCheckBefore 7757 EXPORT_PC 7758 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7759 adr lr, artMterpAsmInstructionStart + (48 * 128) // Addr of primary handler. 7760 mov x0, xSELF 7761 add x1, xFP, #OFF_FP_SHADOWFRAME 7762 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7763 7764 /* ------------------------------ */ 7765 .balign 128 7766 .L_ALT_op_cmp_long: /* 0x31 */ 7767 /* File: arm64/alt_stub.S */ 7768 /* 7769 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7770 * any interesting requests and then jump to the real instruction 7771 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7772 */ 7773 .extern MterpCheckBefore 7774 EXPORT_PC 7775 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7776 adr lr, artMterpAsmInstructionStart + (49 * 128) // Addr of primary handler. 7777 mov x0, xSELF 7778 add x1, xFP, #OFF_FP_SHADOWFRAME 7779 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7780 7781 /* ------------------------------ */ 7782 .balign 128 7783 .L_ALT_op_if_eq: /* 0x32 */ 7784 /* File: arm64/alt_stub.S */ 7785 /* 7786 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7787 * any interesting requests and then jump to the real instruction 7788 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7789 */ 7790 .extern MterpCheckBefore 7791 EXPORT_PC 7792 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7793 adr lr, artMterpAsmInstructionStart + (50 * 128) // Addr of primary handler. 7794 mov x0, xSELF 7795 add x1, xFP, #OFF_FP_SHADOWFRAME 7796 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7797 7798 /* ------------------------------ */ 7799 .balign 128 7800 .L_ALT_op_if_ne: /* 0x33 */ 7801 /* File: arm64/alt_stub.S */ 7802 /* 7803 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7804 * any interesting requests and then jump to the real instruction 7805 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7806 */ 7807 .extern MterpCheckBefore 7808 EXPORT_PC 7809 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7810 adr lr, artMterpAsmInstructionStart + (51 * 128) // Addr of primary handler. 7811 mov x0, xSELF 7812 add x1, xFP, #OFF_FP_SHADOWFRAME 7813 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7814 7815 /* ------------------------------ */ 7816 .balign 128 7817 .L_ALT_op_if_lt: /* 0x34 */ 7818 /* File: arm64/alt_stub.S */ 7819 /* 7820 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7821 * any interesting requests and then jump to the real instruction 7822 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7823 */ 7824 .extern MterpCheckBefore 7825 EXPORT_PC 7826 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7827 adr lr, artMterpAsmInstructionStart + (52 * 128) // Addr of primary handler. 7828 mov x0, xSELF 7829 add x1, xFP, #OFF_FP_SHADOWFRAME 7830 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7831 7832 /* ------------------------------ */ 7833 .balign 128 7834 .L_ALT_op_if_ge: /* 0x35 */ 7835 /* File: arm64/alt_stub.S */ 7836 /* 7837 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7838 * any interesting requests and then jump to the real instruction 7839 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7840 */ 7841 .extern MterpCheckBefore 7842 EXPORT_PC 7843 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7844 adr lr, artMterpAsmInstructionStart + (53 * 128) // Addr of primary handler. 7845 mov x0, xSELF 7846 add x1, xFP, #OFF_FP_SHADOWFRAME 7847 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7848 7849 /* ------------------------------ */ 7850 .balign 128 7851 .L_ALT_op_if_gt: /* 0x36 */ 7852 /* File: arm64/alt_stub.S */ 7853 /* 7854 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7855 * any interesting requests and then jump to the real instruction 7856 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7857 */ 7858 .extern MterpCheckBefore 7859 EXPORT_PC 7860 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7861 adr lr, artMterpAsmInstructionStart + (54 * 128) // Addr of primary handler. 7862 mov x0, xSELF 7863 add x1, xFP, #OFF_FP_SHADOWFRAME 7864 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7865 7866 /* ------------------------------ */ 7867 .balign 128 7868 .L_ALT_op_if_le: /* 0x37 */ 7869 /* File: arm64/alt_stub.S */ 7870 /* 7871 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7872 * any interesting requests and then jump to the real instruction 7873 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7874 */ 7875 .extern MterpCheckBefore 7876 EXPORT_PC 7877 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7878 adr lr, artMterpAsmInstructionStart + (55 * 128) // Addr of primary handler. 7879 mov x0, xSELF 7880 add x1, xFP, #OFF_FP_SHADOWFRAME 7881 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7882 7883 /* ------------------------------ */ 7884 .balign 128 7885 .L_ALT_op_if_eqz: /* 0x38 */ 7886 /* File: arm64/alt_stub.S */ 7887 /* 7888 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7889 * any interesting requests and then jump to the real instruction 7890 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7891 */ 7892 .extern MterpCheckBefore 7893 EXPORT_PC 7894 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7895 adr lr, artMterpAsmInstructionStart + (56 * 128) // Addr of primary handler. 7896 mov x0, xSELF 7897 add x1, xFP, #OFF_FP_SHADOWFRAME 7898 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7899 7900 /* ------------------------------ */ 7901 .balign 128 7902 .L_ALT_op_if_nez: /* 0x39 */ 7903 /* File: arm64/alt_stub.S */ 7904 /* 7905 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7906 * any interesting requests and then jump to the real instruction 7907 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7908 */ 7909 .extern MterpCheckBefore 7910 EXPORT_PC 7911 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7912 adr lr, artMterpAsmInstructionStart + (57 * 128) // Addr of primary handler. 7913 mov x0, xSELF 7914 add x1, xFP, #OFF_FP_SHADOWFRAME 7915 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7916 7917 /* ------------------------------ */ 7918 .balign 128 7919 .L_ALT_op_if_ltz: /* 0x3a */ 7920 /* File: arm64/alt_stub.S */ 7921 /* 7922 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7923 * any interesting requests and then jump to the real instruction 7924 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7925 */ 7926 .extern MterpCheckBefore 7927 EXPORT_PC 7928 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7929 adr lr, artMterpAsmInstructionStart + (58 * 128) // Addr of primary handler. 7930 mov x0, xSELF 7931 add x1, xFP, #OFF_FP_SHADOWFRAME 7932 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7933 7934 /* ------------------------------ */ 7935 .balign 128 7936 .L_ALT_op_if_gez: /* 0x3b */ 7937 /* File: arm64/alt_stub.S */ 7938 /* 7939 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7940 * any interesting requests and then jump to the real instruction 7941 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7942 */ 7943 .extern MterpCheckBefore 7944 EXPORT_PC 7945 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7946 adr lr, artMterpAsmInstructionStart + (59 * 128) // Addr of primary handler. 7947 mov x0, xSELF 7948 add x1, xFP, #OFF_FP_SHADOWFRAME 7949 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7950 7951 /* ------------------------------ */ 7952 .balign 128 7953 .L_ALT_op_if_gtz: /* 0x3c */ 7954 /* File: arm64/alt_stub.S */ 7955 /* 7956 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7957 * any interesting requests and then jump to the real instruction 7958 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7959 */ 7960 .extern MterpCheckBefore 7961 EXPORT_PC 7962 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7963 adr lr, artMterpAsmInstructionStart + (60 * 128) // Addr of primary handler. 7964 mov x0, xSELF 7965 add x1, xFP, #OFF_FP_SHADOWFRAME 7966 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7967 7968 /* ------------------------------ */ 7969 .balign 128 7970 .L_ALT_op_if_lez: /* 0x3d */ 7971 /* File: arm64/alt_stub.S */ 7972 /* 7973 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7974 * any interesting requests and then jump to the real instruction 7975 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7976 */ 7977 .extern MterpCheckBefore 7978 EXPORT_PC 7979 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7980 adr lr, artMterpAsmInstructionStart + (61 * 128) // Addr of primary handler. 7981 mov x0, xSELF 7982 add x1, xFP, #OFF_FP_SHADOWFRAME 7983 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 7984 7985 /* ------------------------------ */ 7986 .balign 128 7987 .L_ALT_op_unused_3e: /* 0x3e */ 7988 /* File: arm64/alt_stub.S */ 7989 /* 7990 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7991 * any interesting requests and then jump to the real instruction 7992 * handler. Note that the call to MterpCheckBefore is done as a tail call. 7993 */ 7994 .extern MterpCheckBefore 7995 EXPORT_PC 7996 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 7997 adr lr, artMterpAsmInstructionStart + (62 * 128) // Addr of primary handler. 7998 mov x0, xSELF 7999 add x1, xFP, #OFF_FP_SHADOWFRAME 8000 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8001 8002 /* ------------------------------ */ 8003 .balign 128 8004 .L_ALT_op_unused_3f: /* 0x3f */ 8005 /* File: arm64/alt_stub.S */ 8006 /* 8007 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8008 * any interesting requests and then jump to the real instruction 8009 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8010 */ 8011 .extern MterpCheckBefore 8012 EXPORT_PC 8013 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8014 adr lr, artMterpAsmInstructionStart + (63 * 128) // Addr of primary handler. 8015 mov x0, xSELF 8016 add x1, xFP, #OFF_FP_SHADOWFRAME 8017 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8018 8019 /* ------------------------------ */ 8020 .balign 128 8021 .L_ALT_op_unused_40: /* 0x40 */ 8022 /* File: arm64/alt_stub.S */ 8023 /* 8024 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8025 * any interesting requests and then jump to the real instruction 8026 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8027 */ 8028 .extern MterpCheckBefore 8029 EXPORT_PC 8030 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8031 adr lr, artMterpAsmInstructionStart + (64 * 128) // Addr of primary handler. 8032 mov x0, xSELF 8033 add x1, xFP, #OFF_FP_SHADOWFRAME 8034 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8035 8036 /* ------------------------------ */ 8037 .balign 128 8038 .L_ALT_op_unused_41: /* 0x41 */ 8039 /* File: arm64/alt_stub.S */ 8040 /* 8041 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8042 * any interesting requests and then jump to the real instruction 8043 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8044 */ 8045 .extern MterpCheckBefore 8046 EXPORT_PC 8047 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8048 adr lr, artMterpAsmInstructionStart + (65 * 128) // Addr of primary handler. 8049 mov x0, xSELF 8050 add x1, xFP, #OFF_FP_SHADOWFRAME 8051 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8052 8053 /* ------------------------------ */ 8054 .balign 128 8055 .L_ALT_op_unused_42: /* 0x42 */ 8056 /* File: arm64/alt_stub.S */ 8057 /* 8058 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8059 * any interesting requests and then jump to the real instruction 8060 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8061 */ 8062 .extern MterpCheckBefore 8063 EXPORT_PC 8064 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8065 adr lr, artMterpAsmInstructionStart + (66 * 128) // Addr of primary handler. 8066 mov x0, xSELF 8067 add x1, xFP, #OFF_FP_SHADOWFRAME 8068 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8069 8070 /* ------------------------------ */ 8071 .balign 128 8072 .L_ALT_op_unused_43: /* 0x43 */ 8073 /* File: arm64/alt_stub.S */ 8074 /* 8075 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8076 * any interesting requests and then jump to the real instruction 8077 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8078 */ 8079 .extern MterpCheckBefore 8080 EXPORT_PC 8081 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8082 adr lr, artMterpAsmInstructionStart + (67 * 128) // Addr of primary handler. 8083 mov x0, xSELF 8084 add x1, xFP, #OFF_FP_SHADOWFRAME 8085 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8086 8087 /* ------------------------------ */ 8088 .balign 128 8089 .L_ALT_op_aget: /* 0x44 */ 8090 /* File: arm64/alt_stub.S */ 8091 /* 8092 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8093 * any interesting requests and then jump to the real instruction 8094 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8095 */ 8096 .extern MterpCheckBefore 8097 EXPORT_PC 8098 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8099 adr lr, artMterpAsmInstructionStart + (68 * 128) // Addr of primary handler. 8100 mov x0, xSELF 8101 add x1, xFP, #OFF_FP_SHADOWFRAME 8102 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8103 8104 /* ------------------------------ */ 8105 .balign 128 8106 .L_ALT_op_aget_wide: /* 0x45 */ 8107 /* File: arm64/alt_stub.S */ 8108 /* 8109 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8110 * any interesting requests and then jump to the real instruction 8111 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8112 */ 8113 .extern MterpCheckBefore 8114 EXPORT_PC 8115 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8116 adr lr, artMterpAsmInstructionStart + (69 * 128) // Addr of primary handler. 8117 mov x0, xSELF 8118 add x1, xFP, #OFF_FP_SHADOWFRAME 8119 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8120 8121 /* ------------------------------ */ 8122 .balign 128 8123 .L_ALT_op_aget_object: /* 0x46 */ 8124 /* File: arm64/alt_stub.S */ 8125 /* 8126 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8127 * any interesting requests and then jump to the real instruction 8128 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8129 */ 8130 .extern MterpCheckBefore 8131 EXPORT_PC 8132 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8133 adr lr, artMterpAsmInstructionStart + (70 * 128) // Addr of primary handler. 8134 mov x0, xSELF 8135 add x1, xFP, #OFF_FP_SHADOWFRAME 8136 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8137 8138 /* ------------------------------ */ 8139 .balign 128 8140 .L_ALT_op_aget_boolean: /* 0x47 */ 8141 /* File: arm64/alt_stub.S */ 8142 /* 8143 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8144 * any interesting requests and then jump to the real instruction 8145 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8146 */ 8147 .extern MterpCheckBefore 8148 EXPORT_PC 8149 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8150 adr lr, artMterpAsmInstructionStart + (71 * 128) // Addr of primary handler. 8151 mov x0, xSELF 8152 add x1, xFP, #OFF_FP_SHADOWFRAME 8153 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8154 8155 /* ------------------------------ */ 8156 .balign 128 8157 .L_ALT_op_aget_byte: /* 0x48 */ 8158 /* File: arm64/alt_stub.S */ 8159 /* 8160 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8161 * any interesting requests and then jump to the real instruction 8162 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8163 */ 8164 .extern MterpCheckBefore 8165 EXPORT_PC 8166 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8167 adr lr, artMterpAsmInstructionStart + (72 * 128) // Addr of primary handler. 8168 mov x0, xSELF 8169 add x1, xFP, #OFF_FP_SHADOWFRAME 8170 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8171 8172 /* ------------------------------ */ 8173 .balign 128 8174 .L_ALT_op_aget_char: /* 0x49 */ 8175 /* File: arm64/alt_stub.S */ 8176 /* 8177 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8178 * any interesting requests and then jump to the real instruction 8179 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8180 */ 8181 .extern MterpCheckBefore 8182 EXPORT_PC 8183 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8184 adr lr, artMterpAsmInstructionStart + (73 * 128) // Addr of primary handler. 8185 mov x0, xSELF 8186 add x1, xFP, #OFF_FP_SHADOWFRAME 8187 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8188 8189 /* ------------------------------ */ 8190 .balign 128 8191 .L_ALT_op_aget_short: /* 0x4a */ 8192 /* File: arm64/alt_stub.S */ 8193 /* 8194 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8195 * any interesting requests and then jump to the real instruction 8196 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8197 */ 8198 .extern MterpCheckBefore 8199 EXPORT_PC 8200 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8201 adr lr, artMterpAsmInstructionStart + (74 * 128) // Addr of primary handler. 8202 mov x0, xSELF 8203 add x1, xFP, #OFF_FP_SHADOWFRAME 8204 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8205 8206 /* ------------------------------ */ 8207 .balign 128 8208 .L_ALT_op_aput: /* 0x4b */ 8209 /* File: arm64/alt_stub.S */ 8210 /* 8211 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8212 * any interesting requests and then jump to the real instruction 8213 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8214 */ 8215 .extern MterpCheckBefore 8216 EXPORT_PC 8217 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8218 adr lr, artMterpAsmInstructionStart + (75 * 128) // Addr of primary handler. 8219 mov x0, xSELF 8220 add x1, xFP, #OFF_FP_SHADOWFRAME 8221 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8222 8223 /* ------------------------------ */ 8224 .balign 128 8225 .L_ALT_op_aput_wide: /* 0x4c */ 8226 /* File: arm64/alt_stub.S */ 8227 /* 8228 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8229 * any interesting requests and then jump to the real instruction 8230 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8231 */ 8232 .extern MterpCheckBefore 8233 EXPORT_PC 8234 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8235 adr lr, artMterpAsmInstructionStart + (76 * 128) // Addr of primary handler. 8236 mov x0, xSELF 8237 add x1, xFP, #OFF_FP_SHADOWFRAME 8238 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8239 8240 /* ------------------------------ */ 8241 .balign 128 8242 .L_ALT_op_aput_object: /* 0x4d */ 8243 /* File: arm64/alt_stub.S */ 8244 /* 8245 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8246 * any interesting requests and then jump to the real instruction 8247 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8248 */ 8249 .extern MterpCheckBefore 8250 EXPORT_PC 8251 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8252 adr lr, artMterpAsmInstructionStart + (77 * 128) // Addr of primary handler. 8253 mov x0, xSELF 8254 add x1, xFP, #OFF_FP_SHADOWFRAME 8255 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8256 8257 /* ------------------------------ */ 8258 .balign 128 8259 .L_ALT_op_aput_boolean: /* 0x4e */ 8260 /* File: arm64/alt_stub.S */ 8261 /* 8262 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8263 * any interesting requests and then jump to the real instruction 8264 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8265 */ 8266 .extern MterpCheckBefore 8267 EXPORT_PC 8268 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8269 adr lr, artMterpAsmInstructionStart + (78 * 128) // Addr of primary handler. 8270 mov x0, xSELF 8271 add x1, xFP, #OFF_FP_SHADOWFRAME 8272 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8273 8274 /* ------------------------------ */ 8275 .balign 128 8276 .L_ALT_op_aput_byte: /* 0x4f */ 8277 /* File: arm64/alt_stub.S */ 8278 /* 8279 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8280 * any interesting requests and then jump to the real instruction 8281 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8282 */ 8283 .extern MterpCheckBefore 8284 EXPORT_PC 8285 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8286 adr lr, artMterpAsmInstructionStart + (79 * 128) // Addr of primary handler. 8287 mov x0, xSELF 8288 add x1, xFP, #OFF_FP_SHADOWFRAME 8289 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8290 8291 /* ------------------------------ */ 8292 .balign 128 8293 .L_ALT_op_aput_char: /* 0x50 */ 8294 /* File: arm64/alt_stub.S */ 8295 /* 8296 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8297 * any interesting requests and then jump to the real instruction 8298 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8299 */ 8300 .extern MterpCheckBefore 8301 EXPORT_PC 8302 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8303 adr lr, artMterpAsmInstructionStart + (80 * 128) // Addr of primary handler. 8304 mov x0, xSELF 8305 add x1, xFP, #OFF_FP_SHADOWFRAME 8306 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8307 8308 /* ------------------------------ */ 8309 .balign 128 8310 .L_ALT_op_aput_short: /* 0x51 */ 8311 /* File: arm64/alt_stub.S */ 8312 /* 8313 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8314 * any interesting requests and then jump to the real instruction 8315 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8316 */ 8317 .extern MterpCheckBefore 8318 EXPORT_PC 8319 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8320 adr lr, artMterpAsmInstructionStart + (81 * 128) // Addr of primary handler. 8321 mov x0, xSELF 8322 add x1, xFP, #OFF_FP_SHADOWFRAME 8323 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8324 8325 /* ------------------------------ */ 8326 .balign 128 8327 .L_ALT_op_iget: /* 0x52 */ 8328 /* File: arm64/alt_stub.S */ 8329 /* 8330 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8331 * any interesting requests and then jump to the real instruction 8332 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8333 */ 8334 .extern MterpCheckBefore 8335 EXPORT_PC 8336 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8337 adr lr, artMterpAsmInstructionStart + (82 * 128) // Addr of primary handler. 8338 mov x0, xSELF 8339 add x1, xFP, #OFF_FP_SHADOWFRAME 8340 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8341 8342 /* ------------------------------ */ 8343 .balign 128 8344 .L_ALT_op_iget_wide: /* 0x53 */ 8345 /* File: arm64/alt_stub.S */ 8346 /* 8347 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8348 * any interesting requests and then jump to the real instruction 8349 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8350 */ 8351 .extern MterpCheckBefore 8352 EXPORT_PC 8353 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8354 adr lr, artMterpAsmInstructionStart + (83 * 128) // Addr of primary handler. 8355 mov x0, xSELF 8356 add x1, xFP, #OFF_FP_SHADOWFRAME 8357 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8358 8359 /* ------------------------------ */ 8360 .balign 128 8361 .L_ALT_op_iget_object: /* 0x54 */ 8362 /* File: arm64/alt_stub.S */ 8363 /* 8364 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8365 * any interesting requests and then jump to the real instruction 8366 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8367 */ 8368 .extern MterpCheckBefore 8369 EXPORT_PC 8370 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8371 adr lr, artMterpAsmInstructionStart + (84 * 128) // Addr of primary handler. 8372 mov x0, xSELF 8373 add x1, xFP, #OFF_FP_SHADOWFRAME 8374 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8375 8376 /* ------------------------------ */ 8377 .balign 128 8378 .L_ALT_op_iget_boolean: /* 0x55 */ 8379 /* File: arm64/alt_stub.S */ 8380 /* 8381 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8382 * any interesting requests and then jump to the real instruction 8383 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8384 */ 8385 .extern MterpCheckBefore 8386 EXPORT_PC 8387 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8388 adr lr, artMterpAsmInstructionStart + (85 * 128) // Addr of primary handler. 8389 mov x0, xSELF 8390 add x1, xFP, #OFF_FP_SHADOWFRAME 8391 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8392 8393 /* ------------------------------ */ 8394 .balign 128 8395 .L_ALT_op_iget_byte: /* 0x56 */ 8396 /* File: arm64/alt_stub.S */ 8397 /* 8398 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8399 * any interesting requests and then jump to the real instruction 8400 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8401 */ 8402 .extern MterpCheckBefore 8403 EXPORT_PC 8404 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8405 adr lr, artMterpAsmInstructionStart + (86 * 128) // Addr of primary handler. 8406 mov x0, xSELF 8407 add x1, xFP, #OFF_FP_SHADOWFRAME 8408 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8409 8410 /* ------------------------------ */ 8411 .balign 128 8412 .L_ALT_op_iget_char: /* 0x57 */ 8413 /* File: arm64/alt_stub.S */ 8414 /* 8415 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8416 * any interesting requests and then jump to the real instruction 8417 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8418 */ 8419 .extern MterpCheckBefore 8420 EXPORT_PC 8421 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8422 adr lr, artMterpAsmInstructionStart + (87 * 128) // Addr of primary handler. 8423 mov x0, xSELF 8424 add x1, xFP, #OFF_FP_SHADOWFRAME 8425 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8426 8427 /* ------------------------------ */ 8428 .balign 128 8429 .L_ALT_op_iget_short: /* 0x58 */ 8430 /* File: arm64/alt_stub.S */ 8431 /* 8432 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8433 * any interesting requests and then jump to the real instruction 8434 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8435 */ 8436 .extern MterpCheckBefore 8437 EXPORT_PC 8438 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8439 adr lr, artMterpAsmInstructionStart + (88 * 128) // Addr of primary handler. 8440 mov x0, xSELF 8441 add x1, xFP, #OFF_FP_SHADOWFRAME 8442 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8443 8444 /* ------------------------------ */ 8445 .balign 128 8446 .L_ALT_op_iput: /* 0x59 */ 8447 /* File: arm64/alt_stub.S */ 8448 /* 8449 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8450 * any interesting requests and then jump to the real instruction 8451 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8452 */ 8453 .extern MterpCheckBefore 8454 EXPORT_PC 8455 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8456 adr lr, artMterpAsmInstructionStart + (89 * 128) // Addr of primary handler. 8457 mov x0, xSELF 8458 add x1, xFP, #OFF_FP_SHADOWFRAME 8459 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8460 8461 /* ------------------------------ */ 8462 .balign 128 8463 .L_ALT_op_iput_wide: /* 0x5a */ 8464 /* File: arm64/alt_stub.S */ 8465 /* 8466 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8467 * any interesting requests and then jump to the real instruction 8468 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8469 */ 8470 .extern MterpCheckBefore 8471 EXPORT_PC 8472 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8473 adr lr, artMterpAsmInstructionStart + (90 * 128) // Addr of primary handler. 8474 mov x0, xSELF 8475 add x1, xFP, #OFF_FP_SHADOWFRAME 8476 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8477 8478 /* ------------------------------ */ 8479 .balign 128 8480 .L_ALT_op_iput_object: /* 0x5b */ 8481 /* File: arm64/alt_stub.S */ 8482 /* 8483 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8484 * any interesting requests and then jump to the real instruction 8485 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8486 */ 8487 .extern MterpCheckBefore 8488 EXPORT_PC 8489 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8490 adr lr, artMterpAsmInstructionStart + (91 * 128) // Addr of primary handler. 8491 mov x0, xSELF 8492 add x1, xFP, #OFF_FP_SHADOWFRAME 8493 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8494 8495 /* ------------------------------ */ 8496 .balign 128 8497 .L_ALT_op_iput_boolean: /* 0x5c */ 8498 /* File: arm64/alt_stub.S */ 8499 /* 8500 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8501 * any interesting requests and then jump to the real instruction 8502 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8503 */ 8504 .extern MterpCheckBefore 8505 EXPORT_PC 8506 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8507 adr lr, artMterpAsmInstructionStart + (92 * 128) // Addr of primary handler. 8508 mov x0, xSELF 8509 add x1, xFP, #OFF_FP_SHADOWFRAME 8510 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8511 8512 /* ------------------------------ */ 8513 .balign 128 8514 .L_ALT_op_iput_byte: /* 0x5d */ 8515 /* File: arm64/alt_stub.S */ 8516 /* 8517 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8518 * any interesting requests and then jump to the real instruction 8519 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8520 */ 8521 .extern MterpCheckBefore 8522 EXPORT_PC 8523 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8524 adr lr, artMterpAsmInstructionStart + (93 * 128) // Addr of primary handler. 8525 mov x0, xSELF 8526 add x1, xFP, #OFF_FP_SHADOWFRAME 8527 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8528 8529 /* ------------------------------ */ 8530 .balign 128 8531 .L_ALT_op_iput_char: /* 0x5e */ 8532 /* File: arm64/alt_stub.S */ 8533 /* 8534 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8535 * any interesting requests and then jump to the real instruction 8536 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8537 */ 8538 .extern MterpCheckBefore 8539 EXPORT_PC 8540 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8541 adr lr, artMterpAsmInstructionStart + (94 * 128) // Addr of primary handler. 8542 mov x0, xSELF 8543 add x1, xFP, #OFF_FP_SHADOWFRAME 8544 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8545 8546 /* ------------------------------ */ 8547 .balign 128 8548 .L_ALT_op_iput_short: /* 0x5f */ 8549 /* File: arm64/alt_stub.S */ 8550 /* 8551 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8552 * any interesting requests and then jump to the real instruction 8553 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8554 */ 8555 .extern MterpCheckBefore 8556 EXPORT_PC 8557 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8558 adr lr, artMterpAsmInstructionStart + (95 * 128) // Addr of primary handler. 8559 mov x0, xSELF 8560 add x1, xFP, #OFF_FP_SHADOWFRAME 8561 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8562 8563 /* ------------------------------ */ 8564 .balign 128 8565 .L_ALT_op_sget: /* 0x60 */ 8566 /* File: arm64/alt_stub.S */ 8567 /* 8568 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8569 * any interesting requests and then jump to the real instruction 8570 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8571 */ 8572 .extern MterpCheckBefore 8573 EXPORT_PC 8574 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8575 adr lr, artMterpAsmInstructionStart + (96 * 128) // Addr of primary handler. 8576 mov x0, xSELF 8577 add x1, xFP, #OFF_FP_SHADOWFRAME 8578 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8579 8580 /* ------------------------------ */ 8581 .balign 128 8582 .L_ALT_op_sget_wide: /* 0x61 */ 8583 /* File: arm64/alt_stub.S */ 8584 /* 8585 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8586 * any interesting requests and then jump to the real instruction 8587 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8588 */ 8589 .extern MterpCheckBefore 8590 EXPORT_PC 8591 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8592 adr lr, artMterpAsmInstructionStart + (97 * 128) // Addr of primary handler. 8593 mov x0, xSELF 8594 add x1, xFP, #OFF_FP_SHADOWFRAME 8595 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8596 8597 /* ------------------------------ */ 8598 .balign 128 8599 .L_ALT_op_sget_object: /* 0x62 */ 8600 /* File: arm64/alt_stub.S */ 8601 /* 8602 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8603 * any interesting requests and then jump to the real instruction 8604 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8605 */ 8606 .extern MterpCheckBefore 8607 EXPORT_PC 8608 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8609 adr lr, artMterpAsmInstructionStart + (98 * 128) // Addr of primary handler. 8610 mov x0, xSELF 8611 add x1, xFP, #OFF_FP_SHADOWFRAME 8612 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8613 8614 /* ------------------------------ */ 8615 .balign 128 8616 .L_ALT_op_sget_boolean: /* 0x63 */ 8617 /* File: arm64/alt_stub.S */ 8618 /* 8619 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8620 * any interesting requests and then jump to the real instruction 8621 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8622 */ 8623 .extern MterpCheckBefore 8624 EXPORT_PC 8625 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8626 adr lr, artMterpAsmInstructionStart + (99 * 128) // Addr of primary handler. 8627 mov x0, xSELF 8628 add x1, xFP, #OFF_FP_SHADOWFRAME 8629 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8630 8631 /* ------------------------------ */ 8632 .balign 128 8633 .L_ALT_op_sget_byte: /* 0x64 */ 8634 /* File: arm64/alt_stub.S */ 8635 /* 8636 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8637 * any interesting requests and then jump to the real instruction 8638 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8639 */ 8640 .extern MterpCheckBefore 8641 EXPORT_PC 8642 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8643 adr lr, artMterpAsmInstructionStart + (100 * 128) // Addr of primary handler. 8644 mov x0, xSELF 8645 add x1, xFP, #OFF_FP_SHADOWFRAME 8646 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8647 8648 /* ------------------------------ */ 8649 .balign 128 8650 .L_ALT_op_sget_char: /* 0x65 */ 8651 /* File: arm64/alt_stub.S */ 8652 /* 8653 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8654 * any interesting requests and then jump to the real instruction 8655 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8656 */ 8657 .extern MterpCheckBefore 8658 EXPORT_PC 8659 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8660 adr lr, artMterpAsmInstructionStart + (101 * 128) // Addr of primary handler. 8661 mov x0, xSELF 8662 add x1, xFP, #OFF_FP_SHADOWFRAME 8663 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8664 8665 /* ------------------------------ */ 8666 .balign 128 8667 .L_ALT_op_sget_short: /* 0x66 */ 8668 /* File: arm64/alt_stub.S */ 8669 /* 8670 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8671 * any interesting requests and then jump to the real instruction 8672 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8673 */ 8674 .extern MterpCheckBefore 8675 EXPORT_PC 8676 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8677 adr lr, artMterpAsmInstructionStart + (102 * 128) // Addr of primary handler. 8678 mov x0, xSELF 8679 add x1, xFP, #OFF_FP_SHADOWFRAME 8680 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8681 8682 /* ------------------------------ */ 8683 .balign 128 8684 .L_ALT_op_sput: /* 0x67 */ 8685 /* File: arm64/alt_stub.S */ 8686 /* 8687 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8688 * any interesting requests and then jump to the real instruction 8689 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8690 */ 8691 .extern MterpCheckBefore 8692 EXPORT_PC 8693 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8694 adr lr, artMterpAsmInstructionStart + (103 * 128) // Addr of primary handler. 8695 mov x0, xSELF 8696 add x1, xFP, #OFF_FP_SHADOWFRAME 8697 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8698 8699 /* ------------------------------ */ 8700 .balign 128 8701 .L_ALT_op_sput_wide: /* 0x68 */ 8702 /* File: arm64/alt_stub.S */ 8703 /* 8704 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8705 * any interesting requests and then jump to the real instruction 8706 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8707 */ 8708 .extern MterpCheckBefore 8709 EXPORT_PC 8710 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8711 adr lr, artMterpAsmInstructionStart + (104 * 128) // Addr of primary handler. 8712 mov x0, xSELF 8713 add x1, xFP, #OFF_FP_SHADOWFRAME 8714 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8715 8716 /* ------------------------------ */ 8717 .balign 128 8718 .L_ALT_op_sput_object: /* 0x69 */ 8719 /* File: arm64/alt_stub.S */ 8720 /* 8721 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8722 * any interesting requests and then jump to the real instruction 8723 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8724 */ 8725 .extern MterpCheckBefore 8726 EXPORT_PC 8727 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8728 adr lr, artMterpAsmInstructionStart + (105 * 128) // Addr of primary handler. 8729 mov x0, xSELF 8730 add x1, xFP, #OFF_FP_SHADOWFRAME 8731 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8732 8733 /* ------------------------------ */ 8734 .balign 128 8735 .L_ALT_op_sput_boolean: /* 0x6a */ 8736 /* File: arm64/alt_stub.S */ 8737 /* 8738 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8739 * any interesting requests and then jump to the real instruction 8740 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8741 */ 8742 .extern MterpCheckBefore 8743 EXPORT_PC 8744 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8745 adr lr, artMterpAsmInstructionStart + (106 * 128) // Addr of primary handler. 8746 mov x0, xSELF 8747 add x1, xFP, #OFF_FP_SHADOWFRAME 8748 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8749 8750 /* ------------------------------ */ 8751 .balign 128 8752 .L_ALT_op_sput_byte: /* 0x6b */ 8753 /* File: arm64/alt_stub.S */ 8754 /* 8755 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8756 * any interesting requests and then jump to the real instruction 8757 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8758 */ 8759 .extern MterpCheckBefore 8760 EXPORT_PC 8761 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8762 adr lr, artMterpAsmInstructionStart + (107 * 128) // Addr of primary handler. 8763 mov x0, xSELF 8764 add x1, xFP, #OFF_FP_SHADOWFRAME 8765 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8766 8767 /* ------------------------------ */ 8768 .balign 128 8769 .L_ALT_op_sput_char: /* 0x6c */ 8770 /* File: arm64/alt_stub.S */ 8771 /* 8772 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8773 * any interesting requests and then jump to the real instruction 8774 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8775 */ 8776 .extern MterpCheckBefore 8777 EXPORT_PC 8778 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8779 adr lr, artMterpAsmInstructionStart + (108 * 128) // Addr of primary handler. 8780 mov x0, xSELF 8781 add x1, xFP, #OFF_FP_SHADOWFRAME 8782 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8783 8784 /* ------------------------------ */ 8785 .balign 128 8786 .L_ALT_op_sput_short: /* 0x6d */ 8787 /* File: arm64/alt_stub.S */ 8788 /* 8789 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8790 * any interesting requests and then jump to the real instruction 8791 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8792 */ 8793 .extern MterpCheckBefore 8794 EXPORT_PC 8795 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8796 adr lr, artMterpAsmInstructionStart + (109 * 128) // Addr of primary handler. 8797 mov x0, xSELF 8798 add x1, xFP, #OFF_FP_SHADOWFRAME 8799 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8800 8801 /* ------------------------------ */ 8802 .balign 128 8803 .L_ALT_op_invoke_virtual: /* 0x6e */ 8804 /* File: arm64/alt_stub.S */ 8805 /* 8806 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8807 * any interesting requests and then jump to the real instruction 8808 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8809 */ 8810 .extern MterpCheckBefore 8811 EXPORT_PC 8812 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8813 adr lr, artMterpAsmInstructionStart + (110 * 128) // Addr of primary handler. 8814 mov x0, xSELF 8815 add x1, xFP, #OFF_FP_SHADOWFRAME 8816 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8817 8818 /* ------------------------------ */ 8819 .balign 128 8820 .L_ALT_op_invoke_super: /* 0x6f */ 8821 /* File: arm64/alt_stub.S */ 8822 /* 8823 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8824 * any interesting requests and then jump to the real instruction 8825 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8826 */ 8827 .extern MterpCheckBefore 8828 EXPORT_PC 8829 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8830 adr lr, artMterpAsmInstructionStart + (111 * 128) // Addr of primary handler. 8831 mov x0, xSELF 8832 add x1, xFP, #OFF_FP_SHADOWFRAME 8833 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8834 8835 /* ------------------------------ */ 8836 .balign 128 8837 .L_ALT_op_invoke_direct: /* 0x70 */ 8838 /* File: arm64/alt_stub.S */ 8839 /* 8840 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8841 * any interesting requests and then jump to the real instruction 8842 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8843 */ 8844 .extern MterpCheckBefore 8845 EXPORT_PC 8846 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8847 adr lr, artMterpAsmInstructionStart + (112 * 128) // Addr of primary handler. 8848 mov x0, xSELF 8849 add x1, xFP, #OFF_FP_SHADOWFRAME 8850 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8851 8852 /* ------------------------------ */ 8853 .balign 128 8854 .L_ALT_op_invoke_static: /* 0x71 */ 8855 /* File: arm64/alt_stub.S */ 8856 /* 8857 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8858 * any interesting requests and then jump to the real instruction 8859 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8860 */ 8861 .extern MterpCheckBefore 8862 EXPORT_PC 8863 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8864 adr lr, artMterpAsmInstructionStart + (113 * 128) // Addr of primary handler. 8865 mov x0, xSELF 8866 add x1, xFP, #OFF_FP_SHADOWFRAME 8867 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8868 8869 /* ------------------------------ */ 8870 .balign 128 8871 .L_ALT_op_invoke_interface: /* 0x72 */ 8872 /* File: arm64/alt_stub.S */ 8873 /* 8874 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8875 * any interesting requests and then jump to the real instruction 8876 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8877 */ 8878 .extern MterpCheckBefore 8879 EXPORT_PC 8880 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8881 adr lr, artMterpAsmInstructionStart + (114 * 128) // Addr of primary handler. 8882 mov x0, xSELF 8883 add x1, xFP, #OFF_FP_SHADOWFRAME 8884 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8885 8886 /* ------------------------------ */ 8887 .balign 128 8888 .L_ALT_op_return_void_no_barrier: /* 0x73 */ 8889 /* File: arm64/alt_stub.S */ 8890 /* 8891 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8892 * any interesting requests and then jump to the real instruction 8893 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8894 */ 8895 .extern MterpCheckBefore 8896 EXPORT_PC 8897 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8898 adr lr, artMterpAsmInstructionStart + (115 * 128) // Addr of primary handler. 8899 mov x0, xSELF 8900 add x1, xFP, #OFF_FP_SHADOWFRAME 8901 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8902 8903 /* ------------------------------ */ 8904 .balign 128 8905 .L_ALT_op_invoke_virtual_range: /* 0x74 */ 8906 /* File: arm64/alt_stub.S */ 8907 /* 8908 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8909 * any interesting requests and then jump to the real instruction 8910 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8911 */ 8912 .extern MterpCheckBefore 8913 EXPORT_PC 8914 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8915 adr lr, artMterpAsmInstructionStart + (116 * 128) // Addr of primary handler. 8916 mov x0, xSELF 8917 add x1, xFP, #OFF_FP_SHADOWFRAME 8918 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8919 8920 /* ------------------------------ */ 8921 .balign 128 8922 .L_ALT_op_invoke_super_range: /* 0x75 */ 8923 /* File: arm64/alt_stub.S */ 8924 /* 8925 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8926 * any interesting requests and then jump to the real instruction 8927 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8928 */ 8929 .extern MterpCheckBefore 8930 EXPORT_PC 8931 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8932 adr lr, artMterpAsmInstructionStart + (117 * 128) // Addr of primary handler. 8933 mov x0, xSELF 8934 add x1, xFP, #OFF_FP_SHADOWFRAME 8935 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8936 8937 /* ------------------------------ */ 8938 .balign 128 8939 .L_ALT_op_invoke_direct_range: /* 0x76 */ 8940 /* File: arm64/alt_stub.S */ 8941 /* 8942 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8943 * any interesting requests and then jump to the real instruction 8944 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8945 */ 8946 .extern MterpCheckBefore 8947 EXPORT_PC 8948 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8949 adr lr, artMterpAsmInstructionStart + (118 * 128) // Addr of primary handler. 8950 mov x0, xSELF 8951 add x1, xFP, #OFF_FP_SHADOWFRAME 8952 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8953 8954 /* ------------------------------ */ 8955 .balign 128 8956 .L_ALT_op_invoke_static_range: /* 0x77 */ 8957 /* File: arm64/alt_stub.S */ 8958 /* 8959 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8960 * any interesting requests and then jump to the real instruction 8961 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8962 */ 8963 .extern MterpCheckBefore 8964 EXPORT_PC 8965 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8966 adr lr, artMterpAsmInstructionStart + (119 * 128) // Addr of primary handler. 8967 mov x0, xSELF 8968 add x1, xFP, #OFF_FP_SHADOWFRAME 8969 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8970 8971 /* ------------------------------ */ 8972 .balign 128 8973 .L_ALT_op_invoke_interface_range: /* 0x78 */ 8974 /* File: arm64/alt_stub.S */ 8975 /* 8976 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8977 * any interesting requests and then jump to the real instruction 8978 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8979 */ 8980 .extern MterpCheckBefore 8981 EXPORT_PC 8982 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 8983 adr lr, artMterpAsmInstructionStart + (120 * 128) // Addr of primary handler. 8984 mov x0, xSELF 8985 add x1, xFP, #OFF_FP_SHADOWFRAME 8986 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 8987 8988 /* ------------------------------ */ 8989 .balign 128 8990 .L_ALT_op_unused_79: /* 0x79 */ 8991 /* File: arm64/alt_stub.S */ 8992 /* 8993 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8994 * any interesting requests and then jump to the real instruction 8995 * handler. Note that the call to MterpCheckBefore is done as a tail call. 8996 */ 8997 .extern MterpCheckBefore 8998 EXPORT_PC 8999 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9000 adr lr, artMterpAsmInstructionStart + (121 * 128) // Addr of primary handler. 9001 mov x0, xSELF 9002 add x1, xFP, #OFF_FP_SHADOWFRAME 9003 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9004 9005 /* ------------------------------ */ 9006 .balign 128 9007 .L_ALT_op_unused_7a: /* 0x7a */ 9008 /* File: arm64/alt_stub.S */ 9009 /* 9010 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9011 * any interesting requests and then jump to the real instruction 9012 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9013 */ 9014 .extern MterpCheckBefore 9015 EXPORT_PC 9016 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9017 adr lr, artMterpAsmInstructionStart + (122 * 128) // Addr of primary handler. 9018 mov x0, xSELF 9019 add x1, xFP, #OFF_FP_SHADOWFRAME 9020 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9021 9022 /* ------------------------------ */ 9023 .balign 128 9024 .L_ALT_op_neg_int: /* 0x7b */ 9025 /* File: arm64/alt_stub.S */ 9026 /* 9027 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9028 * any interesting requests and then jump to the real instruction 9029 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9030 */ 9031 .extern MterpCheckBefore 9032 EXPORT_PC 9033 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9034 adr lr, artMterpAsmInstructionStart + (123 * 128) // Addr of primary handler. 9035 mov x0, xSELF 9036 add x1, xFP, #OFF_FP_SHADOWFRAME 9037 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9038 9039 /* ------------------------------ */ 9040 .balign 128 9041 .L_ALT_op_not_int: /* 0x7c */ 9042 /* File: arm64/alt_stub.S */ 9043 /* 9044 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9045 * any interesting requests and then jump to the real instruction 9046 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9047 */ 9048 .extern MterpCheckBefore 9049 EXPORT_PC 9050 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9051 adr lr, artMterpAsmInstructionStart + (124 * 128) // Addr of primary handler. 9052 mov x0, xSELF 9053 add x1, xFP, #OFF_FP_SHADOWFRAME 9054 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9055 9056 /* ------------------------------ */ 9057 .balign 128 9058 .L_ALT_op_neg_long: /* 0x7d */ 9059 /* File: arm64/alt_stub.S */ 9060 /* 9061 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9062 * any interesting requests and then jump to the real instruction 9063 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9064 */ 9065 .extern MterpCheckBefore 9066 EXPORT_PC 9067 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9068 adr lr, artMterpAsmInstructionStart + (125 * 128) // Addr of primary handler. 9069 mov x0, xSELF 9070 add x1, xFP, #OFF_FP_SHADOWFRAME 9071 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9072 9073 /* ------------------------------ */ 9074 .balign 128 9075 .L_ALT_op_not_long: /* 0x7e */ 9076 /* File: arm64/alt_stub.S */ 9077 /* 9078 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9079 * any interesting requests and then jump to the real instruction 9080 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9081 */ 9082 .extern MterpCheckBefore 9083 EXPORT_PC 9084 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9085 adr lr, artMterpAsmInstructionStart + (126 * 128) // Addr of primary handler. 9086 mov x0, xSELF 9087 add x1, xFP, #OFF_FP_SHADOWFRAME 9088 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9089 9090 /* ------------------------------ */ 9091 .balign 128 9092 .L_ALT_op_neg_float: /* 0x7f */ 9093 /* File: arm64/alt_stub.S */ 9094 /* 9095 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9096 * any interesting requests and then jump to the real instruction 9097 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9098 */ 9099 .extern MterpCheckBefore 9100 EXPORT_PC 9101 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9102 adr lr, artMterpAsmInstructionStart + (127 * 128) // Addr of primary handler. 9103 mov x0, xSELF 9104 add x1, xFP, #OFF_FP_SHADOWFRAME 9105 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9106 9107 /* ------------------------------ */ 9108 .balign 128 9109 .L_ALT_op_neg_double: /* 0x80 */ 9110 /* File: arm64/alt_stub.S */ 9111 /* 9112 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9113 * any interesting requests and then jump to the real instruction 9114 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9115 */ 9116 .extern MterpCheckBefore 9117 EXPORT_PC 9118 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9119 adr lr, artMterpAsmInstructionStart + (128 * 128) // Addr of primary handler. 9120 mov x0, xSELF 9121 add x1, xFP, #OFF_FP_SHADOWFRAME 9122 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9123 9124 /* ------------------------------ */ 9125 .balign 128 9126 .L_ALT_op_int_to_long: /* 0x81 */ 9127 /* File: arm64/alt_stub.S */ 9128 /* 9129 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9130 * any interesting requests and then jump to the real instruction 9131 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9132 */ 9133 .extern MterpCheckBefore 9134 EXPORT_PC 9135 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9136 adr lr, artMterpAsmInstructionStart + (129 * 128) // Addr of primary handler. 9137 mov x0, xSELF 9138 add x1, xFP, #OFF_FP_SHADOWFRAME 9139 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9140 9141 /* ------------------------------ */ 9142 .balign 128 9143 .L_ALT_op_int_to_float: /* 0x82 */ 9144 /* File: arm64/alt_stub.S */ 9145 /* 9146 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9147 * any interesting requests and then jump to the real instruction 9148 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9149 */ 9150 .extern MterpCheckBefore 9151 EXPORT_PC 9152 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9153 adr lr, artMterpAsmInstructionStart + (130 * 128) // Addr of primary handler. 9154 mov x0, xSELF 9155 add x1, xFP, #OFF_FP_SHADOWFRAME 9156 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9157 9158 /* ------------------------------ */ 9159 .balign 128 9160 .L_ALT_op_int_to_double: /* 0x83 */ 9161 /* File: arm64/alt_stub.S */ 9162 /* 9163 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9164 * any interesting requests and then jump to the real instruction 9165 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9166 */ 9167 .extern MterpCheckBefore 9168 EXPORT_PC 9169 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9170 adr lr, artMterpAsmInstructionStart + (131 * 128) // Addr of primary handler. 9171 mov x0, xSELF 9172 add x1, xFP, #OFF_FP_SHADOWFRAME 9173 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9174 9175 /* ------------------------------ */ 9176 .balign 128 9177 .L_ALT_op_long_to_int: /* 0x84 */ 9178 /* File: arm64/alt_stub.S */ 9179 /* 9180 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9181 * any interesting requests and then jump to the real instruction 9182 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9183 */ 9184 .extern MterpCheckBefore 9185 EXPORT_PC 9186 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9187 adr lr, artMterpAsmInstructionStart + (132 * 128) // Addr of primary handler. 9188 mov x0, xSELF 9189 add x1, xFP, #OFF_FP_SHADOWFRAME 9190 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9191 9192 /* ------------------------------ */ 9193 .balign 128 9194 .L_ALT_op_long_to_float: /* 0x85 */ 9195 /* File: arm64/alt_stub.S */ 9196 /* 9197 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9198 * any interesting requests and then jump to the real instruction 9199 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9200 */ 9201 .extern MterpCheckBefore 9202 EXPORT_PC 9203 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9204 adr lr, artMterpAsmInstructionStart + (133 * 128) // Addr of primary handler. 9205 mov x0, xSELF 9206 add x1, xFP, #OFF_FP_SHADOWFRAME 9207 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9208 9209 /* ------------------------------ */ 9210 .balign 128 9211 .L_ALT_op_long_to_double: /* 0x86 */ 9212 /* File: arm64/alt_stub.S */ 9213 /* 9214 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9215 * any interesting requests and then jump to the real instruction 9216 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9217 */ 9218 .extern MterpCheckBefore 9219 EXPORT_PC 9220 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9221 adr lr, artMterpAsmInstructionStart + (134 * 128) // Addr of primary handler. 9222 mov x0, xSELF 9223 add x1, xFP, #OFF_FP_SHADOWFRAME 9224 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9225 9226 /* ------------------------------ */ 9227 .balign 128 9228 .L_ALT_op_float_to_int: /* 0x87 */ 9229 /* File: arm64/alt_stub.S */ 9230 /* 9231 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9232 * any interesting requests and then jump to the real instruction 9233 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9234 */ 9235 .extern MterpCheckBefore 9236 EXPORT_PC 9237 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9238 adr lr, artMterpAsmInstructionStart + (135 * 128) // Addr of primary handler. 9239 mov x0, xSELF 9240 add x1, xFP, #OFF_FP_SHADOWFRAME 9241 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9242 9243 /* ------------------------------ */ 9244 .balign 128 9245 .L_ALT_op_float_to_long: /* 0x88 */ 9246 /* File: arm64/alt_stub.S */ 9247 /* 9248 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9249 * any interesting requests and then jump to the real instruction 9250 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9251 */ 9252 .extern MterpCheckBefore 9253 EXPORT_PC 9254 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9255 adr lr, artMterpAsmInstructionStart + (136 * 128) // Addr of primary handler. 9256 mov x0, xSELF 9257 add x1, xFP, #OFF_FP_SHADOWFRAME 9258 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9259 9260 /* ------------------------------ */ 9261 .balign 128 9262 .L_ALT_op_float_to_double: /* 0x89 */ 9263 /* File: arm64/alt_stub.S */ 9264 /* 9265 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9266 * any interesting requests and then jump to the real instruction 9267 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9268 */ 9269 .extern MterpCheckBefore 9270 EXPORT_PC 9271 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9272 adr lr, artMterpAsmInstructionStart + (137 * 128) // Addr of primary handler. 9273 mov x0, xSELF 9274 add x1, xFP, #OFF_FP_SHADOWFRAME 9275 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9276 9277 /* ------------------------------ */ 9278 .balign 128 9279 .L_ALT_op_double_to_int: /* 0x8a */ 9280 /* File: arm64/alt_stub.S */ 9281 /* 9282 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9283 * any interesting requests and then jump to the real instruction 9284 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9285 */ 9286 .extern MterpCheckBefore 9287 EXPORT_PC 9288 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9289 adr lr, artMterpAsmInstructionStart + (138 * 128) // Addr of primary handler. 9290 mov x0, xSELF 9291 add x1, xFP, #OFF_FP_SHADOWFRAME 9292 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9293 9294 /* ------------------------------ */ 9295 .balign 128 9296 .L_ALT_op_double_to_long: /* 0x8b */ 9297 /* File: arm64/alt_stub.S */ 9298 /* 9299 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9300 * any interesting requests and then jump to the real instruction 9301 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9302 */ 9303 .extern MterpCheckBefore 9304 EXPORT_PC 9305 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9306 adr lr, artMterpAsmInstructionStart + (139 * 128) // Addr of primary handler. 9307 mov x0, xSELF 9308 add x1, xFP, #OFF_FP_SHADOWFRAME 9309 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9310 9311 /* ------------------------------ */ 9312 .balign 128 9313 .L_ALT_op_double_to_float: /* 0x8c */ 9314 /* File: arm64/alt_stub.S */ 9315 /* 9316 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9317 * any interesting requests and then jump to the real instruction 9318 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9319 */ 9320 .extern MterpCheckBefore 9321 EXPORT_PC 9322 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9323 adr lr, artMterpAsmInstructionStart + (140 * 128) // Addr of primary handler. 9324 mov x0, xSELF 9325 add x1, xFP, #OFF_FP_SHADOWFRAME 9326 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9327 9328 /* ------------------------------ */ 9329 .balign 128 9330 .L_ALT_op_int_to_byte: /* 0x8d */ 9331 /* File: arm64/alt_stub.S */ 9332 /* 9333 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9334 * any interesting requests and then jump to the real instruction 9335 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9336 */ 9337 .extern MterpCheckBefore 9338 EXPORT_PC 9339 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9340 adr lr, artMterpAsmInstructionStart + (141 * 128) // Addr of primary handler. 9341 mov x0, xSELF 9342 add x1, xFP, #OFF_FP_SHADOWFRAME 9343 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9344 9345 /* ------------------------------ */ 9346 .balign 128 9347 .L_ALT_op_int_to_char: /* 0x8e */ 9348 /* File: arm64/alt_stub.S */ 9349 /* 9350 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9351 * any interesting requests and then jump to the real instruction 9352 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9353 */ 9354 .extern MterpCheckBefore 9355 EXPORT_PC 9356 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9357 adr lr, artMterpAsmInstructionStart + (142 * 128) // Addr of primary handler. 9358 mov x0, xSELF 9359 add x1, xFP, #OFF_FP_SHADOWFRAME 9360 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9361 9362 /* ------------------------------ */ 9363 .balign 128 9364 .L_ALT_op_int_to_short: /* 0x8f */ 9365 /* File: arm64/alt_stub.S */ 9366 /* 9367 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9368 * any interesting requests and then jump to the real instruction 9369 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9370 */ 9371 .extern MterpCheckBefore 9372 EXPORT_PC 9373 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9374 adr lr, artMterpAsmInstructionStart + (143 * 128) // Addr of primary handler. 9375 mov x0, xSELF 9376 add x1, xFP, #OFF_FP_SHADOWFRAME 9377 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9378 9379 /* ------------------------------ */ 9380 .balign 128 9381 .L_ALT_op_add_int: /* 0x90 */ 9382 /* File: arm64/alt_stub.S */ 9383 /* 9384 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9385 * any interesting requests and then jump to the real instruction 9386 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9387 */ 9388 .extern MterpCheckBefore 9389 EXPORT_PC 9390 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9391 adr lr, artMterpAsmInstructionStart + (144 * 128) // Addr of primary handler. 9392 mov x0, xSELF 9393 add x1, xFP, #OFF_FP_SHADOWFRAME 9394 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9395 9396 /* ------------------------------ */ 9397 .balign 128 9398 .L_ALT_op_sub_int: /* 0x91 */ 9399 /* File: arm64/alt_stub.S */ 9400 /* 9401 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9402 * any interesting requests and then jump to the real instruction 9403 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9404 */ 9405 .extern MterpCheckBefore 9406 EXPORT_PC 9407 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9408 adr lr, artMterpAsmInstructionStart + (145 * 128) // Addr of primary handler. 9409 mov x0, xSELF 9410 add x1, xFP, #OFF_FP_SHADOWFRAME 9411 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9412 9413 /* ------------------------------ */ 9414 .balign 128 9415 .L_ALT_op_mul_int: /* 0x92 */ 9416 /* File: arm64/alt_stub.S */ 9417 /* 9418 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9419 * any interesting requests and then jump to the real instruction 9420 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9421 */ 9422 .extern MterpCheckBefore 9423 EXPORT_PC 9424 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9425 adr lr, artMterpAsmInstructionStart + (146 * 128) // Addr of primary handler. 9426 mov x0, xSELF 9427 add x1, xFP, #OFF_FP_SHADOWFRAME 9428 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9429 9430 /* ------------------------------ */ 9431 .balign 128 9432 .L_ALT_op_div_int: /* 0x93 */ 9433 /* File: arm64/alt_stub.S */ 9434 /* 9435 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9436 * any interesting requests and then jump to the real instruction 9437 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9438 */ 9439 .extern MterpCheckBefore 9440 EXPORT_PC 9441 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9442 adr lr, artMterpAsmInstructionStart + (147 * 128) // Addr of primary handler. 9443 mov x0, xSELF 9444 add x1, xFP, #OFF_FP_SHADOWFRAME 9445 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9446 9447 /* ------------------------------ */ 9448 .balign 128 9449 .L_ALT_op_rem_int: /* 0x94 */ 9450 /* File: arm64/alt_stub.S */ 9451 /* 9452 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9453 * any interesting requests and then jump to the real instruction 9454 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9455 */ 9456 .extern MterpCheckBefore 9457 EXPORT_PC 9458 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9459 adr lr, artMterpAsmInstructionStart + (148 * 128) // Addr of primary handler. 9460 mov x0, xSELF 9461 add x1, xFP, #OFF_FP_SHADOWFRAME 9462 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9463 9464 /* ------------------------------ */ 9465 .balign 128 9466 .L_ALT_op_and_int: /* 0x95 */ 9467 /* File: arm64/alt_stub.S */ 9468 /* 9469 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9470 * any interesting requests and then jump to the real instruction 9471 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9472 */ 9473 .extern MterpCheckBefore 9474 EXPORT_PC 9475 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9476 adr lr, artMterpAsmInstructionStart + (149 * 128) // Addr of primary handler. 9477 mov x0, xSELF 9478 add x1, xFP, #OFF_FP_SHADOWFRAME 9479 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9480 9481 /* ------------------------------ */ 9482 .balign 128 9483 .L_ALT_op_or_int: /* 0x96 */ 9484 /* File: arm64/alt_stub.S */ 9485 /* 9486 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9487 * any interesting requests and then jump to the real instruction 9488 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9489 */ 9490 .extern MterpCheckBefore 9491 EXPORT_PC 9492 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9493 adr lr, artMterpAsmInstructionStart + (150 * 128) // Addr of primary handler. 9494 mov x0, xSELF 9495 add x1, xFP, #OFF_FP_SHADOWFRAME 9496 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9497 9498 /* ------------------------------ */ 9499 .balign 128 9500 .L_ALT_op_xor_int: /* 0x97 */ 9501 /* File: arm64/alt_stub.S */ 9502 /* 9503 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9504 * any interesting requests and then jump to the real instruction 9505 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9506 */ 9507 .extern MterpCheckBefore 9508 EXPORT_PC 9509 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9510 adr lr, artMterpAsmInstructionStart + (151 * 128) // Addr of primary handler. 9511 mov x0, xSELF 9512 add x1, xFP, #OFF_FP_SHADOWFRAME 9513 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9514 9515 /* ------------------------------ */ 9516 .balign 128 9517 .L_ALT_op_shl_int: /* 0x98 */ 9518 /* File: arm64/alt_stub.S */ 9519 /* 9520 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9521 * any interesting requests and then jump to the real instruction 9522 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9523 */ 9524 .extern MterpCheckBefore 9525 EXPORT_PC 9526 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9527 adr lr, artMterpAsmInstructionStart + (152 * 128) // Addr of primary handler. 9528 mov x0, xSELF 9529 add x1, xFP, #OFF_FP_SHADOWFRAME 9530 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9531 9532 /* ------------------------------ */ 9533 .balign 128 9534 .L_ALT_op_shr_int: /* 0x99 */ 9535 /* File: arm64/alt_stub.S */ 9536 /* 9537 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9538 * any interesting requests and then jump to the real instruction 9539 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9540 */ 9541 .extern MterpCheckBefore 9542 EXPORT_PC 9543 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9544 adr lr, artMterpAsmInstructionStart + (153 * 128) // Addr of primary handler. 9545 mov x0, xSELF 9546 add x1, xFP, #OFF_FP_SHADOWFRAME 9547 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9548 9549 /* ------------------------------ */ 9550 .balign 128 9551 .L_ALT_op_ushr_int: /* 0x9a */ 9552 /* File: arm64/alt_stub.S */ 9553 /* 9554 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9555 * any interesting requests and then jump to the real instruction 9556 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9557 */ 9558 .extern MterpCheckBefore 9559 EXPORT_PC 9560 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9561 adr lr, artMterpAsmInstructionStart + (154 * 128) // Addr of primary handler. 9562 mov x0, xSELF 9563 add x1, xFP, #OFF_FP_SHADOWFRAME 9564 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9565 9566 /* ------------------------------ */ 9567 .balign 128 9568 .L_ALT_op_add_long: /* 0x9b */ 9569 /* File: arm64/alt_stub.S */ 9570 /* 9571 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9572 * any interesting requests and then jump to the real instruction 9573 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9574 */ 9575 .extern MterpCheckBefore 9576 EXPORT_PC 9577 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9578 adr lr, artMterpAsmInstructionStart + (155 * 128) // Addr of primary handler. 9579 mov x0, xSELF 9580 add x1, xFP, #OFF_FP_SHADOWFRAME 9581 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9582 9583 /* ------------------------------ */ 9584 .balign 128 9585 .L_ALT_op_sub_long: /* 0x9c */ 9586 /* File: arm64/alt_stub.S */ 9587 /* 9588 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9589 * any interesting requests and then jump to the real instruction 9590 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9591 */ 9592 .extern MterpCheckBefore 9593 EXPORT_PC 9594 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9595 adr lr, artMterpAsmInstructionStart + (156 * 128) // Addr of primary handler. 9596 mov x0, xSELF 9597 add x1, xFP, #OFF_FP_SHADOWFRAME 9598 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9599 9600 /* ------------------------------ */ 9601 .balign 128 9602 .L_ALT_op_mul_long: /* 0x9d */ 9603 /* File: arm64/alt_stub.S */ 9604 /* 9605 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9606 * any interesting requests and then jump to the real instruction 9607 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9608 */ 9609 .extern MterpCheckBefore 9610 EXPORT_PC 9611 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9612 adr lr, artMterpAsmInstructionStart + (157 * 128) // Addr of primary handler. 9613 mov x0, xSELF 9614 add x1, xFP, #OFF_FP_SHADOWFRAME 9615 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9616 9617 /* ------------------------------ */ 9618 .balign 128 9619 .L_ALT_op_div_long: /* 0x9e */ 9620 /* File: arm64/alt_stub.S */ 9621 /* 9622 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9623 * any interesting requests and then jump to the real instruction 9624 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9625 */ 9626 .extern MterpCheckBefore 9627 EXPORT_PC 9628 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9629 adr lr, artMterpAsmInstructionStart + (158 * 128) // Addr of primary handler. 9630 mov x0, xSELF 9631 add x1, xFP, #OFF_FP_SHADOWFRAME 9632 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9633 9634 /* ------------------------------ */ 9635 .balign 128 9636 .L_ALT_op_rem_long: /* 0x9f */ 9637 /* File: arm64/alt_stub.S */ 9638 /* 9639 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9640 * any interesting requests and then jump to the real instruction 9641 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9642 */ 9643 .extern MterpCheckBefore 9644 EXPORT_PC 9645 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9646 adr lr, artMterpAsmInstructionStart + (159 * 128) // Addr of primary handler. 9647 mov x0, xSELF 9648 add x1, xFP, #OFF_FP_SHADOWFRAME 9649 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9650 9651 /* ------------------------------ */ 9652 .balign 128 9653 .L_ALT_op_and_long: /* 0xa0 */ 9654 /* File: arm64/alt_stub.S */ 9655 /* 9656 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9657 * any interesting requests and then jump to the real instruction 9658 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9659 */ 9660 .extern MterpCheckBefore 9661 EXPORT_PC 9662 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9663 adr lr, artMterpAsmInstructionStart + (160 * 128) // Addr of primary handler. 9664 mov x0, xSELF 9665 add x1, xFP, #OFF_FP_SHADOWFRAME 9666 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9667 9668 /* ------------------------------ */ 9669 .balign 128 9670 .L_ALT_op_or_long: /* 0xa1 */ 9671 /* File: arm64/alt_stub.S */ 9672 /* 9673 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9674 * any interesting requests and then jump to the real instruction 9675 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9676 */ 9677 .extern MterpCheckBefore 9678 EXPORT_PC 9679 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9680 adr lr, artMterpAsmInstructionStart + (161 * 128) // Addr of primary handler. 9681 mov x0, xSELF 9682 add x1, xFP, #OFF_FP_SHADOWFRAME 9683 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9684 9685 /* ------------------------------ */ 9686 .balign 128 9687 .L_ALT_op_xor_long: /* 0xa2 */ 9688 /* File: arm64/alt_stub.S */ 9689 /* 9690 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9691 * any interesting requests and then jump to the real instruction 9692 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9693 */ 9694 .extern MterpCheckBefore 9695 EXPORT_PC 9696 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9697 adr lr, artMterpAsmInstructionStart + (162 * 128) // Addr of primary handler. 9698 mov x0, xSELF 9699 add x1, xFP, #OFF_FP_SHADOWFRAME 9700 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9701 9702 /* ------------------------------ */ 9703 .balign 128 9704 .L_ALT_op_shl_long: /* 0xa3 */ 9705 /* File: arm64/alt_stub.S */ 9706 /* 9707 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9708 * any interesting requests and then jump to the real instruction 9709 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9710 */ 9711 .extern MterpCheckBefore 9712 EXPORT_PC 9713 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9714 adr lr, artMterpAsmInstructionStart + (163 * 128) // Addr of primary handler. 9715 mov x0, xSELF 9716 add x1, xFP, #OFF_FP_SHADOWFRAME 9717 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9718 9719 /* ------------------------------ */ 9720 .balign 128 9721 .L_ALT_op_shr_long: /* 0xa4 */ 9722 /* File: arm64/alt_stub.S */ 9723 /* 9724 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9725 * any interesting requests and then jump to the real instruction 9726 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9727 */ 9728 .extern MterpCheckBefore 9729 EXPORT_PC 9730 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9731 adr lr, artMterpAsmInstructionStart + (164 * 128) // Addr of primary handler. 9732 mov x0, xSELF 9733 add x1, xFP, #OFF_FP_SHADOWFRAME 9734 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9735 9736 /* ------------------------------ */ 9737 .balign 128 9738 .L_ALT_op_ushr_long: /* 0xa5 */ 9739 /* File: arm64/alt_stub.S */ 9740 /* 9741 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9742 * any interesting requests and then jump to the real instruction 9743 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9744 */ 9745 .extern MterpCheckBefore 9746 EXPORT_PC 9747 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9748 adr lr, artMterpAsmInstructionStart + (165 * 128) // Addr of primary handler. 9749 mov x0, xSELF 9750 add x1, xFP, #OFF_FP_SHADOWFRAME 9751 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9752 9753 /* ------------------------------ */ 9754 .balign 128 9755 .L_ALT_op_add_float: /* 0xa6 */ 9756 /* File: arm64/alt_stub.S */ 9757 /* 9758 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9759 * any interesting requests and then jump to the real instruction 9760 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9761 */ 9762 .extern MterpCheckBefore 9763 EXPORT_PC 9764 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9765 adr lr, artMterpAsmInstructionStart + (166 * 128) // Addr of primary handler. 9766 mov x0, xSELF 9767 add x1, xFP, #OFF_FP_SHADOWFRAME 9768 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9769 9770 /* ------------------------------ */ 9771 .balign 128 9772 .L_ALT_op_sub_float: /* 0xa7 */ 9773 /* File: arm64/alt_stub.S */ 9774 /* 9775 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9776 * any interesting requests and then jump to the real instruction 9777 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9778 */ 9779 .extern MterpCheckBefore 9780 EXPORT_PC 9781 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9782 adr lr, artMterpAsmInstructionStart + (167 * 128) // Addr of primary handler. 9783 mov x0, xSELF 9784 add x1, xFP, #OFF_FP_SHADOWFRAME 9785 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9786 9787 /* ------------------------------ */ 9788 .balign 128 9789 .L_ALT_op_mul_float: /* 0xa8 */ 9790 /* File: arm64/alt_stub.S */ 9791 /* 9792 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9793 * any interesting requests and then jump to the real instruction 9794 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9795 */ 9796 .extern MterpCheckBefore 9797 EXPORT_PC 9798 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9799 adr lr, artMterpAsmInstructionStart + (168 * 128) // Addr of primary handler. 9800 mov x0, xSELF 9801 add x1, xFP, #OFF_FP_SHADOWFRAME 9802 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9803 9804 /* ------------------------------ */ 9805 .balign 128 9806 .L_ALT_op_div_float: /* 0xa9 */ 9807 /* File: arm64/alt_stub.S */ 9808 /* 9809 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9810 * any interesting requests and then jump to the real instruction 9811 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9812 */ 9813 .extern MterpCheckBefore 9814 EXPORT_PC 9815 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9816 adr lr, artMterpAsmInstructionStart + (169 * 128) // Addr of primary handler. 9817 mov x0, xSELF 9818 add x1, xFP, #OFF_FP_SHADOWFRAME 9819 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9820 9821 /* ------------------------------ */ 9822 .balign 128 9823 .L_ALT_op_rem_float: /* 0xaa */ 9824 /* File: arm64/alt_stub.S */ 9825 /* 9826 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9827 * any interesting requests and then jump to the real instruction 9828 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9829 */ 9830 .extern MterpCheckBefore 9831 EXPORT_PC 9832 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9833 adr lr, artMterpAsmInstructionStart + (170 * 128) // Addr of primary handler. 9834 mov x0, xSELF 9835 add x1, xFP, #OFF_FP_SHADOWFRAME 9836 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9837 9838 /* ------------------------------ */ 9839 .balign 128 9840 .L_ALT_op_add_double: /* 0xab */ 9841 /* File: arm64/alt_stub.S */ 9842 /* 9843 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9844 * any interesting requests and then jump to the real instruction 9845 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9846 */ 9847 .extern MterpCheckBefore 9848 EXPORT_PC 9849 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9850 adr lr, artMterpAsmInstructionStart + (171 * 128) // Addr of primary handler. 9851 mov x0, xSELF 9852 add x1, xFP, #OFF_FP_SHADOWFRAME 9853 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9854 9855 /* ------------------------------ */ 9856 .balign 128 9857 .L_ALT_op_sub_double: /* 0xac */ 9858 /* File: arm64/alt_stub.S */ 9859 /* 9860 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9861 * any interesting requests and then jump to the real instruction 9862 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9863 */ 9864 .extern MterpCheckBefore 9865 EXPORT_PC 9866 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9867 adr lr, artMterpAsmInstructionStart + (172 * 128) // Addr of primary handler. 9868 mov x0, xSELF 9869 add x1, xFP, #OFF_FP_SHADOWFRAME 9870 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9871 9872 /* ------------------------------ */ 9873 .balign 128 9874 .L_ALT_op_mul_double: /* 0xad */ 9875 /* File: arm64/alt_stub.S */ 9876 /* 9877 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9878 * any interesting requests and then jump to the real instruction 9879 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9880 */ 9881 .extern MterpCheckBefore 9882 EXPORT_PC 9883 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9884 adr lr, artMterpAsmInstructionStart + (173 * 128) // Addr of primary handler. 9885 mov x0, xSELF 9886 add x1, xFP, #OFF_FP_SHADOWFRAME 9887 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9888 9889 /* ------------------------------ */ 9890 .balign 128 9891 .L_ALT_op_div_double: /* 0xae */ 9892 /* File: arm64/alt_stub.S */ 9893 /* 9894 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9895 * any interesting requests and then jump to the real instruction 9896 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9897 */ 9898 .extern MterpCheckBefore 9899 EXPORT_PC 9900 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9901 adr lr, artMterpAsmInstructionStart + (174 * 128) // Addr of primary handler. 9902 mov x0, xSELF 9903 add x1, xFP, #OFF_FP_SHADOWFRAME 9904 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9905 9906 /* ------------------------------ */ 9907 .balign 128 9908 .L_ALT_op_rem_double: /* 0xaf */ 9909 /* File: arm64/alt_stub.S */ 9910 /* 9911 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9912 * any interesting requests and then jump to the real instruction 9913 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9914 */ 9915 .extern MterpCheckBefore 9916 EXPORT_PC 9917 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9918 adr lr, artMterpAsmInstructionStart + (175 * 128) // Addr of primary handler. 9919 mov x0, xSELF 9920 add x1, xFP, #OFF_FP_SHADOWFRAME 9921 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9922 9923 /* ------------------------------ */ 9924 .balign 128 9925 .L_ALT_op_add_int_2addr: /* 0xb0 */ 9926 /* File: arm64/alt_stub.S */ 9927 /* 9928 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9929 * any interesting requests and then jump to the real instruction 9930 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9931 */ 9932 .extern MterpCheckBefore 9933 EXPORT_PC 9934 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9935 adr lr, artMterpAsmInstructionStart + (176 * 128) // Addr of primary handler. 9936 mov x0, xSELF 9937 add x1, xFP, #OFF_FP_SHADOWFRAME 9938 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9939 9940 /* ------------------------------ */ 9941 .balign 128 9942 .L_ALT_op_sub_int_2addr: /* 0xb1 */ 9943 /* File: arm64/alt_stub.S */ 9944 /* 9945 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9946 * any interesting requests and then jump to the real instruction 9947 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9948 */ 9949 .extern MterpCheckBefore 9950 EXPORT_PC 9951 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9952 adr lr, artMterpAsmInstructionStart + (177 * 128) // Addr of primary handler. 9953 mov x0, xSELF 9954 add x1, xFP, #OFF_FP_SHADOWFRAME 9955 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9956 9957 /* ------------------------------ */ 9958 .balign 128 9959 .L_ALT_op_mul_int_2addr: /* 0xb2 */ 9960 /* File: arm64/alt_stub.S */ 9961 /* 9962 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9963 * any interesting requests and then jump to the real instruction 9964 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9965 */ 9966 .extern MterpCheckBefore 9967 EXPORT_PC 9968 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9969 adr lr, artMterpAsmInstructionStart + (178 * 128) // Addr of primary handler. 9970 mov x0, xSELF 9971 add x1, xFP, #OFF_FP_SHADOWFRAME 9972 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9973 9974 /* ------------------------------ */ 9975 .balign 128 9976 .L_ALT_op_div_int_2addr: /* 0xb3 */ 9977 /* File: arm64/alt_stub.S */ 9978 /* 9979 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9980 * any interesting requests and then jump to the real instruction 9981 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9982 */ 9983 .extern MterpCheckBefore 9984 EXPORT_PC 9985 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 9986 adr lr, artMterpAsmInstructionStart + (179 * 128) // Addr of primary handler. 9987 mov x0, xSELF 9988 add x1, xFP, #OFF_FP_SHADOWFRAME 9989 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 9990 9991 /* ------------------------------ */ 9992 .balign 128 9993 .L_ALT_op_rem_int_2addr: /* 0xb4 */ 9994 /* File: arm64/alt_stub.S */ 9995 /* 9996 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9997 * any interesting requests and then jump to the real instruction 9998 * handler. Note that the call to MterpCheckBefore is done as a tail call. 9999 */ 10000 .extern MterpCheckBefore 10001 EXPORT_PC 10002 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10003 adr lr, artMterpAsmInstructionStart + (180 * 128) // Addr of primary handler. 10004 mov x0, xSELF 10005 add x1, xFP, #OFF_FP_SHADOWFRAME 10006 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10007 10008 /* ------------------------------ */ 10009 .balign 128 10010 .L_ALT_op_and_int_2addr: /* 0xb5 */ 10011 /* File: arm64/alt_stub.S */ 10012 /* 10013 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10014 * any interesting requests and then jump to the real instruction 10015 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10016 */ 10017 .extern MterpCheckBefore 10018 EXPORT_PC 10019 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10020 adr lr, artMterpAsmInstructionStart + (181 * 128) // Addr of primary handler. 10021 mov x0, xSELF 10022 add x1, xFP, #OFF_FP_SHADOWFRAME 10023 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10024 10025 /* ------------------------------ */ 10026 .balign 128 10027 .L_ALT_op_or_int_2addr: /* 0xb6 */ 10028 /* File: arm64/alt_stub.S */ 10029 /* 10030 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10031 * any interesting requests and then jump to the real instruction 10032 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10033 */ 10034 .extern MterpCheckBefore 10035 EXPORT_PC 10036 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10037 adr lr, artMterpAsmInstructionStart + (182 * 128) // Addr of primary handler. 10038 mov x0, xSELF 10039 add x1, xFP, #OFF_FP_SHADOWFRAME 10040 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10041 10042 /* ------------------------------ */ 10043 .balign 128 10044 .L_ALT_op_xor_int_2addr: /* 0xb7 */ 10045 /* File: arm64/alt_stub.S */ 10046 /* 10047 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10048 * any interesting requests and then jump to the real instruction 10049 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10050 */ 10051 .extern MterpCheckBefore 10052 EXPORT_PC 10053 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10054 adr lr, artMterpAsmInstructionStart + (183 * 128) // Addr of primary handler. 10055 mov x0, xSELF 10056 add x1, xFP, #OFF_FP_SHADOWFRAME 10057 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10058 10059 /* ------------------------------ */ 10060 .balign 128 10061 .L_ALT_op_shl_int_2addr: /* 0xb8 */ 10062 /* File: arm64/alt_stub.S */ 10063 /* 10064 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10065 * any interesting requests and then jump to the real instruction 10066 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10067 */ 10068 .extern MterpCheckBefore 10069 EXPORT_PC 10070 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10071 adr lr, artMterpAsmInstructionStart + (184 * 128) // Addr of primary handler. 10072 mov x0, xSELF 10073 add x1, xFP, #OFF_FP_SHADOWFRAME 10074 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10075 10076 /* ------------------------------ */ 10077 .balign 128 10078 .L_ALT_op_shr_int_2addr: /* 0xb9 */ 10079 /* File: arm64/alt_stub.S */ 10080 /* 10081 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10082 * any interesting requests and then jump to the real instruction 10083 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10084 */ 10085 .extern MterpCheckBefore 10086 EXPORT_PC 10087 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10088 adr lr, artMterpAsmInstructionStart + (185 * 128) // Addr of primary handler. 10089 mov x0, xSELF 10090 add x1, xFP, #OFF_FP_SHADOWFRAME 10091 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10092 10093 /* ------------------------------ */ 10094 .balign 128 10095 .L_ALT_op_ushr_int_2addr: /* 0xba */ 10096 /* File: arm64/alt_stub.S */ 10097 /* 10098 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10099 * any interesting requests and then jump to the real instruction 10100 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10101 */ 10102 .extern MterpCheckBefore 10103 EXPORT_PC 10104 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10105 adr lr, artMterpAsmInstructionStart + (186 * 128) // Addr of primary handler. 10106 mov x0, xSELF 10107 add x1, xFP, #OFF_FP_SHADOWFRAME 10108 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10109 10110 /* ------------------------------ */ 10111 .balign 128 10112 .L_ALT_op_add_long_2addr: /* 0xbb */ 10113 /* File: arm64/alt_stub.S */ 10114 /* 10115 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10116 * any interesting requests and then jump to the real instruction 10117 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10118 */ 10119 .extern MterpCheckBefore 10120 EXPORT_PC 10121 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10122 adr lr, artMterpAsmInstructionStart + (187 * 128) // Addr of primary handler. 10123 mov x0, xSELF 10124 add x1, xFP, #OFF_FP_SHADOWFRAME 10125 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10126 10127 /* ------------------------------ */ 10128 .balign 128 10129 .L_ALT_op_sub_long_2addr: /* 0xbc */ 10130 /* File: arm64/alt_stub.S */ 10131 /* 10132 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10133 * any interesting requests and then jump to the real instruction 10134 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10135 */ 10136 .extern MterpCheckBefore 10137 EXPORT_PC 10138 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10139 adr lr, artMterpAsmInstructionStart + (188 * 128) // Addr of primary handler. 10140 mov x0, xSELF 10141 add x1, xFP, #OFF_FP_SHADOWFRAME 10142 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10143 10144 /* ------------------------------ */ 10145 .balign 128 10146 .L_ALT_op_mul_long_2addr: /* 0xbd */ 10147 /* File: arm64/alt_stub.S */ 10148 /* 10149 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10150 * any interesting requests and then jump to the real instruction 10151 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10152 */ 10153 .extern MterpCheckBefore 10154 EXPORT_PC 10155 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10156 adr lr, artMterpAsmInstructionStart + (189 * 128) // Addr of primary handler. 10157 mov x0, xSELF 10158 add x1, xFP, #OFF_FP_SHADOWFRAME 10159 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10160 10161 /* ------------------------------ */ 10162 .balign 128 10163 .L_ALT_op_div_long_2addr: /* 0xbe */ 10164 /* File: arm64/alt_stub.S */ 10165 /* 10166 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10167 * any interesting requests and then jump to the real instruction 10168 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10169 */ 10170 .extern MterpCheckBefore 10171 EXPORT_PC 10172 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10173 adr lr, artMterpAsmInstructionStart + (190 * 128) // Addr of primary handler. 10174 mov x0, xSELF 10175 add x1, xFP, #OFF_FP_SHADOWFRAME 10176 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10177 10178 /* ------------------------------ */ 10179 .balign 128 10180 .L_ALT_op_rem_long_2addr: /* 0xbf */ 10181 /* File: arm64/alt_stub.S */ 10182 /* 10183 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10184 * any interesting requests and then jump to the real instruction 10185 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10186 */ 10187 .extern MterpCheckBefore 10188 EXPORT_PC 10189 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10190 adr lr, artMterpAsmInstructionStart + (191 * 128) // Addr of primary handler. 10191 mov x0, xSELF 10192 add x1, xFP, #OFF_FP_SHADOWFRAME 10193 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10194 10195 /* ------------------------------ */ 10196 .balign 128 10197 .L_ALT_op_and_long_2addr: /* 0xc0 */ 10198 /* File: arm64/alt_stub.S */ 10199 /* 10200 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10201 * any interesting requests and then jump to the real instruction 10202 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10203 */ 10204 .extern MterpCheckBefore 10205 EXPORT_PC 10206 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10207 adr lr, artMterpAsmInstructionStart + (192 * 128) // Addr of primary handler. 10208 mov x0, xSELF 10209 add x1, xFP, #OFF_FP_SHADOWFRAME 10210 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10211 10212 /* ------------------------------ */ 10213 .balign 128 10214 .L_ALT_op_or_long_2addr: /* 0xc1 */ 10215 /* File: arm64/alt_stub.S */ 10216 /* 10217 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10218 * any interesting requests and then jump to the real instruction 10219 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10220 */ 10221 .extern MterpCheckBefore 10222 EXPORT_PC 10223 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10224 adr lr, artMterpAsmInstructionStart + (193 * 128) // Addr of primary handler. 10225 mov x0, xSELF 10226 add x1, xFP, #OFF_FP_SHADOWFRAME 10227 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10228 10229 /* ------------------------------ */ 10230 .balign 128 10231 .L_ALT_op_xor_long_2addr: /* 0xc2 */ 10232 /* File: arm64/alt_stub.S */ 10233 /* 10234 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10235 * any interesting requests and then jump to the real instruction 10236 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10237 */ 10238 .extern MterpCheckBefore 10239 EXPORT_PC 10240 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10241 adr lr, artMterpAsmInstructionStart + (194 * 128) // Addr of primary handler. 10242 mov x0, xSELF 10243 add x1, xFP, #OFF_FP_SHADOWFRAME 10244 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10245 10246 /* ------------------------------ */ 10247 .balign 128 10248 .L_ALT_op_shl_long_2addr: /* 0xc3 */ 10249 /* File: arm64/alt_stub.S */ 10250 /* 10251 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10252 * any interesting requests and then jump to the real instruction 10253 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10254 */ 10255 .extern MterpCheckBefore 10256 EXPORT_PC 10257 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10258 adr lr, artMterpAsmInstructionStart + (195 * 128) // Addr of primary handler. 10259 mov x0, xSELF 10260 add x1, xFP, #OFF_FP_SHADOWFRAME 10261 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10262 10263 /* ------------------------------ */ 10264 .balign 128 10265 .L_ALT_op_shr_long_2addr: /* 0xc4 */ 10266 /* File: arm64/alt_stub.S */ 10267 /* 10268 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10269 * any interesting requests and then jump to the real instruction 10270 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10271 */ 10272 .extern MterpCheckBefore 10273 EXPORT_PC 10274 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10275 adr lr, artMterpAsmInstructionStart + (196 * 128) // Addr of primary handler. 10276 mov x0, xSELF 10277 add x1, xFP, #OFF_FP_SHADOWFRAME 10278 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10279 10280 /* ------------------------------ */ 10281 .balign 128 10282 .L_ALT_op_ushr_long_2addr: /* 0xc5 */ 10283 /* File: arm64/alt_stub.S */ 10284 /* 10285 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10286 * any interesting requests and then jump to the real instruction 10287 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10288 */ 10289 .extern MterpCheckBefore 10290 EXPORT_PC 10291 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10292 adr lr, artMterpAsmInstructionStart + (197 * 128) // Addr of primary handler. 10293 mov x0, xSELF 10294 add x1, xFP, #OFF_FP_SHADOWFRAME 10295 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10296 10297 /* ------------------------------ */ 10298 .balign 128 10299 .L_ALT_op_add_float_2addr: /* 0xc6 */ 10300 /* File: arm64/alt_stub.S */ 10301 /* 10302 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10303 * any interesting requests and then jump to the real instruction 10304 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10305 */ 10306 .extern MterpCheckBefore 10307 EXPORT_PC 10308 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10309 adr lr, artMterpAsmInstructionStart + (198 * 128) // Addr of primary handler. 10310 mov x0, xSELF 10311 add x1, xFP, #OFF_FP_SHADOWFRAME 10312 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10313 10314 /* ------------------------------ */ 10315 .balign 128 10316 .L_ALT_op_sub_float_2addr: /* 0xc7 */ 10317 /* File: arm64/alt_stub.S */ 10318 /* 10319 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10320 * any interesting requests and then jump to the real instruction 10321 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10322 */ 10323 .extern MterpCheckBefore 10324 EXPORT_PC 10325 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10326 adr lr, artMterpAsmInstructionStart + (199 * 128) // Addr of primary handler. 10327 mov x0, xSELF 10328 add x1, xFP, #OFF_FP_SHADOWFRAME 10329 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10330 10331 /* ------------------------------ */ 10332 .balign 128 10333 .L_ALT_op_mul_float_2addr: /* 0xc8 */ 10334 /* File: arm64/alt_stub.S */ 10335 /* 10336 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10337 * any interesting requests and then jump to the real instruction 10338 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10339 */ 10340 .extern MterpCheckBefore 10341 EXPORT_PC 10342 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10343 adr lr, artMterpAsmInstructionStart + (200 * 128) // Addr of primary handler. 10344 mov x0, xSELF 10345 add x1, xFP, #OFF_FP_SHADOWFRAME 10346 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10347 10348 /* ------------------------------ */ 10349 .balign 128 10350 .L_ALT_op_div_float_2addr: /* 0xc9 */ 10351 /* File: arm64/alt_stub.S */ 10352 /* 10353 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10354 * any interesting requests and then jump to the real instruction 10355 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10356 */ 10357 .extern MterpCheckBefore 10358 EXPORT_PC 10359 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10360 adr lr, artMterpAsmInstructionStart + (201 * 128) // Addr of primary handler. 10361 mov x0, xSELF 10362 add x1, xFP, #OFF_FP_SHADOWFRAME 10363 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10364 10365 /* ------------------------------ */ 10366 .balign 128 10367 .L_ALT_op_rem_float_2addr: /* 0xca */ 10368 /* File: arm64/alt_stub.S */ 10369 /* 10370 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10371 * any interesting requests and then jump to the real instruction 10372 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10373 */ 10374 .extern MterpCheckBefore 10375 EXPORT_PC 10376 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10377 adr lr, artMterpAsmInstructionStart + (202 * 128) // Addr of primary handler. 10378 mov x0, xSELF 10379 add x1, xFP, #OFF_FP_SHADOWFRAME 10380 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10381 10382 /* ------------------------------ */ 10383 .balign 128 10384 .L_ALT_op_add_double_2addr: /* 0xcb */ 10385 /* File: arm64/alt_stub.S */ 10386 /* 10387 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10388 * any interesting requests and then jump to the real instruction 10389 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10390 */ 10391 .extern MterpCheckBefore 10392 EXPORT_PC 10393 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10394 adr lr, artMterpAsmInstructionStart + (203 * 128) // Addr of primary handler. 10395 mov x0, xSELF 10396 add x1, xFP, #OFF_FP_SHADOWFRAME 10397 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10398 10399 /* ------------------------------ */ 10400 .balign 128 10401 .L_ALT_op_sub_double_2addr: /* 0xcc */ 10402 /* File: arm64/alt_stub.S */ 10403 /* 10404 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10405 * any interesting requests and then jump to the real instruction 10406 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10407 */ 10408 .extern MterpCheckBefore 10409 EXPORT_PC 10410 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10411 adr lr, artMterpAsmInstructionStart + (204 * 128) // Addr of primary handler. 10412 mov x0, xSELF 10413 add x1, xFP, #OFF_FP_SHADOWFRAME 10414 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10415 10416 /* ------------------------------ */ 10417 .balign 128 10418 .L_ALT_op_mul_double_2addr: /* 0xcd */ 10419 /* File: arm64/alt_stub.S */ 10420 /* 10421 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10422 * any interesting requests and then jump to the real instruction 10423 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10424 */ 10425 .extern MterpCheckBefore 10426 EXPORT_PC 10427 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10428 adr lr, artMterpAsmInstructionStart + (205 * 128) // Addr of primary handler. 10429 mov x0, xSELF 10430 add x1, xFP, #OFF_FP_SHADOWFRAME 10431 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10432 10433 /* ------------------------------ */ 10434 .balign 128 10435 .L_ALT_op_div_double_2addr: /* 0xce */ 10436 /* File: arm64/alt_stub.S */ 10437 /* 10438 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10439 * any interesting requests and then jump to the real instruction 10440 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10441 */ 10442 .extern MterpCheckBefore 10443 EXPORT_PC 10444 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10445 adr lr, artMterpAsmInstructionStart + (206 * 128) // Addr of primary handler. 10446 mov x0, xSELF 10447 add x1, xFP, #OFF_FP_SHADOWFRAME 10448 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10449 10450 /* ------------------------------ */ 10451 .balign 128 10452 .L_ALT_op_rem_double_2addr: /* 0xcf */ 10453 /* File: arm64/alt_stub.S */ 10454 /* 10455 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10456 * any interesting requests and then jump to the real instruction 10457 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10458 */ 10459 .extern MterpCheckBefore 10460 EXPORT_PC 10461 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10462 adr lr, artMterpAsmInstructionStart + (207 * 128) // Addr of primary handler. 10463 mov x0, xSELF 10464 add x1, xFP, #OFF_FP_SHADOWFRAME 10465 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10466 10467 /* ------------------------------ */ 10468 .balign 128 10469 .L_ALT_op_add_int_lit16: /* 0xd0 */ 10470 /* File: arm64/alt_stub.S */ 10471 /* 10472 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10473 * any interesting requests and then jump to the real instruction 10474 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10475 */ 10476 .extern MterpCheckBefore 10477 EXPORT_PC 10478 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10479 adr lr, artMterpAsmInstructionStart + (208 * 128) // Addr of primary handler. 10480 mov x0, xSELF 10481 add x1, xFP, #OFF_FP_SHADOWFRAME 10482 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10483 10484 /* ------------------------------ */ 10485 .balign 128 10486 .L_ALT_op_rsub_int: /* 0xd1 */ 10487 /* File: arm64/alt_stub.S */ 10488 /* 10489 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10490 * any interesting requests and then jump to the real instruction 10491 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10492 */ 10493 .extern MterpCheckBefore 10494 EXPORT_PC 10495 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10496 adr lr, artMterpAsmInstructionStart + (209 * 128) // Addr of primary handler. 10497 mov x0, xSELF 10498 add x1, xFP, #OFF_FP_SHADOWFRAME 10499 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10500 10501 /* ------------------------------ */ 10502 .balign 128 10503 .L_ALT_op_mul_int_lit16: /* 0xd2 */ 10504 /* File: arm64/alt_stub.S */ 10505 /* 10506 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10507 * any interesting requests and then jump to the real instruction 10508 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10509 */ 10510 .extern MterpCheckBefore 10511 EXPORT_PC 10512 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10513 adr lr, artMterpAsmInstructionStart + (210 * 128) // Addr of primary handler. 10514 mov x0, xSELF 10515 add x1, xFP, #OFF_FP_SHADOWFRAME 10516 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10517 10518 /* ------------------------------ */ 10519 .balign 128 10520 .L_ALT_op_div_int_lit16: /* 0xd3 */ 10521 /* File: arm64/alt_stub.S */ 10522 /* 10523 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10524 * any interesting requests and then jump to the real instruction 10525 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10526 */ 10527 .extern MterpCheckBefore 10528 EXPORT_PC 10529 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10530 adr lr, artMterpAsmInstructionStart + (211 * 128) // Addr of primary handler. 10531 mov x0, xSELF 10532 add x1, xFP, #OFF_FP_SHADOWFRAME 10533 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10534 10535 /* ------------------------------ */ 10536 .balign 128 10537 .L_ALT_op_rem_int_lit16: /* 0xd4 */ 10538 /* File: arm64/alt_stub.S */ 10539 /* 10540 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10541 * any interesting requests and then jump to the real instruction 10542 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10543 */ 10544 .extern MterpCheckBefore 10545 EXPORT_PC 10546 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10547 adr lr, artMterpAsmInstructionStart + (212 * 128) // Addr of primary handler. 10548 mov x0, xSELF 10549 add x1, xFP, #OFF_FP_SHADOWFRAME 10550 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10551 10552 /* ------------------------------ */ 10553 .balign 128 10554 .L_ALT_op_and_int_lit16: /* 0xd5 */ 10555 /* File: arm64/alt_stub.S */ 10556 /* 10557 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10558 * any interesting requests and then jump to the real instruction 10559 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10560 */ 10561 .extern MterpCheckBefore 10562 EXPORT_PC 10563 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10564 adr lr, artMterpAsmInstructionStart + (213 * 128) // Addr of primary handler. 10565 mov x0, xSELF 10566 add x1, xFP, #OFF_FP_SHADOWFRAME 10567 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10568 10569 /* ------------------------------ */ 10570 .balign 128 10571 .L_ALT_op_or_int_lit16: /* 0xd6 */ 10572 /* File: arm64/alt_stub.S */ 10573 /* 10574 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10575 * any interesting requests and then jump to the real instruction 10576 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10577 */ 10578 .extern MterpCheckBefore 10579 EXPORT_PC 10580 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10581 adr lr, artMterpAsmInstructionStart + (214 * 128) // Addr of primary handler. 10582 mov x0, xSELF 10583 add x1, xFP, #OFF_FP_SHADOWFRAME 10584 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10585 10586 /* ------------------------------ */ 10587 .balign 128 10588 .L_ALT_op_xor_int_lit16: /* 0xd7 */ 10589 /* File: arm64/alt_stub.S */ 10590 /* 10591 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10592 * any interesting requests and then jump to the real instruction 10593 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10594 */ 10595 .extern MterpCheckBefore 10596 EXPORT_PC 10597 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10598 adr lr, artMterpAsmInstructionStart + (215 * 128) // Addr of primary handler. 10599 mov x0, xSELF 10600 add x1, xFP, #OFF_FP_SHADOWFRAME 10601 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10602 10603 /* ------------------------------ */ 10604 .balign 128 10605 .L_ALT_op_add_int_lit8: /* 0xd8 */ 10606 /* File: arm64/alt_stub.S */ 10607 /* 10608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10609 * any interesting requests and then jump to the real instruction 10610 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10611 */ 10612 .extern MterpCheckBefore 10613 EXPORT_PC 10614 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10615 adr lr, artMterpAsmInstructionStart + (216 * 128) // Addr of primary handler. 10616 mov x0, xSELF 10617 add x1, xFP, #OFF_FP_SHADOWFRAME 10618 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10619 10620 /* ------------------------------ */ 10621 .balign 128 10622 .L_ALT_op_rsub_int_lit8: /* 0xd9 */ 10623 /* File: arm64/alt_stub.S */ 10624 /* 10625 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10626 * any interesting requests and then jump to the real instruction 10627 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10628 */ 10629 .extern MterpCheckBefore 10630 EXPORT_PC 10631 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10632 adr lr, artMterpAsmInstructionStart + (217 * 128) // Addr of primary handler. 10633 mov x0, xSELF 10634 add x1, xFP, #OFF_FP_SHADOWFRAME 10635 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10636 10637 /* ------------------------------ */ 10638 .balign 128 10639 .L_ALT_op_mul_int_lit8: /* 0xda */ 10640 /* File: arm64/alt_stub.S */ 10641 /* 10642 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10643 * any interesting requests and then jump to the real instruction 10644 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10645 */ 10646 .extern MterpCheckBefore 10647 EXPORT_PC 10648 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10649 adr lr, artMterpAsmInstructionStart + (218 * 128) // Addr of primary handler. 10650 mov x0, xSELF 10651 add x1, xFP, #OFF_FP_SHADOWFRAME 10652 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10653 10654 /* ------------------------------ */ 10655 .balign 128 10656 .L_ALT_op_div_int_lit8: /* 0xdb */ 10657 /* File: arm64/alt_stub.S */ 10658 /* 10659 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10660 * any interesting requests and then jump to the real instruction 10661 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10662 */ 10663 .extern MterpCheckBefore 10664 EXPORT_PC 10665 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10666 adr lr, artMterpAsmInstructionStart + (219 * 128) // Addr of primary handler. 10667 mov x0, xSELF 10668 add x1, xFP, #OFF_FP_SHADOWFRAME 10669 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10670 10671 /* ------------------------------ */ 10672 .balign 128 10673 .L_ALT_op_rem_int_lit8: /* 0xdc */ 10674 /* File: arm64/alt_stub.S */ 10675 /* 10676 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10677 * any interesting requests and then jump to the real instruction 10678 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10679 */ 10680 .extern MterpCheckBefore 10681 EXPORT_PC 10682 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10683 adr lr, artMterpAsmInstructionStart + (220 * 128) // Addr of primary handler. 10684 mov x0, xSELF 10685 add x1, xFP, #OFF_FP_SHADOWFRAME 10686 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10687 10688 /* ------------------------------ */ 10689 .balign 128 10690 .L_ALT_op_and_int_lit8: /* 0xdd */ 10691 /* File: arm64/alt_stub.S */ 10692 /* 10693 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10694 * any interesting requests and then jump to the real instruction 10695 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10696 */ 10697 .extern MterpCheckBefore 10698 EXPORT_PC 10699 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10700 adr lr, artMterpAsmInstructionStart + (221 * 128) // Addr of primary handler. 10701 mov x0, xSELF 10702 add x1, xFP, #OFF_FP_SHADOWFRAME 10703 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10704 10705 /* ------------------------------ */ 10706 .balign 128 10707 .L_ALT_op_or_int_lit8: /* 0xde */ 10708 /* File: arm64/alt_stub.S */ 10709 /* 10710 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10711 * any interesting requests and then jump to the real instruction 10712 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10713 */ 10714 .extern MterpCheckBefore 10715 EXPORT_PC 10716 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10717 adr lr, artMterpAsmInstructionStart + (222 * 128) // Addr of primary handler. 10718 mov x0, xSELF 10719 add x1, xFP, #OFF_FP_SHADOWFRAME 10720 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10721 10722 /* ------------------------------ */ 10723 .balign 128 10724 .L_ALT_op_xor_int_lit8: /* 0xdf */ 10725 /* File: arm64/alt_stub.S */ 10726 /* 10727 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10728 * any interesting requests and then jump to the real instruction 10729 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10730 */ 10731 .extern MterpCheckBefore 10732 EXPORT_PC 10733 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10734 adr lr, artMterpAsmInstructionStart + (223 * 128) // Addr of primary handler. 10735 mov x0, xSELF 10736 add x1, xFP, #OFF_FP_SHADOWFRAME 10737 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10738 10739 /* ------------------------------ */ 10740 .balign 128 10741 .L_ALT_op_shl_int_lit8: /* 0xe0 */ 10742 /* File: arm64/alt_stub.S */ 10743 /* 10744 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10745 * any interesting requests and then jump to the real instruction 10746 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10747 */ 10748 .extern MterpCheckBefore 10749 EXPORT_PC 10750 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10751 adr lr, artMterpAsmInstructionStart + (224 * 128) // Addr of primary handler. 10752 mov x0, xSELF 10753 add x1, xFP, #OFF_FP_SHADOWFRAME 10754 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10755 10756 /* ------------------------------ */ 10757 .balign 128 10758 .L_ALT_op_shr_int_lit8: /* 0xe1 */ 10759 /* File: arm64/alt_stub.S */ 10760 /* 10761 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10762 * any interesting requests and then jump to the real instruction 10763 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10764 */ 10765 .extern MterpCheckBefore 10766 EXPORT_PC 10767 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10768 adr lr, artMterpAsmInstructionStart + (225 * 128) // Addr of primary handler. 10769 mov x0, xSELF 10770 add x1, xFP, #OFF_FP_SHADOWFRAME 10771 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10772 10773 /* ------------------------------ */ 10774 .balign 128 10775 .L_ALT_op_ushr_int_lit8: /* 0xe2 */ 10776 /* File: arm64/alt_stub.S */ 10777 /* 10778 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10779 * any interesting requests and then jump to the real instruction 10780 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10781 */ 10782 .extern MterpCheckBefore 10783 EXPORT_PC 10784 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10785 adr lr, artMterpAsmInstructionStart + (226 * 128) // Addr of primary handler. 10786 mov x0, xSELF 10787 add x1, xFP, #OFF_FP_SHADOWFRAME 10788 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10789 10790 /* ------------------------------ */ 10791 .balign 128 10792 .L_ALT_op_iget_quick: /* 0xe3 */ 10793 /* File: arm64/alt_stub.S */ 10794 /* 10795 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10796 * any interesting requests and then jump to the real instruction 10797 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10798 */ 10799 .extern MterpCheckBefore 10800 EXPORT_PC 10801 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10802 adr lr, artMterpAsmInstructionStart + (227 * 128) // Addr of primary handler. 10803 mov x0, xSELF 10804 add x1, xFP, #OFF_FP_SHADOWFRAME 10805 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10806 10807 /* ------------------------------ */ 10808 .balign 128 10809 .L_ALT_op_iget_wide_quick: /* 0xe4 */ 10810 /* File: arm64/alt_stub.S */ 10811 /* 10812 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10813 * any interesting requests and then jump to the real instruction 10814 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10815 */ 10816 .extern MterpCheckBefore 10817 EXPORT_PC 10818 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10819 adr lr, artMterpAsmInstructionStart + (228 * 128) // Addr of primary handler. 10820 mov x0, xSELF 10821 add x1, xFP, #OFF_FP_SHADOWFRAME 10822 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10823 10824 /* ------------------------------ */ 10825 .balign 128 10826 .L_ALT_op_iget_object_quick: /* 0xe5 */ 10827 /* File: arm64/alt_stub.S */ 10828 /* 10829 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10830 * any interesting requests and then jump to the real instruction 10831 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10832 */ 10833 .extern MterpCheckBefore 10834 EXPORT_PC 10835 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10836 adr lr, artMterpAsmInstructionStart + (229 * 128) // Addr of primary handler. 10837 mov x0, xSELF 10838 add x1, xFP, #OFF_FP_SHADOWFRAME 10839 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10840 10841 /* ------------------------------ */ 10842 .balign 128 10843 .L_ALT_op_iput_quick: /* 0xe6 */ 10844 /* File: arm64/alt_stub.S */ 10845 /* 10846 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10847 * any interesting requests and then jump to the real instruction 10848 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10849 */ 10850 .extern MterpCheckBefore 10851 EXPORT_PC 10852 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10853 adr lr, artMterpAsmInstructionStart + (230 * 128) // Addr of primary handler. 10854 mov x0, xSELF 10855 add x1, xFP, #OFF_FP_SHADOWFRAME 10856 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10857 10858 /* ------------------------------ */ 10859 .balign 128 10860 .L_ALT_op_iput_wide_quick: /* 0xe7 */ 10861 /* File: arm64/alt_stub.S */ 10862 /* 10863 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10864 * any interesting requests and then jump to the real instruction 10865 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10866 */ 10867 .extern MterpCheckBefore 10868 EXPORT_PC 10869 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10870 adr lr, artMterpAsmInstructionStart + (231 * 128) // Addr of primary handler. 10871 mov x0, xSELF 10872 add x1, xFP, #OFF_FP_SHADOWFRAME 10873 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10874 10875 /* ------------------------------ */ 10876 .balign 128 10877 .L_ALT_op_iput_object_quick: /* 0xe8 */ 10878 /* File: arm64/alt_stub.S */ 10879 /* 10880 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10881 * any interesting requests and then jump to the real instruction 10882 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10883 */ 10884 .extern MterpCheckBefore 10885 EXPORT_PC 10886 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10887 adr lr, artMterpAsmInstructionStart + (232 * 128) // Addr of primary handler. 10888 mov x0, xSELF 10889 add x1, xFP, #OFF_FP_SHADOWFRAME 10890 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10891 10892 /* ------------------------------ */ 10893 .balign 128 10894 .L_ALT_op_invoke_virtual_quick: /* 0xe9 */ 10895 /* File: arm64/alt_stub.S */ 10896 /* 10897 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10898 * any interesting requests and then jump to the real instruction 10899 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10900 */ 10901 .extern MterpCheckBefore 10902 EXPORT_PC 10903 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10904 adr lr, artMterpAsmInstructionStart + (233 * 128) // Addr of primary handler. 10905 mov x0, xSELF 10906 add x1, xFP, #OFF_FP_SHADOWFRAME 10907 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10908 10909 /* ------------------------------ */ 10910 .balign 128 10911 .L_ALT_op_invoke_virtual_range_quick: /* 0xea */ 10912 /* File: arm64/alt_stub.S */ 10913 /* 10914 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10915 * any interesting requests and then jump to the real instruction 10916 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10917 */ 10918 .extern MterpCheckBefore 10919 EXPORT_PC 10920 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10921 adr lr, artMterpAsmInstructionStart + (234 * 128) // Addr of primary handler. 10922 mov x0, xSELF 10923 add x1, xFP, #OFF_FP_SHADOWFRAME 10924 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10925 10926 /* ------------------------------ */ 10927 .balign 128 10928 .L_ALT_op_iput_boolean_quick: /* 0xeb */ 10929 /* File: arm64/alt_stub.S */ 10930 /* 10931 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10932 * any interesting requests and then jump to the real instruction 10933 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10934 */ 10935 .extern MterpCheckBefore 10936 EXPORT_PC 10937 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10938 adr lr, artMterpAsmInstructionStart + (235 * 128) // Addr of primary handler. 10939 mov x0, xSELF 10940 add x1, xFP, #OFF_FP_SHADOWFRAME 10941 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10942 10943 /* ------------------------------ */ 10944 .balign 128 10945 .L_ALT_op_iput_byte_quick: /* 0xec */ 10946 /* File: arm64/alt_stub.S */ 10947 /* 10948 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10949 * any interesting requests and then jump to the real instruction 10950 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10951 */ 10952 .extern MterpCheckBefore 10953 EXPORT_PC 10954 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10955 adr lr, artMterpAsmInstructionStart + (236 * 128) // Addr of primary handler. 10956 mov x0, xSELF 10957 add x1, xFP, #OFF_FP_SHADOWFRAME 10958 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10959 10960 /* ------------------------------ */ 10961 .balign 128 10962 .L_ALT_op_iput_char_quick: /* 0xed */ 10963 /* File: arm64/alt_stub.S */ 10964 /* 10965 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10966 * any interesting requests and then jump to the real instruction 10967 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10968 */ 10969 .extern MterpCheckBefore 10970 EXPORT_PC 10971 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10972 adr lr, artMterpAsmInstructionStart + (237 * 128) // Addr of primary handler. 10973 mov x0, xSELF 10974 add x1, xFP, #OFF_FP_SHADOWFRAME 10975 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10976 10977 /* ------------------------------ */ 10978 .balign 128 10979 .L_ALT_op_iput_short_quick: /* 0xee */ 10980 /* File: arm64/alt_stub.S */ 10981 /* 10982 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10983 * any interesting requests and then jump to the real instruction 10984 * handler. Note that the call to MterpCheckBefore is done as a tail call. 10985 */ 10986 .extern MterpCheckBefore 10987 EXPORT_PC 10988 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 10989 adr lr, artMterpAsmInstructionStart + (238 * 128) // Addr of primary handler. 10990 mov x0, xSELF 10991 add x1, xFP, #OFF_FP_SHADOWFRAME 10992 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 10993 10994 /* ------------------------------ */ 10995 .balign 128 10996 .L_ALT_op_iget_boolean_quick: /* 0xef */ 10997 /* File: arm64/alt_stub.S */ 10998 /* 10999 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11000 * any interesting requests and then jump to the real instruction 11001 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11002 */ 11003 .extern MterpCheckBefore 11004 EXPORT_PC 11005 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11006 adr lr, artMterpAsmInstructionStart + (239 * 128) // Addr of primary handler. 11007 mov x0, xSELF 11008 add x1, xFP, #OFF_FP_SHADOWFRAME 11009 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11010 11011 /* ------------------------------ */ 11012 .balign 128 11013 .L_ALT_op_iget_byte_quick: /* 0xf0 */ 11014 /* File: arm64/alt_stub.S */ 11015 /* 11016 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11017 * any interesting requests and then jump to the real instruction 11018 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11019 */ 11020 .extern MterpCheckBefore 11021 EXPORT_PC 11022 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11023 adr lr, artMterpAsmInstructionStart + (240 * 128) // Addr of primary handler. 11024 mov x0, xSELF 11025 add x1, xFP, #OFF_FP_SHADOWFRAME 11026 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11027 11028 /* ------------------------------ */ 11029 .balign 128 11030 .L_ALT_op_iget_char_quick: /* 0xf1 */ 11031 /* File: arm64/alt_stub.S */ 11032 /* 11033 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11034 * any interesting requests and then jump to the real instruction 11035 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11036 */ 11037 .extern MterpCheckBefore 11038 EXPORT_PC 11039 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11040 adr lr, artMterpAsmInstructionStart + (241 * 128) // Addr of primary handler. 11041 mov x0, xSELF 11042 add x1, xFP, #OFF_FP_SHADOWFRAME 11043 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11044 11045 /* ------------------------------ */ 11046 .balign 128 11047 .L_ALT_op_iget_short_quick: /* 0xf2 */ 11048 /* File: arm64/alt_stub.S */ 11049 /* 11050 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11051 * any interesting requests and then jump to the real instruction 11052 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11053 */ 11054 .extern MterpCheckBefore 11055 EXPORT_PC 11056 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11057 adr lr, artMterpAsmInstructionStart + (242 * 128) // Addr of primary handler. 11058 mov x0, xSELF 11059 add x1, xFP, #OFF_FP_SHADOWFRAME 11060 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11061 11062 /* ------------------------------ */ 11063 .balign 128 11064 .L_ALT_op_invoke_lambda: /* 0xf3 */ 11065 /* File: arm64/alt_stub.S */ 11066 /* 11067 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11068 * any interesting requests and then jump to the real instruction 11069 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11070 */ 11071 .extern MterpCheckBefore 11072 EXPORT_PC 11073 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11074 adr lr, artMterpAsmInstructionStart + (243 * 128) // Addr of primary handler. 11075 mov x0, xSELF 11076 add x1, xFP, #OFF_FP_SHADOWFRAME 11077 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11078 11079 /* ------------------------------ */ 11080 .balign 128 11081 .L_ALT_op_unused_f4: /* 0xf4 */ 11082 /* File: arm64/alt_stub.S */ 11083 /* 11084 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11085 * any interesting requests and then jump to the real instruction 11086 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11087 */ 11088 .extern MterpCheckBefore 11089 EXPORT_PC 11090 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11091 adr lr, artMterpAsmInstructionStart + (244 * 128) // Addr of primary handler. 11092 mov x0, xSELF 11093 add x1, xFP, #OFF_FP_SHADOWFRAME 11094 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11095 11096 /* ------------------------------ */ 11097 .balign 128 11098 .L_ALT_op_capture_variable: /* 0xf5 */ 11099 /* File: arm64/alt_stub.S */ 11100 /* 11101 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11102 * any interesting requests and then jump to the real instruction 11103 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11104 */ 11105 .extern MterpCheckBefore 11106 EXPORT_PC 11107 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11108 adr lr, artMterpAsmInstructionStart + (245 * 128) // Addr of primary handler. 11109 mov x0, xSELF 11110 add x1, xFP, #OFF_FP_SHADOWFRAME 11111 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11112 11113 /* ------------------------------ */ 11114 .balign 128 11115 .L_ALT_op_create_lambda: /* 0xf6 */ 11116 /* File: arm64/alt_stub.S */ 11117 /* 11118 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11119 * any interesting requests and then jump to the real instruction 11120 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11121 */ 11122 .extern MterpCheckBefore 11123 EXPORT_PC 11124 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11125 adr lr, artMterpAsmInstructionStart + (246 * 128) // Addr of primary handler. 11126 mov x0, xSELF 11127 add x1, xFP, #OFF_FP_SHADOWFRAME 11128 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11129 11130 /* ------------------------------ */ 11131 .balign 128 11132 .L_ALT_op_liberate_variable: /* 0xf7 */ 11133 /* File: arm64/alt_stub.S */ 11134 /* 11135 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11136 * any interesting requests and then jump to the real instruction 11137 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11138 */ 11139 .extern MterpCheckBefore 11140 EXPORT_PC 11141 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11142 adr lr, artMterpAsmInstructionStart + (247 * 128) // Addr of primary handler. 11143 mov x0, xSELF 11144 add x1, xFP, #OFF_FP_SHADOWFRAME 11145 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11146 11147 /* ------------------------------ */ 11148 .balign 128 11149 .L_ALT_op_box_lambda: /* 0xf8 */ 11150 /* File: arm64/alt_stub.S */ 11151 /* 11152 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11153 * any interesting requests and then jump to the real instruction 11154 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11155 */ 11156 .extern MterpCheckBefore 11157 EXPORT_PC 11158 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11159 adr lr, artMterpAsmInstructionStart + (248 * 128) // Addr of primary handler. 11160 mov x0, xSELF 11161 add x1, xFP, #OFF_FP_SHADOWFRAME 11162 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11163 11164 /* ------------------------------ */ 11165 .balign 128 11166 .L_ALT_op_unbox_lambda: /* 0xf9 */ 11167 /* File: arm64/alt_stub.S */ 11168 /* 11169 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11170 * any interesting requests and then jump to the real instruction 11171 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11172 */ 11173 .extern MterpCheckBefore 11174 EXPORT_PC 11175 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11176 adr lr, artMterpAsmInstructionStart + (249 * 128) // Addr of primary handler. 11177 mov x0, xSELF 11178 add x1, xFP, #OFF_FP_SHADOWFRAME 11179 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11180 11181 /* ------------------------------ */ 11182 .balign 128 11183 .L_ALT_op_unused_fa: /* 0xfa */ 11184 /* File: arm64/alt_stub.S */ 11185 /* 11186 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11187 * any interesting requests and then jump to the real instruction 11188 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11189 */ 11190 .extern MterpCheckBefore 11191 EXPORT_PC 11192 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11193 adr lr, artMterpAsmInstructionStart + (250 * 128) // Addr of primary handler. 11194 mov x0, xSELF 11195 add x1, xFP, #OFF_FP_SHADOWFRAME 11196 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11197 11198 /* ------------------------------ */ 11199 .balign 128 11200 .L_ALT_op_unused_fb: /* 0xfb */ 11201 /* File: arm64/alt_stub.S */ 11202 /* 11203 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11204 * any interesting requests and then jump to the real instruction 11205 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11206 */ 11207 .extern MterpCheckBefore 11208 EXPORT_PC 11209 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11210 adr lr, artMterpAsmInstructionStart + (251 * 128) // Addr of primary handler. 11211 mov x0, xSELF 11212 add x1, xFP, #OFF_FP_SHADOWFRAME 11213 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11214 11215 /* ------------------------------ */ 11216 .balign 128 11217 .L_ALT_op_unused_fc: /* 0xfc */ 11218 /* File: arm64/alt_stub.S */ 11219 /* 11220 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11221 * any interesting requests and then jump to the real instruction 11222 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11223 */ 11224 .extern MterpCheckBefore 11225 EXPORT_PC 11226 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11227 adr lr, artMterpAsmInstructionStart + (252 * 128) // Addr of primary handler. 11228 mov x0, xSELF 11229 add x1, xFP, #OFF_FP_SHADOWFRAME 11230 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11231 11232 /* ------------------------------ */ 11233 .balign 128 11234 .L_ALT_op_unused_fd: /* 0xfd */ 11235 /* File: arm64/alt_stub.S */ 11236 /* 11237 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11238 * any interesting requests and then jump to the real instruction 11239 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11240 */ 11241 .extern MterpCheckBefore 11242 EXPORT_PC 11243 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11244 adr lr, artMterpAsmInstructionStart + (253 * 128) // Addr of primary handler. 11245 mov x0, xSELF 11246 add x1, xFP, #OFF_FP_SHADOWFRAME 11247 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11248 11249 /* ------------------------------ */ 11250 .balign 128 11251 .L_ALT_op_unused_fe: /* 0xfe */ 11252 /* File: arm64/alt_stub.S */ 11253 /* 11254 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11255 * any interesting requests and then jump to the real instruction 11256 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11257 */ 11258 .extern MterpCheckBefore 11259 EXPORT_PC 11260 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11261 adr lr, artMterpAsmInstructionStart + (254 * 128) // Addr of primary handler. 11262 mov x0, xSELF 11263 add x1, xFP, #OFF_FP_SHADOWFRAME 11264 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11265 11266 /* ------------------------------ */ 11267 .balign 128 11268 .L_ALT_op_unused_ff: /* 0xff */ 11269 /* File: arm64/alt_stub.S */ 11270 /* 11271 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11272 * any interesting requests and then jump to the real instruction 11273 * handler. Note that the call to MterpCheckBefore is done as a tail call. 11274 */ 11275 .extern MterpCheckBefore 11276 EXPORT_PC 11277 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE. 11278 adr lr, artMterpAsmInstructionStart + (255 * 128) // Addr of primary handler. 11279 mov x0, xSELF 11280 add x1, xFP, #OFF_FP_SHADOWFRAME 11281 b MterpCheckBefore // (self, shadow_frame) Note: tail call. 11282 11283 .balign 128 11284 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart 11285 .global artMterpAsmAltInstructionEnd 11286 artMterpAsmAltInstructionEnd: 11287 /* File: arm64/footer.S */ 11288 /* 11289 * =========================================================================== 11290 * Common subroutines and data 11291 * =========================================================================== 11292 */ 11293 11294 11295 /* 11296 * We've detected a condition that will result in an exception, but the exception 11297 * has not yet been thrown. Just bail out to the reference interpreter to deal with it. 11298 * TUNING: for consistency, we may want to just go ahead and handle these here. 11299 */ 11300 common_errDivideByZero: 11301 EXPORT_PC 11302 #if MTERP_LOGGING 11303 mov x0, xSELF 11304 add x1, xFP, #OFF_FP_SHADOWFRAME 11305 bl MterpLogDivideByZeroException 11306 #endif 11307 b MterpCommonFallback 11308 11309 common_errArrayIndex: 11310 EXPORT_PC 11311 #if MTERP_LOGGING 11312 mov x0, xSELF 11313 add x1, xFP, #OFF_FP_SHADOWFRAME 11314 bl MterpLogArrayIndexException 11315 #endif 11316 b MterpCommonFallback 11317 11318 common_errNegativeArraySize: 11319 EXPORT_PC 11320 #if MTERP_LOGGING 11321 mov x0, xSELF 11322 add x1, xFP, #OFF_FP_SHADOWFRAME 11323 bl MterpLogNegativeArraySizeException 11324 #endif 11325 b MterpCommonFallback 11326 11327 common_errNoSuchMethod: 11328 EXPORT_PC 11329 #if MTERP_LOGGING 11330 mov x0, xSELF 11331 add x1, xFP, #OFF_FP_SHADOWFRAME 11332 bl MterpLogNoSuchMethodException 11333 #endif 11334 b MterpCommonFallback 11335 11336 common_errNullObject: 11337 EXPORT_PC 11338 #if MTERP_LOGGING 11339 mov x0, xSELF 11340 add x1, xFP, #OFF_FP_SHADOWFRAME 11341 bl MterpLogNullObjectException 11342 #endif 11343 b MterpCommonFallback 11344 11345 common_exceptionThrown: 11346 EXPORT_PC 11347 #if MTERP_LOGGING 11348 mov x0, xSELF 11349 add x1, xFP, #OFF_FP_SHADOWFRAME 11350 bl MterpLogExceptionThrownException 11351 #endif 11352 b MterpCommonFallback 11353 11354 MterpSuspendFallback: 11355 EXPORT_PC 11356 #if MTERP_LOGGING 11357 mov x0, xSELF 11358 add x1, xFP, #OFF_FP_SHADOWFRAME 11359 ldr x2, [xSELF, #THREAD_FLAGS_OFFSET] 11360 bl MterpLogSuspendFallback 11361 #endif 11362 b MterpCommonFallback 11363 11364 /* 11365 * If we're here, something is out of the ordinary. If there is a pending 11366 * exception, handle it. Otherwise, roll back and retry with the reference 11367 * interpreter. 11368 */ 11369 MterpPossibleException: 11370 ldr x0, [xSELF, #THREAD_EXCEPTION_OFFSET] 11371 cbz x0, MterpFallback // If not, fall back to reference interpreter. 11372 /* intentional fallthrough - handle pending exception. */ 11373 /* 11374 * On return from a runtime helper routine, we've found a pending exception. 11375 * Can we handle it here - or need to bail out to caller? 11376 * 11377 */ 11378 MterpException: 11379 mov x0, xSELF 11380 add x1, xFP, #OFF_FP_SHADOWFRAME 11381 bl MterpHandleException // (self, shadow_frame) 11382 cbz w0, MterpExceptionReturn // no local catch, back to caller. 11383 ldr x0, [xFP, #OFF_FP_CODE_ITEM] 11384 ldr w1, [xFP, #OFF_FP_DEX_PC] 11385 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] 11386 add xPC, x0, #CODEITEM_INSNS_OFFSET 11387 add xPC, xPC, x1, lsl #1 // generate new dex_pc_ptr 11388 /* Do we need to switch interpreters? */ 11389 bl MterpShouldSwitchInterpreters 11390 cbnz w0, MterpFallback 11391 /* resume execution at catch block */ 11392 EXPORT_PC 11393 FETCH_INST 11394 GET_INST_OPCODE ip 11395 GOTO_OPCODE ip 11396 /* NOTE: no fallthrough */ 11397 /* 11398 * Common handling for branches with support for Jit profiling. 11399 * On entry: 11400 * wINST <= signed offset 11401 * wPROFILE <= signed hotness countdown (expanded to 32 bits) 11402 * condition bits <= set to establish sign of offset (use "NoFlags" entry if not) 11403 * 11404 * We have quite a few different cases for branch profiling, OSR detection and 11405 * suspend check support here. 11406 * 11407 * Taken backward branches: 11408 * If profiling active, do hotness countdown and report if we hit zero. 11409 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so. 11410 * Is there a pending suspend request? If so, suspend. 11411 * 11412 * Taken forward branches and not-taken backward branches: 11413 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so. 11414 * 11415 * Our most common case is expected to be a taken backward branch with active jit profiling, 11416 * but no full OSR check and no pending suspend request. 11417 * Next most common case is not-taken branch with no full OSR check. 11418 * 11419 */ 11420 MterpCommonTakenBranchNoFlags: 11421 cmp wINST, #0 11422 b.gt .L_forward_branch // don't add forward branches to hotness 11423 tbnz wPROFILE, #31, .L_no_count_backwards // go if negative 11424 subs wPROFILE, wPROFILE, #1 // countdown 11425 b.eq .L_add_batch // counted down to zero - report 11426 .L_resume_backward_branch: 11427 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET] 11428 add w2, wINST, wINST // w2<- byte offset 11429 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST 11430 REFRESH_IBASE 11431 ands lr, lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST) 11432 b.ne .L_suspend_request_pending 11433 GET_INST_OPCODE ip // extract opcode from wINST 11434 GOTO_OPCODE ip // jump to next instruction 11435 11436 .L_suspend_request_pending: 11437 EXPORT_PC 11438 mov x0, xSELF 11439 bl MterpSuspendCheck // (self) 11440 cbnz x0, MterpFallback 11441 REFRESH_IBASE // might have changed during suspend 11442 GET_INST_OPCODE ip // extract opcode from wINST 11443 GOTO_OPCODE ip // jump to next instruction 11444 11445 .L_no_count_backwards: 11446 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry? 11447 b.ne .L_resume_backward_branch 11448 mov x0, xSELF 11449 add x1, xFP, #OFF_FP_SHADOWFRAME 11450 mov x2, xINST 11451 EXPORT_PC 11452 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset) 11453 cbnz x0, MterpOnStackReplacement 11454 b .L_resume_backward_branch 11455 11456 .L_forward_branch: 11457 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry? 11458 b.eq .L_check_osr_forward 11459 .L_resume_forward_branch: 11460 add w2, wINST, wINST // w2<- byte offset 11461 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST 11462 GET_INST_OPCODE ip // extract opcode from wINST 11463 GOTO_OPCODE ip // jump to next instruction 11464 11465 .L_check_osr_forward: 11466 mov x0, xSELF 11467 add x1, xFP, #OFF_FP_SHADOWFRAME 11468 mov x2, xINST 11469 EXPORT_PC 11470 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset) 11471 cbnz x0, MterpOnStackReplacement 11472 b .L_resume_forward_branch 11473 11474 .L_add_batch: 11475 add x1, xFP, #OFF_FP_SHADOWFRAME 11476 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET] 11477 ldr x0, [xFP, #OFF_FP_METHOD] 11478 mov x2, xSELF 11479 bl MterpAddHotnessBatch // (method, shadow_frame, self) 11480 mov wPROFILE, w0 // restore new hotness countdown to wPROFILE 11481 b .L_no_count_backwards 11482 11483 /* 11484 * Entered from the conditional branch handlers when OSR check request active on 11485 * not-taken path. All Dalvik not-taken conditional branch offsets are 2. 11486 */ 11487 .L_check_not_taken_osr: 11488 mov x0, xSELF 11489 add x1, xFP, #OFF_FP_SHADOWFRAME 11490 mov x2, #2 11491 EXPORT_PC 11492 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset) 11493 cbnz x0, MterpOnStackReplacement 11494 FETCH_ADVANCE_INST 2 11495 GET_INST_OPCODE ip // extract opcode from wINST 11496 GOTO_OPCODE ip // jump to next instruction 11497 11498 11499 /* 11500 * Check for suspend check request. Assumes wINST already loaded, xPC advanced and 11501 * still needs to get the opcode and branch to it, and flags are in lr. 11502 */ 11503 MterpCheckSuspendAndContinue: 11504 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh xIBASE 11505 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST) 11506 b.ne check1 11507 GET_INST_OPCODE ip // extract opcode from wINST 11508 GOTO_OPCODE ip // jump to next instruction 11509 check1: 11510 EXPORT_PC 11511 mov x0, xSELF 11512 bl MterpSuspendCheck // (self) 11513 cbnz x0, MterpFallback // Something in the environment changed, switch interpreters 11514 GET_INST_OPCODE ip // extract opcode from wINST 11515 GOTO_OPCODE ip // jump to next instruction 11516 11517 /* 11518 * On-stack replacement has happened, and now we've returned from the compiled method. 11519 */ 11520 MterpOnStackReplacement: 11521 #if MTERP_LOGGING 11522 mov x0, xSELF 11523 add x1, xFP, #OFF_FP_SHADOWFRAME 11524 sbfm x2, xINST, 0, 31 11525 bl MterpLogOSR 11526 #endif 11527 mov x0, #1 // Signal normal return 11528 b MterpDone 11529 11530 /* 11531 * Bail out to reference interpreter. 11532 */ 11533 MterpFallback: 11534 EXPORT_PC 11535 #if MTERP_LOGGING 11536 mov x0, xSELF 11537 add x1, xFP, #OFF_FP_SHADOWFRAME 11538 bl MterpLogFallback 11539 #endif 11540 MterpCommonFallback: 11541 mov x0, #0 // signal retry with reference interpreter. 11542 b MterpDone 11543 11544 /* 11545 * We pushed some registers on the stack in ExecuteMterpImpl, then saved 11546 * SP and LR. Here we restore SP, restore the registers, and then restore 11547 * LR to PC. 11548 * 11549 * On entry: 11550 * uint32_t* xFP (should still be live, pointer to base of vregs) 11551 */ 11552 MterpExceptionReturn: 11553 mov x0, #1 // signal return to caller. 11554 b MterpDone 11555 MterpReturn: 11556 ldr x2, [xFP, #OFF_FP_RESULT_REGISTER] 11557 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET] 11558 str x0, [x2] 11559 mov x0, xSELF 11560 ands lr, lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST) 11561 b.eq check2 11562 bl MterpSuspendCheck // (self) 11563 check2: 11564 mov x0, #1 // signal return to caller. 11565 MterpDone: 11566 /* 11567 * At this point, we expect wPROFILE to be non-zero. If negative, hotness is disabled or we're 11568 * checking for OSR. If greater than zero, we might have unreported hotness to register 11569 * (the difference between the ending wPROFILE and the cached hotness counter). wPROFILE 11570 * should only reach zero immediately after a hotness decrement, and is then reset to either 11571 * a negative special state or the new non-zero countdown value. 11572 */ 11573 cmp wPROFILE, #0 11574 bgt MterpProfileActive // if > 0, we may have some counts to report. 11575 ldp fp, lr, [sp, #64] 11576 ldp xPC, xFP, [sp, #48] 11577 ldp xSELF, xINST, [sp, #32] 11578 ldp xIBASE, xREFS, [sp, #16] 11579 ldp xPROFILE, x27, [sp], #80 11580 ret 11581 11582 MterpProfileActive: 11583 mov xINST, x0 // stash return value 11584 /* Report cached hotness counts */ 11585 ldr x0, [xFP, #OFF_FP_METHOD] 11586 add x1, xFP, #OFF_FP_SHADOWFRAME 11587 mov x2, xSELF 11588 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET] 11589 bl MterpAddHotnessBatch // (method, shadow_frame, self) 11590 mov x0, xINST // restore return value 11591 ldp fp, lr, [sp, #64] 11592 ldp xPC, xFP, [sp, #48] 11593 ldp xSELF, xINST, [sp, #32] 11594 ldp xIBASE, xREFS, [sp, #16] 11595 ldp xPROFILE, x27, [sp], #80 11596 ret 11597 11598 .cfi_endproc 11599 .size ExecuteMterpImpl, .-ExecuteMterpImpl 11600 11601 11602