1 /* 2 * This file was generated automatically by gen-mterp.py for 'x86_64'. 3 * 4 * --> DO NOT EDIT <-- 5 */ 6 7 /* File: x86_64/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 rFP 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 rFP & 37 number_of_vregs_. 38 39 */ 40 41 /* 42 x86_64 ABI general notes: 43 44 Caller save set: 45 rax, rdx, rcx, rsi, rdi, r8-r11, st(0)-st(7) 46 Callee save set: 47 rbx, rbp, r12-r15 48 Return regs: 49 32-bit in eax 50 64-bit in rax 51 fp on xmm0 52 53 First 8 fp parameters came in xmm0-xmm7. 54 First 6 non-fp parameters came in rdi, rsi, rdx, rcx, r8, r9. 55 Other parameters passed on stack, pushed right-to-left. On entry to target, first 56 param is at 8(%esp). Traditional entry code is: 57 58 Stack must be 16-byte aligned to support SSE in native code. 59 60 If we're not doing variable stack allocation (alloca), the frame pointer can be 61 eliminated and all arg references adjusted to be esp relative. 62 */ 63 64 /* 65 Mterp and x86_64 notes: 66 67 Some key interpreter variables will be assigned to registers. 68 69 nick reg purpose 70 rPROFILE rbp countdown register for jit profiling 71 rPC r12 interpreted program counter, used for fetching instructions 72 rFP r13 interpreted frame pointer, used for accessing locals and args 73 rINSTw bx first 16-bit code of current instruction 74 rINSTbl bl opcode portion of instruction word 75 rINSTbh bh high byte of inst word, usually contains src/tgt reg names 76 rIBASE r14 base of instruction handler table 77 rREFS r15 base of object references in shadow frame. 78 79 Notes: 80 o High order 16 bits of ebx must be zero on entry to handler 81 o rPC, rFP, rINSTw/rINSTbl valid on handler entry and exit 82 o eax and ecx are scratch, rINSTw/ebx sometimes scratch 83 84 Macros are provided for common operations. Each macro MUST emit only 85 one instruction to make instruction-counting easier. They MUST NOT alter 86 unspecified registers or condition codes. 87 */ 88 89 /* 90 * This is a #include, not a %include, because we want the C pre-processor 91 * to expand the macros into assembler assignment statements. 92 */ 93 #include "asm_support.h" 94 #include "interpreter/cfi_asm_support.h" 95 96 /* 97 * Handle mac compiler specific 98 */ 99 #if defined(__APPLE__) 100 #define MACRO_LITERAL(value) $(value) 101 #define FUNCTION_TYPE(name) 102 #define SIZE(start,end) 103 // Mac OS' symbols have an _ prefix. 104 #define SYMBOL(name) _ ## name 105 #else 106 #define MACRO_LITERAL(value) $value 107 #define FUNCTION_TYPE(name) .type name, @function 108 #define SIZE(start,end) .size start, .-end 109 #define SYMBOL(name) name 110 #endif 111 112 .macro PUSH _reg 113 pushq \_reg 114 .cfi_adjust_cfa_offset 8 115 .cfi_rel_offset \_reg, 0 116 .endm 117 118 .macro POP _reg 119 popq \_reg 120 .cfi_adjust_cfa_offset -8 121 .cfi_restore \_reg 122 .endm 123 124 /* 125 * Instead of holding a pointer to the shadow frame, we keep rFP at the base of the vregs. So, 126 * to access other shadow frame fields, we need to use a backwards offset. Define those here. 127 */ 128 #define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET) 129 #define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET) 130 #define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET) 131 #define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET) 132 #define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET) 133 #define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET) 134 #define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET) 135 #define OFF_FP_DEX_INSTRUCTIONS OFF_FP(SHADOWFRAME_DEX_INSTRUCTIONS_OFFSET) 136 #define OFF_FP_COUNTDOWN_OFFSET OFF_FP(SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET) 137 #define OFF_FP_SHADOWFRAME (-SHADOWFRAME_VREGS_OFFSET) 138 139 /* Frame size must be 16-byte aligned. 140 * Remember about 8 bytes for return address + 6 * 8 for spills. 141 */ 142 #define FRAME_SIZE 8 143 144 /* Frame diagram while executing ExecuteMterpImpl, high to low addresses */ 145 #define IN_ARG3 %rcx 146 #define IN_ARG2 %rdx 147 #define IN_ARG1 %rsi 148 #define IN_ARG0 %rdi 149 /* Spill offsets relative to %esp */ 150 #define SELF_SPILL (FRAME_SIZE - 8) 151 /* Out Args */ 152 #define OUT_ARG3 %rcx 153 #define OUT_ARG2 %rdx 154 #define OUT_ARG1 %rsi 155 #define OUT_ARG0 %rdi 156 #define OUT_32_ARG3 %ecx 157 #define OUT_32_ARG2 %edx 158 #define OUT_32_ARG1 %esi 159 #define OUT_32_ARG0 %edi 160 #define OUT_FP_ARG1 %xmm1 161 #define OUT_FP_ARG0 %xmm0 162 163 /* During bringup, we'll use the shadow frame model instead of rFP */ 164 /* single-purpose registers, given names for clarity */ 165 #define rSELF SELF_SPILL(%rsp) 166 #define rPC %r12 167 #define CFI_DEX 12 // DWARF register number of the register holding dex-pc (rPC). 168 #define CFI_TMP 5 // DWARF register number of the first argument register (rdi). 169 #define rFP %r13 170 #define rINST %ebx 171 #define rINSTq %rbx 172 #define rINSTw %bx 173 #define rINSTbh %bh 174 #define rINSTbl %bl 175 #define rIBASE %r14 176 #define rREFS %r15 177 #define rPROFILE %ebp 178 179 #define MTERP_LOGGING 0 180 181 /* 182 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects. Must 183 * be done *before* something throws. 184 * 185 * It's okay to do this more than once. 186 * 187 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped 188 * dex byte codes. However, the rest of the runtime expects dex pc to be an instruction 189 * offset into the code_items_[] array. For effiency, we will "export" the 190 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC 191 * to convert to a dex pc when needed. 192 */ 193 .macro EXPORT_PC 194 movq rPC, OFF_FP_DEX_PC_PTR(rFP) 195 .endm 196 197 /* 198 * Refresh handler table. 199 * IBase handles uses the caller save register so we must restore it after each call. 200 * Also it is used as a result of some 64-bit operations (like imul) and we should 201 * restore it in such cases also. 202 * 203 */ 204 .macro REFRESH_IBASE_REG self_reg 205 movq THREAD_CURRENT_IBASE_OFFSET(\self_reg), rIBASE 206 .endm 207 .macro REFRESH_IBASE 208 movq rSELF, rIBASE 209 REFRESH_IBASE_REG rIBASE 210 .endm 211 212 /* 213 * Refresh rINST. 214 * At enter to handler rINST does not contain the opcode number. 215 * However some utilities require the full value, so this macro 216 * restores the opcode number. 217 */ 218 .macro REFRESH_INST _opnum 219 movb rINSTbl, rINSTbh 220 movb $\_opnum, rINSTbl 221 .endm 222 223 /* 224 * Fetch the next instruction from rPC into rINSTw. Does not advance rPC. 225 */ 226 .macro FETCH_INST 227 movzwq (rPC), rINSTq 228 .endm 229 230 /* 231 * Remove opcode from rINST, compute the address of handler and jump to it. 232 */ 233 .macro GOTO_NEXT 234 movzx rINSTbl,%eax 235 movzbl rINSTbh,rINST 236 shll MACRO_LITERAL(7), %eax 237 addq rIBASE, %rax 238 jmp *%rax 239 .endm 240 241 /* 242 * Advance rPC by instruction count. 243 */ 244 .macro ADVANCE_PC _count 245 leaq 2*\_count(rPC), rPC 246 .endm 247 248 /* 249 * Advance rPC by instruction count, fetch instruction and jump to handler. 250 */ 251 .macro ADVANCE_PC_FETCH_AND_GOTO_NEXT _count 252 ADVANCE_PC \_count 253 FETCH_INST 254 GOTO_NEXT 255 .endm 256 257 /* 258 * Get/set the 32-bit value from a Dalvik register. 259 */ 260 #define VREG_ADDRESS(_vreg) (rFP,_vreg,4) 261 #define VREG_REF_ADDRESS(_vreg) (rREFS,_vreg,4) 262 263 .macro GET_VREG _reg _vreg 264 movl (rFP,\_vreg,4), \_reg 265 .endm 266 267 /* Read wide value. */ 268 .macro GET_WIDE_VREG _reg _vreg 269 movq (rFP,\_vreg,4), \_reg 270 .endm 271 272 .macro SET_VREG _reg _vreg 273 movl \_reg, (rFP,\_vreg,4) 274 movl MACRO_LITERAL(0), (rREFS,\_vreg,4) 275 .endm 276 277 /* Write wide value. reg is clobbered. */ 278 .macro SET_WIDE_VREG _reg _vreg 279 movq \_reg, (rFP,\_vreg,4) 280 xorq \_reg, \_reg 281 movq \_reg, (rREFS,\_vreg,4) 282 .endm 283 284 .macro SET_VREG_OBJECT _reg _vreg 285 movl \_reg, (rFP,\_vreg,4) 286 movl \_reg, (rREFS,\_vreg,4) 287 .endm 288 289 .macro GET_VREG_HIGH _reg _vreg 290 movl 4(rFP,\_vreg,4), \_reg 291 .endm 292 293 .macro SET_VREG_HIGH _reg _vreg 294 movl \_reg, 4(rFP,\_vreg,4) 295 movl MACRO_LITERAL(0), 4(rREFS,\_vreg,4) 296 .endm 297 298 .macro CLEAR_REF _vreg 299 movl MACRO_LITERAL(0), (rREFS,\_vreg,4) 300 .endm 301 302 .macro CLEAR_WIDE_REF _vreg 303 movl MACRO_LITERAL(0), (rREFS,\_vreg,4) 304 movl MACRO_LITERAL(0), 4(rREFS,\_vreg,4) 305 .endm 306 307 /* File: x86_64/entry.S */ 308 /* 309 * Copyright (C) 2016 The Android Open Source Project 310 * 311 * Licensed under the Apache License, Version 2.0 (the "License"); 312 * you may not use this file except in compliance with the License. 313 * You may obtain a copy of the License at 314 * 315 * http://www.apache.org/licenses/LICENSE-2.0 316 * 317 * Unless required by applicable law or agreed to in writing, software 318 * distributed under the License is distributed on an "AS IS" BASIS, 319 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 320 * See the License for the specific language governing permissions and 321 * limitations under the License. 322 */ 323 /* 324 * Interpreter entry point. 325 */ 326 327 .text 328 .global SYMBOL(ExecuteMterpImpl) 329 FUNCTION_TYPE(ExecuteMterpImpl) 330 331 /* 332 * On entry: 333 * 0 Thread* self 334 * 1 insns_ 335 * 2 ShadowFrame 336 * 3 JValue* result_register 337 * 338 */ 339 340 SYMBOL(ExecuteMterpImpl): 341 .cfi_startproc 342 .cfi_def_cfa rsp, 8 343 344 /* Spill callee save regs */ 345 PUSH %rbx 346 PUSH %rbp 347 PUSH %r12 348 PUSH %r13 349 PUSH %r14 350 PUSH %r15 351 352 /* Allocate frame */ 353 subq $FRAME_SIZE, %rsp 354 .cfi_adjust_cfa_offset FRAME_SIZE 355 356 /* Remember the return register */ 357 movq IN_ARG3, SHADOWFRAME_RESULT_REGISTER_OFFSET(IN_ARG2) 358 359 /* Remember the code_item */ 360 movq IN_ARG1, SHADOWFRAME_DEX_INSTRUCTIONS_OFFSET(IN_ARG2) 361 362 /* set up "named" registers */ 363 movl SHADOWFRAME_NUMBER_OF_VREGS_OFFSET(IN_ARG2), %eax 364 leaq SHADOWFRAME_VREGS_OFFSET(IN_ARG2), rFP 365 leaq (rFP, %rax, 4), rREFS 366 movl SHADOWFRAME_DEX_PC_OFFSET(IN_ARG2), %eax 367 leaq (IN_ARG1, %rax, 2), rPC 368 CFI_DEFINE_DEX_PC_WITH_OFFSET(CFI_TMP, CFI_DEX, 0) 369 EXPORT_PC 370 371 /* Starting ibase */ 372 movq IN_ARG0, rSELF 373 REFRESH_IBASE_REG IN_ARG0 374 375 /* Set up for backwards branches & osr profiling */ 376 movq IN_ARG0, OUT_ARG2 /* Set up OUT_ARG2 before clobbering IN_ARG0 */ 377 movq OFF_FP_METHOD(rFP), OUT_ARG0 378 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 379 call SYMBOL(MterpSetUpHotnessCountdown) 380 movswl %ax, rPROFILE 381 382 /* start executing the instruction at rPC */ 383 FETCH_INST 384 GOTO_NEXT 385 /* NOTE: no fallthrough */ 386 387 388 .global SYMBOL(artMterpAsmInstructionStart) 389 SYMBOL(artMterpAsmInstructionStart) = .L_op_nop 390 .text 391 392 /* ------------------------------ */ 393 .balign 128 394 .L_op_nop: /* 0x00 */ 395 /* File: x86_64/op_nop.S */ 396 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 397 398 /* ------------------------------ */ 399 .balign 128 400 .L_op_move: /* 0x01 */ 401 /* File: x86_64/op_move.S */ 402 /* for move, move-object, long-to-int */ 403 /* op vA, vB */ 404 movl rINST, %eax # eax <- BA 405 andb $0xf, %al # eax <- A 406 shrl $4, rINST # rINST <- B 407 GET_VREG %edx, rINSTq 408 .if 0 409 SET_VREG_OBJECT %edx, %rax # fp[A] <- fp[B] 410 .else 411 SET_VREG %edx, %rax # fp[A] <- fp[B] 412 .endif 413 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 414 415 /* ------------------------------ */ 416 .balign 128 417 .L_op_move_from16: /* 0x02 */ 418 /* File: x86_64/op_move_from16.S */ 419 /* for: move/from16, move-object/from16 */ 420 /* op vAA, vBBBB */ 421 movzwq 2(rPC), %rax # eax <- BBBB 422 GET_VREG %edx, %rax # edx <- fp[BBBB] 423 .if 0 424 SET_VREG_OBJECT %edx, rINSTq # fp[A] <- fp[B] 425 .else 426 SET_VREG %edx, rINSTq # fp[A] <- fp[B] 427 .endif 428 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 429 430 /* ------------------------------ */ 431 .balign 128 432 .L_op_move_16: /* 0x03 */ 433 /* File: x86_64/op_move_16.S */ 434 /* for: move/16, move-object/16 */ 435 /* op vAAAA, vBBBB */ 436 movzwq 4(rPC), %rcx # ecx <- BBBB 437 movzwq 2(rPC), %rax # eax <- AAAA 438 GET_VREG %edx, %rcx 439 .if 0 440 SET_VREG_OBJECT %edx, %rax # fp[A] <- fp[B] 441 .else 442 SET_VREG %edx, %rax # fp[A] <- fp[B] 443 .endif 444 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 445 446 /* ------------------------------ */ 447 .balign 128 448 .L_op_move_wide: /* 0x04 */ 449 /* File: x86_64/op_move_wide.S */ 450 /* move-wide vA, vB */ 451 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 452 movl rINST, %ecx # ecx <- BA 453 sarl $4, rINST # rINST <- B 454 andb $0xf, %cl # ecx <- A 455 GET_WIDE_VREG %rdx, rINSTq # rdx <- v[B] 456 SET_WIDE_VREG %rdx, %rcx # v[A] <- rdx 457 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 458 459 /* ------------------------------ */ 460 .balign 128 461 .L_op_move_wide_from16: /* 0x05 */ 462 /* File: x86_64/op_move_wide_from16.S */ 463 /* move-wide/from16 vAA, vBBBB */ 464 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 465 movzwl 2(rPC), %ecx # ecx <- BBBB 466 GET_WIDE_VREG %rdx, %rcx # rdx <- v[B] 467 SET_WIDE_VREG %rdx, rINSTq # v[A] <- rdx 468 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 469 470 /* ------------------------------ */ 471 .balign 128 472 .L_op_move_wide_16: /* 0x06 */ 473 /* File: x86_64/op_move_wide_16.S */ 474 /* move-wide/16 vAAAA, vBBBB */ 475 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 476 movzwq 4(rPC), %rcx # ecx<- BBBB 477 movzwq 2(rPC), %rax # eax<- AAAA 478 GET_WIDE_VREG %rdx, %rcx # rdx <- v[B] 479 SET_WIDE_VREG %rdx, %rax # v[A] <- rdx 480 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 481 482 /* ------------------------------ */ 483 .balign 128 484 .L_op_move_object: /* 0x07 */ 485 /* File: x86_64/op_move_object.S */ 486 /* File: x86_64/op_move.S */ 487 /* for move, move-object, long-to-int */ 488 /* op vA, vB */ 489 movl rINST, %eax # eax <- BA 490 andb $0xf, %al # eax <- A 491 shrl $4, rINST # rINST <- B 492 GET_VREG %edx, rINSTq 493 .if 1 494 SET_VREG_OBJECT %edx, %rax # fp[A] <- fp[B] 495 .else 496 SET_VREG %edx, %rax # fp[A] <- fp[B] 497 .endif 498 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 499 500 501 /* ------------------------------ */ 502 .balign 128 503 .L_op_move_object_from16: /* 0x08 */ 504 /* File: x86_64/op_move_object_from16.S */ 505 /* File: x86_64/op_move_from16.S */ 506 /* for: move/from16, move-object/from16 */ 507 /* op vAA, vBBBB */ 508 movzwq 2(rPC), %rax # eax <- BBBB 509 GET_VREG %edx, %rax # edx <- fp[BBBB] 510 .if 1 511 SET_VREG_OBJECT %edx, rINSTq # fp[A] <- fp[B] 512 .else 513 SET_VREG %edx, rINSTq # fp[A] <- fp[B] 514 .endif 515 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 516 517 518 /* ------------------------------ */ 519 .balign 128 520 .L_op_move_object_16: /* 0x09 */ 521 /* File: x86_64/op_move_object_16.S */ 522 /* File: x86_64/op_move_16.S */ 523 /* for: move/16, move-object/16 */ 524 /* op vAAAA, vBBBB */ 525 movzwq 4(rPC), %rcx # ecx <- BBBB 526 movzwq 2(rPC), %rax # eax <- AAAA 527 GET_VREG %edx, %rcx 528 .if 1 529 SET_VREG_OBJECT %edx, %rax # fp[A] <- fp[B] 530 .else 531 SET_VREG %edx, %rax # fp[A] <- fp[B] 532 .endif 533 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 534 535 536 /* ------------------------------ */ 537 .balign 128 538 .L_op_move_result: /* 0x0a */ 539 /* File: x86_64/op_move_result.S */ 540 /* for: move-result, move-result-object */ 541 /* op vAA */ 542 movq OFF_FP_RESULT_REGISTER(rFP), %rax # get pointer to result JType. 543 movl (%rax), %eax # r0 <- result.i. 544 .if 0 545 SET_VREG_OBJECT %eax, rINSTq # fp[A] <- fp[B] 546 .else 547 SET_VREG %eax, rINSTq # fp[A] <- fp[B] 548 .endif 549 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 550 551 /* ------------------------------ */ 552 .balign 128 553 .L_op_move_result_wide: /* 0x0b */ 554 /* File: x86_64/op_move_result_wide.S */ 555 /* move-result-wide vAA */ 556 movq OFF_FP_RESULT_REGISTER(rFP), %rax # get pointer to result JType. 557 movq (%rax), %rdx # Get wide 558 SET_WIDE_VREG %rdx, rINSTq # v[AA] <- rdx 559 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 560 561 /* ------------------------------ */ 562 .balign 128 563 .L_op_move_result_object: /* 0x0c */ 564 /* File: x86_64/op_move_result_object.S */ 565 /* File: x86_64/op_move_result.S */ 566 /* for: move-result, move-result-object */ 567 /* op vAA */ 568 movq OFF_FP_RESULT_REGISTER(rFP), %rax # get pointer to result JType. 569 movl (%rax), %eax # r0 <- result.i. 570 .if 1 571 SET_VREG_OBJECT %eax, rINSTq # fp[A] <- fp[B] 572 .else 573 SET_VREG %eax, rINSTq # fp[A] <- fp[B] 574 .endif 575 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 576 577 578 /* ------------------------------ */ 579 .balign 128 580 .L_op_move_exception: /* 0x0d */ 581 /* File: x86_64/op_move_exception.S */ 582 /* move-exception vAA */ 583 movq rSELF, %rcx 584 movl THREAD_EXCEPTION_OFFSET(%rcx), %eax 585 SET_VREG_OBJECT %eax, rINSTq # fp[AA] <- exception object 586 movl $0, THREAD_EXCEPTION_OFFSET(%rcx) 587 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 588 589 /* ------------------------------ */ 590 .balign 128 591 .L_op_return_void: /* 0x0e */ 592 /* File: x86_64/op_return_void.S */ 593 .extern MterpThreadFenceForConstructor 594 call SYMBOL(MterpThreadFenceForConstructor) 595 movq rSELF, OUT_ARG0 596 testl $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(OUT_ARG0) 597 jz 1f 598 call SYMBOL(MterpSuspendCheck) 599 1: 600 xorq %rax, %rax 601 jmp MterpReturn 602 603 /* ------------------------------ */ 604 .balign 128 605 .L_op_return: /* 0x0f */ 606 /* File: x86_64/op_return.S */ 607 /* 608 * Return a 32-bit value. 609 * 610 * for: return, return-object 611 */ 612 /* op vAA */ 613 .extern MterpThreadFenceForConstructor 614 call SYMBOL(MterpThreadFenceForConstructor) 615 movq rSELF, OUT_ARG0 616 testl $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(OUT_ARG0) 617 jz 1f 618 call SYMBOL(MterpSuspendCheck) 619 1: 620 GET_VREG %eax, rINSTq # eax <- vAA 621 jmp MterpReturn 622 623 /* ------------------------------ */ 624 .balign 128 625 .L_op_return_wide: /* 0x10 */ 626 /* File: x86_64/op_return_wide.S */ 627 /* 628 * Return a 64-bit value. 629 */ 630 /* return-wide vAA */ 631 .extern MterpThreadFenceForConstructor 632 call SYMBOL(MterpThreadFenceForConstructor) 633 movq rSELF, OUT_ARG0 634 testl $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(OUT_ARG0) 635 jz 1f 636 call SYMBOL(MterpSuspendCheck) 637 1: 638 GET_WIDE_VREG %rax, rINSTq # eax <- v[AA] 639 jmp MterpReturn 640 641 /* ------------------------------ */ 642 .balign 128 643 .L_op_return_object: /* 0x11 */ 644 /* File: x86_64/op_return_object.S */ 645 /* File: x86_64/op_return.S */ 646 /* 647 * Return a 32-bit value. 648 * 649 * for: return, return-object 650 */ 651 /* op vAA */ 652 .extern MterpThreadFenceForConstructor 653 call SYMBOL(MterpThreadFenceForConstructor) 654 movq rSELF, OUT_ARG0 655 testl $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(OUT_ARG0) 656 jz 1f 657 call SYMBOL(MterpSuspendCheck) 658 1: 659 GET_VREG %eax, rINSTq # eax <- vAA 660 jmp MterpReturn 661 662 663 /* ------------------------------ */ 664 .balign 128 665 .L_op_const_4: /* 0x12 */ 666 /* File: x86_64/op_const_4.S */ 667 /* const/4 vA, #+B */ 668 movsbl rINSTbl, %eax # eax <-ssssssBx 669 movl $0xf, rINST 670 andl %eax, rINST # rINST <- A 671 sarl $4, %eax 672 SET_VREG %eax, rINSTq 673 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 674 675 /* ------------------------------ */ 676 .balign 128 677 .L_op_const_16: /* 0x13 */ 678 /* File: x86_64/op_const_16.S */ 679 /* const/16 vAA, #+BBBB */ 680 movswl 2(rPC), %ecx # ecx <- ssssBBBB 681 SET_VREG %ecx, rINSTq # vAA <- ssssBBBB 682 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 683 684 /* ------------------------------ */ 685 .balign 128 686 .L_op_const: /* 0x14 */ 687 /* File: x86_64/op_const.S */ 688 /* const vAA, #+BBBBbbbb */ 689 movl 2(rPC), %eax # grab all 32 bits at once 690 SET_VREG %eax, rINSTq # vAA<- eax 691 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 692 693 /* ------------------------------ */ 694 .balign 128 695 .L_op_const_high16: /* 0x15 */ 696 /* File: x86_64/op_const_high16.S */ 697 /* const/high16 vAA, #+BBBB0000 */ 698 movzwl 2(rPC), %eax # eax <- 0000BBBB 699 sall $16, %eax # eax <- BBBB0000 700 SET_VREG %eax, rINSTq # vAA <- eax 701 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 702 703 /* ------------------------------ */ 704 .balign 128 705 .L_op_const_wide_16: /* 0x16 */ 706 /* File: x86_64/op_const_wide_16.S */ 707 /* const-wide/16 vAA, #+BBBB */ 708 movswq 2(rPC), %rax # rax <- ssssBBBB 709 SET_WIDE_VREG %rax, rINSTq # store 710 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 711 712 /* ------------------------------ */ 713 .balign 128 714 .L_op_const_wide_32: /* 0x17 */ 715 /* File: x86_64/op_const_wide_32.S */ 716 /* const-wide/32 vAA, #+BBBBbbbb */ 717 movslq 2(rPC), %rax # eax <- ssssssssBBBBbbbb 718 SET_WIDE_VREG %rax, rINSTq # store 719 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 720 721 /* ------------------------------ */ 722 .balign 128 723 .L_op_const_wide: /* 0x18 */ 724 /* File: x86_64/op_const_wide.S */ 725 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */ 726 movq 2(rPC), %rax # rax <- HHHHhhhhBBBBbbbb 727 SET_WIDE_VREG %rax, rINSTq 728 ADVANCE_PC_FETCH_AND_GOTO_NEXT 5 729 730 /* ------------------------------ */ 731 .balign 128 732 .L_op_const_wide_high16: /* 0x19 */ 733 /* File: x86_64/op_const_wide_high16.S */ 734 /* const-wide/high16 vAA, #+BBBB000000000000 */ 735 movzwq 2(rPC), %rax # eax <- 0000BBBB 736 salq $48, %rax # eax <- BBBB0000 737 SET_WIDE_VREG %rax, rINSTq # v[AA+0] <- eax 738 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 739 740 /* ------------------------------ */ 741 .balign 128 742 .L_op_const_string: /* 0x1a */ 743 /* File: x86_64/op_const_string.S */ 744 /* File: x86_64/const.S */ 745 /* const/class vAA, type@BBBB */ 746 /* const/method-handle vAA, method_handle@BBBB */ 747 /* const/method-type vAA, proto@BBBB */ 748 /* const/string vAA, string@@BBBB */ 749 .extern MterpConstString 750 EXPORT_PC 751 movzwq 2(rPC), OUT_ARG0 # eax <- OUT_ARG0 752 movq rINSTq, OUT_ARG1 753 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG2 754 movq rSELF, OUT_ARG3 755 call SYMBOL(MterpConstString) # (index, tgt_reg, shadow_frame, self) 756 testb %al, %al 757 jnz MterpPossibleException 758 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 759 760 761 /* ------------------------------ */ 762 .balign 128 763 .L_op_const_string_jumbo: /* 0x1b */ 764 /* File: x86_64/op_const_string_jumbo.S */ 765 /* const/string vAA, String@BBBBBBBB */ 766 EXPORT_PC 767 movl 2(rPC), OUT_32_ARG0 # OUT_32_ARG0 <- BBBB 768 movq rINSTq, OUT_ARG1 769 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG2 770 movq rSELF, OUT_ARG3 771 call SYMBOL(MterpConstString) # (index, tgt_reg, shadow_frame, self) 772 testb %al, %al 773 jnz MterpPossibleException 774 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 775 776 /* ------------------------------ */ 777 .balign 128 778 .L_op_const_class: /* 0x1c */ 779 /* File: x86_64/op_const_class.S */ 780 /* File: x86_64/const.S */ 781 /* const/class vAA, type@BBBB */ 782 /* const/method-handle vAA, method_handle@BBBB */ 783 /* const/method-type vAA, proto@BBBB */ 784 /* const/string vAA, string@@BBBB */ 785 .extern MterpConstClass 786 EXPORT_PC 787 movzwq 2(rPC), OUT_ARG0 # eax <- OUT_ARG0 788 movq rINSTq, OUT_ARG1 789 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG2 790 movq rSELF, OUT_ARG3 791 call SYMBOL(MterpConstClass) # (index, tgt_reg, shadow_frame, self) 792 testb %al, %al 793 jnz MterpPossibleException 794 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 795 796 797 /* ------------------------------ */ 798 .balign 128 799 .L_op_monitor_enter: /* 0x1d */ 800 /* File: x86_64/op_monitor_enter.S */ 801 /* 802 * Synchronize on an object. 803 */ 804 /* monitor-enter vAA */ 805 EXPORT_PC 806 GET_VREG OUT_32_ARG0, rINSTq 807 movq rSELF, OUT_ARG1 808 call SYMBOL(artLockObjectFromCode) # (object, self) 809 testq %rax, %rax 810 jnz MterpException 811 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 812 813 /* ------------------------------ */ 814 .balign 128 815 .L_op_monitor_exit: /* 0x1e */ 816 /* File: x86_64/op_monitor_exit.S */ 817 /* 818 * Unlock an object. 819 * 820 * Exceptions that occur when unlocking a monitor need to appear as 821 * if they happened at the following instruction. See the Dalvik 822 * instruction spec. 823 */ 824 /* monitor-exit vAA */ 825 EXPORT_PC 826 GET_VREG OUT_32_ARG0, rINSTq 827 movq rSELF, OUT_ARG1 828 call SYMBOL(artUnlockObjectFromCode) # (object, self) 829 testq %rax, %rax 830 jnz MterpException 831 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 832 833 /* ------------------------------ */ 834 .balign 128 835 .L_op_check_cast: /* 0x1f */ 836 /* File: x86_64/op_check_cast.S */ 837 /* 838 * Check to see if a cast from one class to another is allowed. 839 */ 840 /* check-cast vAA, class@BBBB */ 841 EXPORT_PC 842 movzwq 2(rPC), OUT_ARG0 # OUT_ARG0 <- BBBB 843 leaq VREG_ADDRESS(rINSTq), OUT_ARG1 844 movq OFF_FP_METHOD(rFP), OUT_ARG2 845 movq rSELF, OUT_ARG3 846 call SYMBOL(MterpCheckCast) # (index, &obj, method, self) 847 testb %al, %al 848 jnz MterpPossibleException 849 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 850 851 /* ------------------------------ */ 852 .balign 128 853 .L_op_instance_of: /* 0x20 */ 854 /* File: x86_64/op_instance_of.S */ 855 /* 856 * Check to see if an object reference is an instance of a class. 857 * 858 * Most common situation is a non-null object, being compared against 859 * an already-resolved class. 860 */ 861 /* instance-of vA, vB, class@CCCC */ 862 EXPORT_PC 863 movzwl 2(rPC), OUT_32_ARG0 # OUT_32_ARG0 <- CCCC 864 movl rINST, %eax # eax <- BA 865 sarl $4, %eax # eax <- B 866 leaq VREG_ADDRESS(%rax), OUT_ARG1 # Get object address 867 movq OFF_FP_METHOD(rFP), OUT_ARG2 868 movq rSELF, OUT_ARG3 869 call SYMBOL(MterpInstanceOf) # (index, &obj, method, self) 870 movsbl %al, %eax 871 movq rSELF, %rcx 872 cmpq $0, THREAD_EXCEPTION_OFFSET(%rcx) 873 jnz MterpException 874 andb $0xf, rINSTbl # rINSTbl <- A 875 SET_VREG %eax, rINSTq 876 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 877 878 /* ------------------------------ */ 879 .balign 128 880 .L_op_array_length: /* 0x21 */ 881 /* File: x86_64/op_array_length.S */ 882 /* 883 * Return the length of an array. 884 */ 885 movl rINST, %eax # eax <- BA 886 sarl $4, rINST # rINST <- B 887 GET_VREG %ecx, rINSTq # ecx <- vB (object ref) 888 testl %ecx, %ecx # is null? 889 je common_errNullObject 890 andb $0xf, %al # eax <- A 891 movl MIRROR_ARRAY_LENGTH_OFFSET(%rcx), rINST 892 SET_VREG rINST, %rax 893 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 894 895 /* ------------------------------ */ 896 .balign 128 897 .L_op_new_instance: /* 0x22 */ 898 /* File: x86_64/op_new_instance.S */ 899 /* 900 * Create a new instance of a class. 901 */ 902 /* new-instance vAA, class@BBBB */ 903 EXPORT_PC 904 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG0 905 movq rSELF, OUT_ARG1 906 REFRESH_INST 34 907 movq rINSTq, OUT_ARG2 908 call SYMBOL(MterpNewInstance) 909 testb %al, %al # 0 means an exception is thrown 910 jz MterpPossibleException 911 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 912 913 /* ------------------------------ */ 914 .balign 128 915 .L_op_new_array: /* 0x23 */ 916 /* File: x86_64/op_new_array.S */ 917 /* 918 * Allocate an array of objects, specified with the array class 919 * and a count. 920 * 921 * The verifier guarantees that this is an array class, so we don't 922 * check for it here. 923 */ 924 /* new-array vA, vB, class@CCCC */ 925 EXPORT_PC 926 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG0 927 movq rPC, OUT_ARG1 928 REFRESH_INST 35 929 movq rINSTq, OUT_ARG2 930 movq rSELF, OUT_ARG3 931 call SYMBOL(MterpNewArray) 932 testb %al, %al # 0 means an exception is thrown 933 jz MterpPossibleException 934 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 935 936 /* ------------------------------ */ 937 .balign 128 938 .L_op_filled_new_array: /* 0x24 */ 939 /* File: x86_64/op_filled_new_array.S */ 940 /* 941 * Create a new array with elements filled from registers. 942 * 943 * for: filled-new-array, filled-new-array/range 944 */ 945 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 946 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */ 947 .extern MterpFilledNewArray 948 EXPORT_PC 949 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG0 950 movq rPC, OUT_ARG1 951 movq rSELF, OUT_ARG2 952 call SYMBOL(MterpFilledNewArray) 953 testb %al, %al # 0 means an exception is thrown 954 jz MterpPossibleException 955 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 956 957 /* ------------------------------ */ 958 .balign 128 959 .L_op_filled_new_array_range: /* 0x25 */ 960 /* File: x86_64/op_filled_new_array_range.S */ 961 /* File: x86_64/op_filled_new_array.S */ 962 /* 963 * Create a new array with elements filled from registers. 964 * 965 * for: filled-new-array, filled-new-array/range 966 */ 967 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 968 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */ 969 .extern MterpFilledNewArrayRange 970 EXPORT_PC 971 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG0 972 movq rPC, OUT_ARG1 973 movq rSELF, OUT_ARG2 974 call SYMBOL(MterpFilledNewArrayRange) 975 testb %al, %al # 0 means an exception is thrown 976 jz MterpPossibleException 977 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 978 979 980 /* ------------------------------ */ 981 .balign 128 982 .L_op_fill_array_data: /* 0x26 */ 983 /* File: x86_64/op_fill_array_data.S */ 984 /* fill-array-data vAA, +BBBBBBBB */ 985 EXPORT_PC 986 movslq 2(rPC), %rcx # rcx <- ssssssssBBBBbbbb 987 leaq (rPC,%rcx,2), OUT_ARG1 # OUT_ARG1 <- PC + ssssssssBBBBbbbb*2 988 GET_VREG OUT_32_ARG0, rINSTq # OUT_ARG0 <- vAA (array object) 989 call SYMBOL(MterpFillArrayData) # (obj, payload) 990 testb %al, %al # 0 means an exception is thrown 991 jz MterpPossibleException 992 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 993 994 /* ------------------------------ */ 995 .balign 128 996 .L_op_throw: /* 0x27 */ 997 /* File: x86_64/op_throw.S */ 998 /* 999 * Throw an exception object in the current thread. 1000 */ 1001 /* throw vAA */ 1002 EXPORT_PC 1003 GET_VREG %eax, rINSTq # eax<- vAA (exception object) 1004 testb %al, %al 1005 jz common_errNullObject 1006 movq rSELF, %rcx 1007 movq %rax, THREAD_EXCEPTION_OFFSET(%rcx) 1008 jmp MterpException 1009 1010 /* ------------------------------ */ 1011 .balign 128 1012 .L_op_goto: /* 0x28 */ 1013 /* File: x86_64/op_goto.S */ 1014 /* 1015 * Unconditional branch, 8-bit offset. 1016 * 1017 * The branch distance is a signed code-unit offset, which we need to 1018 * double to get a byte offset. 1019 */ 1020 /* goto +AA */ 1021 movsbq rINSTbl, rINSTq # rINSTq <- ssssssAA 1022 testq rINSTq, rINSTq 1023 jmp MterpCommonTakenBranch 1024 1025 /* ------------------------------ */ 1026 .balign 128 1027 .L_op_goto_16: /* 0x29 */ 1028 /* File: x86_64/op_goto_16.S */ 1029 /* 1030 * Unconditional branch, 16-bit offset. 1031 * 1032 * The branch distance is a signed code-unit offset, which we need to 1033 * double to get a byte offset. 1034 */ 1035 /* goto/16 +AAAA */ 1036 movswq 2(rPC), rINSTq # rINSTq <- ssssAAAA 1037 testq rINSTq, rINSTq 1038 jmp MterpCommonTakenBranch 1039 1040 /* ------------------------------ */ 1041 .balign 128 1042 .L_op_goto_32: /* 0x2a */ 1043 /* File: x86_64/op_goto_32.S */ 1044 /* 1045 * Unconditional branch, 32-bit offset. 1046 * 1047 * The branch distance is a signed code-unit offset, which we need to 1048 * double to get a byte offset. 1049 * 1050 * Because we need the SF bit set, we'll use an adds 1051 * to convert from Dalvik offset to byte offset. 1052 */ 1053 /* goto/32 +AAAAAAAA */ 1054 movslq 2(rPC), rINSTq # rINSTq <- AAAAAAAA 1055 testq rINSTq, rINSTq 1056 jmp MterpCommonTakenBranch 1057 1058 /* ------------------------------ */ 1059 .balign 128 1060 .L_op_packed_switch: /* 0x2b */ 1061 /* File: x86_64/op_packed_switch.S */ 1062 /* 1063 * Handle a packed-switch or sparse-switch instruction. In both cases 1064 * we decode it and hand it off to a helper function. 1065 * 1066 * We don't really expect backward branches in a switch statement, but 1067 * they're perfectly legal, so we check for them here. 1068 * 1069 * for: packed-switch, sparse-switch 1070 */ 1071 /* op vAA, +BBBB */ 1072 movslq 2(rPC), OUT_ARG0 # rcx <- ssssssssBBBBbbbb 1073 leaq (rPC,OUT_ARG0,2), OUT_ARG0 # rcx <- PC + ssssssssBBBBbbbb*2 1074 GET_VREG OUT_32_ARG1, rINSTq # eax <- vAA 1075 call SYMBOL(MterpDoPackedSwitch) 1076 testl %eax, %eax 1077 movslq %eax, rINSTq 1078 jmp MterpCommonTakenBranch 1079 1080 /* ------------------------------ */ 1081 .balign 128 1082 .L_op_sparse_switch: /* 0x2c */ 1083 /* File: x86_64/op_sparse_switch.S */ 1084 /* File: x86_64/op_packed_switch.S */ 1085 /* 1086 * Handle a packed-switch or sparse-switch instruction. In both cases 1087 * we decode it and hand it off to a helper function. 1088 * 1089 * We don't really expect backward branches in a switch statement, but 1090 * they're perfectly legal, so we check for them here. 1091 * 1092 * for: packed-switch, sparse-switch 1093 */ 1094 /* op vAA, +BBBB */ 1095 movslq 2(rPC), OUT_ARG0 # rcx <- ssssssssBBBBbbbb 1096 leaq (rPC,OUT_ARG0,2), OUT_ARG0 # rcx <- PC + ssssssssBBBBbbbb*2 1097 GET_VREG OUT_32_ARG1, rINSTq # eax <- vAA 1098 call SYMBOL(MterpDoSparseSwitch) 1099 testl %eax, %eax 1100 movslq %eax, rINSTq 1101 jmp MterpCommonTakenBranch 1102 1103 1104 /* ------------------------------ */ 1105 .balign 128 1106 .L_op_cmpl_float: /* 0x2d */ 1107 /* File: x86_64/op_cmpl_float.S */ 1108 /* File: x86_64/fpcmp.S */ 1109 /* 1110 * Compare two floating-point values. Puts 0, 1, or -1 into the 1111 * destination register based on the results of the comparison. 1112 * 1113 * int compare(x, y) { 1114 * if (x == y) { 1115 * return 0; 1116 * } else if (x < y) { 1117 * return -1; 1118 * } else if (x > y) { 1119 * return 1; 1120 * } else { 1121 * return nanval ? 1 : -1; 1122 * } 1123 * } 1124 */ 1125 /* op vAA, vBB, vCC */ 1126 movzbq 3(rPC), %rcx # ecx<- CC 1127 movzbq 2(rPC), %rax # eax<- BB 1128 movss VREG_ADDRESS(%rax), %xmm0 1129 xor %eax, %eax 1130 ucomiss VREG_ADDRESS(%rcx), %xmm0 1131 jp .Lop_cmpl_float_nan_is_neg 1132 je .Lop_cmpl_float_finish 1133 jb .Lop_cmpl_float_less 1134 .Lop_cmpl_float_nan_is_pos: 1135 addb $1, %al 1136 jmp .Lop_cmpl_float_finish 1137 .Lop_cmpl_float_nan_is_neg: 1138 .Lop_cmpl_float_less: 1139 movl $-1, %eax 1140 .Lop_cmpl_float_finish: 1141 SET_VREG %eax, rINSTq 1142 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1143 1144 1145 /* ------------------------------ */ 1146 .balign 128 1147 .L_op_cmpg_float: /* 0x2e */ 1148 /* File: x86_64/op_cmpg_float.S */ 1149 /* File: x86_64/fpcmp.S */ 1150 /* 1151 * Compare two floating-point values. Puts 0, 1, or -1 into the 1152 * destination register based on the results of the comparison. 1153 * 1154 * int compare(x, y) { 1155 * if (x == y) { 1156 * return 0; 1157 * } else if (x < y) { 1158 * return -1; 1159 * } else if (x > y) { 1160 * return 1; 1161 * } else { 1162 * return nanval ? 1 : -1; 1163 * } 1164 * } 1165 */ 1166 /* op vAA, vBB, vCC */ 1167 movzbq 3(rPC), %rcx # ecx<- CC 1168 movzbq 2(rPC), %rax # eax<- BB 1169 movss VREG_ADDRESS(%rax), %xmm0 1170 xor %eax, %eax 1171 ucomiss VREG_ADDRESS(%rcx), %xmm0 1172 jp .Lop_cmpg_float_nan_is_pos 1173 je .Lop_cmpg_float_finish 1174 jb .Lop_cmpg_float_less 1175 .Lop_cmpg_float_nan_is_pos: 1176 addb $1, %al 1177 jmp .Lop_cmpg_float_finish 1178 .Lop_cmpg_float_nan_is_neg: 1179 .Lop_cmpg_float_less: 1180 movl $-1, %eax 1181 .Lop_cmpg_float_finish: 1182 SET_VREG %eax, rINSTq 1183 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1184 1185 1186 /* ------------------------------ */ 1187 .balign 128 1188 .L_op_cmpl_double: /* 0x2f */ 1189 /* File: x86_64/op_cmpl_double.S */ 1190 /* File: x86_64/fpcmp.S */ 1191 /* 1192 * Compare two floating-point values. Puts 0, 1, or -1 into the 1193 * destination register based on the results of the comparison. 1194 * 1195 * int compare(x, y) { 1196 * if (x == y) { 1197 * return 0; 1198 * } else if (x < y) { 1199 * return -1; 1200 * } else if (x > y) { 1201 * return 1; 1202 * } else { 1203 * return nanval ? 1 : -1; 1204 * } 1205 * } 1206 */ 1207 /* op vAA, vBB, vCC */ 1208 movzbq 3(rPC), %rcx # ecx<- CC 1209 movzbq 2(rPC), %rax # eax<- BB 1210 movsd VREG_ADDRESS(%rax), %xmm0 1211 xor %eax, %eax 1212 ucomisd VREG_ADDRESS(%rcx), %xmm0 1213 jp .Lop_cmpl_double_nan_is_neg 1214 je .Lop_cmpl_double_finish 1215 jb .Lop_cmpl_double_less 1216 .Lop_cmpl_double_nan_is_pos: 1217 addb $1, %al 1218 jmp .Lop_cmpl_double_finish 1219 .Lop_cmpl_double_nan_is_neg: 1220 .Lop_cmpl_double_less: 1221 movl $-1, %eax 1222 .Lop_cmpl_double_finish: 1223 SET_VREG %eax, rINSTq 1224 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1225 1226 1227 /* ------------------------------ */ 1228 .balign 128 1229 .L_op_cmpg_double: /* 0x30 */ 1230 /* File: x86_64/op_cmpg_double.S */ 1231 /* File: x86_64/fpcmp.S */ 1232 /* 1233 * Compare two floating-point values. Puts 0, 1, or -1 into the 1234 * destination register based on the results of the comparison. 1235 * 1236 * int compare(x, y) { 1237 * if (x == y) { 1238 * return 0; 1239 * } else if (x < y) { 1240 * return -1; 1241 * } else if (x > y) { 1242 * return 1; 1243 * } else { 1244 * return nanval ? 1 : -1; 1245 * } 1246 * } 1247 */ 1248 /* op vAA, vBB, vCC */ 1249 movzbq 3(rPC), %rcx # ecx<- CC 1250 movzbq 2(rPC), %rax # eax<- BB 1251 movsd VREG_ADDRESS(%rax), %xmm0 1252 xor %eax, %eax 1253 ucomisd VREG_ADDRESS(%rcx), %xmm0 1254 jp .Lop_cmpg_double_nan_is_pos 1255 je .Lop_cmpg_double_finish 1256 jb .Lop_cmpg_double_less 1257 .Lop_cmpg_double_nan_is_pos: 1258 addb $1, %al 1259 jmp .Lop_cmpg_double_finish 1260 .Lop_cmpg_double_nan_is_neg: 1261 .Lop_cmpg_double_less: 1262 movl $-1, %eax 1263 .Lop_cmpg_double_finish: 1264 SET_VREG %eax, rINSTq 1265 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1266 1267 1268 /* ------------------------------ */ 1269 .balign 128 1270 .L_op_cmp_long: /* 0x31 */ 1271 /* File: x86_64/op_cmp_long.S */ 1272 /* 1273 * Compare two 64-bit values. Puts 0, 1, or -1 into the destination 1274 * register based on the results of the comparison. 1275 */ 1276 /* cmp-long vAA, vBB, vCC */ 1277 movzbq 2(rPC), %rdx # edx <- BB 1278 movzbq 3(rPC), %rcx # ecx <- CC 1279 GET_WIDE_VREG %rdx, %rdx # rdx <- v[BB] 1280 xorl %eax, %eax 1281 xorl %edi, %edi 1282 addb $1, %al 1283 movl $-1, %esi 1284 cmpq VREG_ADDRESS(%rcx), %rdx 1285 cmovl %esi, %edi 1286 cmovg %eax, %edi 1287 SET_VREG %edi, rINSTq 1288 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1289 1290 /* ------------------------------ */ 1291 .balign 128 1292 .L_op_if_eq: /* 0x32 */ 1293 /* File: x86_64/op_if_eq.S */ 1294 /* File: x86_64/bincmp.S */ 1295 /* 1296 * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1297 * fragment that specifies the *reverse* comparison to perform, e.g. 1298 * for "if-le" you would use "gt". 1299 * 1300 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1301 */ 1302 /* if-cmp vA, vB, +CCCC */ 1303 movl rINST, %ecx # rcx <- A+ 1304 sarl $4, rINST # rINST <- B 1305 andb $0xf, %cl # rcx <- A 1306 GET_VREG %eax, %rcx # eax <- vA 1307 cmpl VREG_ADDRESS(rINSTq), %eax # compare (vA, vB) 1308 jne 1f 1309 movswq 2(rPC), rINSTq # Get signed branch offset 1310 testq rINSTq, rINSTq 1311 jmp MterpCommonTakenBranch 1312 1: 1313 cmpl $JIT_CHECK_OSR, rPROFILE 1314 je .L_check_not_taken_osr 1315 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1316 1317 1318 /* ------------------------------ */ 1319 .balign 128 1320 .L_op_if_ne: /* 0x33 */ 1321 /* File: x86_64/op_if_ne.S */ 1322 /* File: x86_64/bincmp.S */ 1323 /* 1324 * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1325 * fragment that specifies the *reverse* comparison to perform, e.g. 1326 * for "if-le" you would use "gt". 1327 * 1328 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1329 */ 1330 /* if-cmp vA, vB, +CCCC */ 1331 movl rINST, %ecx # rcx <- A+ 1332 sarl $4, rINST # rINST <- B 1333 andb $0xf, %cl # rcx <- A 1334 GET_VREG %eax, %rcx # eax <- vA 1335 cmpl VREG_ADDRESS(rINSTq), %eax # compare (vA, vB) 1336 je 1f 1337 movswq 2(rPC), rINSTq # Get signed branch offset 1338 testq rINSTq, rINSTq 1339 jmp MterpCommonTakenBranch 1340 1: 1341 cmpl $JIT_CHECK_OSR, rPROFILE 1342 je .L_check_not_taken_osr 1343 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1344 1345 1346 /* ------------------------------ */ 1347 .balign 128 1348 .L_op_if_lt: /* 0x34 */ 1349 /* File: x86_64/op_if_lt.S */ 1350 /* File: x86_64/bincmp.S */ 1351 /* 1352 * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1353 * fragment that specifies the *reverse* comparison to perform, e.g. 1354 * for "if-le" you would use "gt". 1355 * 1356 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1357 */ 1358 /* if-cmp vA, vB, +CCCC */ 1359 movl rINST, %ecx # rcx <- A+ 1360 sarl $4, rINST # rINST <- B 1361 andb $0xf, %cl # rcx <- A 1362 GET_VREG %eax, %rcx # eax <- vA 1363 cmpl VREG_ADDRESS(rINSTq), %eax # compare (vA, vB) 1364 jge 1f 1365 movswq 2(rPC), rINSTq # Get signed branch offset 1366 testq rINSTq, rINSTq 1367 jmp MterpCommonTakenBranch 1368 1: 1369 cmpl $JIT_CHECK_OSR, rPROFILE 1370 je .L_check_not_taken_osr 1371 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1372 1373 1374 /* ------------------------------ */ 1375 .balign 128 1376 .L_op_if_ge: /* 0x35 */ 1377 /* File: x86_64/op_if_ge.S */ 1378 /* File: x86_64/bincmp.S */ 1379 /* 1380 * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1381 * fragment that specifies the *reverse* comparison to perform, e.g. 1382 * for "if-le" you would use "gt". 1383 * 1384 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1385 */ 1386 /* if-cmp vA, vB, +CCCC */ 1387 movl rINST, %ecx # rcx <- A+ 1388 sarl $4, rINST # rINST <- B 1389 andb $0xf, %cl # rcx <- A 1390 GET_VREG %eax, %rcx # eax <- vA 1391 cmpl VREG_ADDRESS(rINSTq), %eax # compare (vA, vB) 1392 jl 1f 1393 movswq 2(rPC), rINSTq # Get signed branch offset 1394 testq rINSTq, rINSTq 1395 jmp MterpCommonTakenBranch 1396 1: 1397 cmpl $JIT_CHECK_OSR, rPROFILE 1398 je .L_check_not_taken_osr 1399 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1400 1401 1402 /* ------------------------------ */ 1403 .balign 128 1404 .L_op_if_gt: /* 0x36 */ 1405 /* File: x86_64/op_if_gt.S */ 1406 /* File: x86_64/bincmp.S */ 1407 /* 1408 * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1409 * fragment that specifies the *reverse* comparison to perform, e.g. 1410 * for "if-le" you would use "gt". 1411 * 1412 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1413 */ 1414 /* if-cmp vA, vB, +CCCC */ 1415 movl rINST, %ecx # rcx <- A+ 1416 sarl $4, rINST # rINST <- B 1417 andb $0xf, %cl # rcx <- A 1418 GET_VREG %eax, %rcx # eax <- vA 1419 cmpl VREG_ADDRESS(rINSTq), %eax # compare (vA, vB) 1420 jle 1f 1421 movswq 2(rPC), rINSTq # Get signed branch offset 1422 testq rINSTq, rINSTq 1423 jmp MterpCommonTakenBranch 1424 1: 1425 cmpl $JIT_CHECK_OSR, rPROFILE 1426 je .L_check_not_taken_osr 1427 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1428 1429 1430 /* ------------------------------ */ 1431 .balign 128 1432 .L_op_if_le: /* 0x37 */ 1433 /* File: x86_64/op_if_le.S */ 1434 /* File: x86_64/bincmp.S */ 1435 /* 1436 * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1437 * fragment that specifies the *reverse* comparison to perform, e.g. 1438 * for "if-le" you would use "gt". 1439 * 1440 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1441 */ 1442 /* if-cmp vA, vB, +CCCC */ 1443 movl rINST, %ecx # rcx <- A+ 1444 sarl $4, rINST # rINST <- B 1445 andb $0xf, %cl # rcx <- A 1446 GET_VREG %eax, %rcx # eax <- vA 1447 cmpl VREG_ADDRESS(rINSTq), %eax # compare (vA, vB) 1448 jg 1f 1449 movswq 2(rPC), rINSTq # Get signed branch offset 1450 testq rINSTq, rINSTq 1451 jmp MterpCommonTakenBranch 1452 1: 1453 cmpl $JIT_CHECK_OSR, rPROFILE 1454 je .L_check_not_taken_osr 1455 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1456 1457 1458 /* ------------------------------ */ 1459 .balign 128 1460 .L_op_if_eqz: /* 0x38 */ 1461 /* File: x86_64/op_if_eqz.S */ 1462 /* File: x86_64/zcmp.S */ 1463 /* 1464 * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1465 * fragment that specifies the *reverse* comparison to perform, e.g. 1466 * for "if-le" you would use "gt". 1467 * 1468 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1469 */ 1470 /* if-cmp vAA, +BBBB */ 1471 cmpl $0, VREG_ADDRESS(rINSTq) # compare (vA, 0) 1472 jne 1f 1473 movswq 2(rPC), rINSTq # fetch signed displacement 1474 testq rINSTq, rINSTq 1475 jmp MterpCommonTakenBranch 1476 1: 1477 cmpl $JIT_CHECK_OSR, rPROFILE 1478 je .L_check_not_taken_osr 1479 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1480 1481 1482 /* ------------------------------ */ 1483 .balign 128 1484 .L_op_if_nez: /* 0x39 */ 1485 /* File: x86_64/op_if_nez.S */ 1486 /* File: x86_64/zcmp.S */ 1487 /* 1488 * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1489 * fragment that specifies the *reverse* comparison to perform, e.g. 1490 * for "if-le" you would use "gt". 1491 * 1492 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1493 */ 1494 /* if-cmp vAA, +BBBB */ 1495 cmpl $0, VREG_ADDRESS(rINSTq) # compare (vA, 0) 1496 je 1f 1497 movswq 2(rPC), rINSTq # fetch signed displacement 1498 testq rINSTq, rINSTq 1499 jmp MterpCommonTakenBranch 1500 1: 1501 cmpl $JIT_CHECK_OSR, rPROFILE 1502 je .L_check_not_taken_osr 1503 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1504 1505 1506 /* ------------------------------ */ 1507 .balign 128 1508 .L_op_if_ltz: /* 0x3a */ 1509 /* File: x86_64/op_if_ltz.S */ 1510 /* File: x86_64/zcmp.S */ 1511 /* 1512 * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1513 * fragment that specifies the *reverse* comparison to perform, e.g. 1514 * for "if-le" you would use "gt". 1515 * 1516 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1517 */ 1518 /* if-cmp vAA, +BBBB */ 1519 cmpl $0, VREG_ADDRESS(rINSTq) # compare (vA, 0) 1520 jge 1f 1521 movswq 2(rPC), rINSTq # fetch signed displacement 1522 testq rINSTq, rINSTq 1523 jmp MterpCommonTakenBranch 1524 1: 1525 cmpl $JIT_CHECK_OSR, rPROFILE 1526 je .L_check_not_taken_osr 1527 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1528 1529 1530 /* ------------------------------ */ 1531 .balign 128 1532 .L_op_if_gez: /* 0x3b */ 1533 /* File: x86_64/op_if_gez.S */ 1534 /* File: x86_64/zcmp.S */ 1535 /* 1536 * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1537 * fragment that specifies the *reverse* comparison to perform, e.g. 1538 * for "if-le" you would use "gt". 1539 * 1540 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1541 */ 1542 /* if-cmp vAA, +BBBB */ 1543 cmpl $0, VREG_ADDRESS(rINSTq) # compare (vA, 0) 1544 jl 1f 1545 movswq 2(rPC), rINSTq # fetch signed displacement 1546 testq rINSTq, rINSTq 1547 jmp MterpCommonTakenBranch 1548 1: 1549 cmpl $JIT_CHECK_OSR, rPROFILE 1550 je .L_check_not_taken_osr 1551 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1552 1553 1554 /* ------------------------------ */ 1555 .balign 128 1556 .L_op_if_gtz: /* 0x3c */ 1557 /* File: x86_64/op_if_gtz.S */ 1558 /* File: x86_64/zcmp.S */ 1559 /* 1560 * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1561 * fragment that specifies the *reverse* comparison to perform, e.g. 1562 * for "if-le" you would use "gt". 1563 * 1564 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1565 */ 1566 /* if-cmp vAA, +BBBB */ 1567 cmpl $0, VREG_ADDRESS(rINSTq) # compare (vA, 0) 1568 jle 1f 1569 movswq 2(rPC), rINSTq # fetch signed displacement 1570 testq rINSTq, rINSTq 1571 jmp MterpCommonTakenBranch 1572 1: 1573 cmpl $JIT_CHECK_OSR, rPROFILE 1574 je .L_check_not_taken_osr 1575 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1576 1577 1578 /* ------------------------------ */ 1579 .balign 128 1580 .L_op_if_lez: /* 0x3d */ 1581 /* File: x86_64/op_if_lez.S */ 1582 /* File: x86_64/zcmp.S */ 1583 /* 1584 * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1585 * fragment that specifies the *reverse* comparison to perform, e.g. 1586 * for "if-le" you would use "gt". 1587 * 1588 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1589 */ 1590 /* if-cmp vAA, +BBBB */ 1591 cmpl $0, VREG_ADDRESS(rINSTq) # compare (vA, 0) 1592 jg 1f 1593 movswq 2(rPC), rINSTq # fetch signed displacement 1594 testq rINSTq, rINSTq 1595 jmp MterpCommonTakenBranch 1596 1: 1597 cmpl $JIT_CHECK_OSR, rPROFILE 1598 je .L_check_not_taken_osr 1599 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1600 1601 1602 /* ------------------------------ */ 1603 .balign 128 1604 .L_op_unused_3e: /* 0x3e */ 1605 /* File: x86_64/op_unused_3e.S */ 1606 /* File: x86_64/unused.S */ 1607 /* 1608 * Bail to reference interpreter to throw. 1609 */ 1610 jmp MterpFallback 1611 1612 1613 /* ------------------------------ */ 1614 .balign 128 1615 .L_op_unused_3f: /* 0x3f */ 1616 /* File: x86_64/op_unused_3f.S */ 1617 /* File: x86_64/unused.S */ 1618 /* 1619 * Bail to reference interpreter to throw. 1620 */ 1621 jmp MterpFallback 1622 1623 1624 /* ------------------------------ */ 1625 .balign 128 1626 .L_op_unused_40: /* 0x40 */ 1627 /* File: x86_64/op_unused_40.S */ 1628 /* File: x86_64/unused.S */ 1629 /* 1630 * Bail to reference interpreter to throw. 1631 */ 1632 jmp MterpFallback 1633 1634 1635 /* ------------------------------ */ 1636 .balign 128 1637 .L_op_unused_41: /* 0x41 */ 1638 /* File: x86_64/op_unused_41.S */ 1639 /* File: x86_64/unused.S */ 1640 /* 1641 * Bail to reference interpreter to throw. 1642 */ 1643 jmp MterpFallback 1644 1645 1646 /* ------------------------------ */ 1647 .balign 128 1648 .L_op_unused_42: /* 0x42 */ 1649 /* File: x86_64/op_unused_42.S */ 1650 /* File: x86_64/unused.S */ 1651 /* 1652 * Bail to reference interpreter to throw. 1653 */ 1654 jmp MterpFallback 1655 1656 1657 /* ------------------------------ */ 1658 .balign 128 1659 .L_op_unused_43: /* 0x43 */ 1660 /* File: x86_64/op_unused_43.S */ 1661 /* File: x86_64/unused.S */ 1662 /* 1663 * Bail to reference interpreter to throw. 1664 */ 1665 jmp MterpFallback 1666 1667 1668 /* ------------------------------ */ 1669 .balign 128 1670 .L_op_aget: /* 0x44 */ 1671 /* File: x86_64/op_aget.S */ 1672 /* 1673 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1674 * 1675 * for: aget, aget-boolean, aget-byte, aget-char, aget-short, aget-wide 1676 * 1677 */ 1678 /* op vAA, vBB, vCC */ 1679 movzbq 2(rPC), %rax # eax <- BB 1680 movzbq 3(rPC), %rcx # ecx <- CC 1681 GET_VREG %eax, %rax # eax <- vBB (array object) 1682 GET_VREG %ecx, %rcx # ecx <- vCC (requested index) 1683 testl %eax, %eax # null array object? 1684 je common_errNullObject # bail if so 1685 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1686 jae common_errArrayIndex # index >= length, bail. 1687 .if 0 1688 movq MIRROR_INT_ARRAY_DATA_OFFSET(%rax,%rcx,8), %rax 1689 SET_WIDE_VREG %rax, rINSTq 1690 .else 1691 movl MIRROR_INT_ARRAY_DATA_OFFSET(%rax,%rcx,4), %eax 1692 SET_VREG %eax, rINSTq 1693 .endif 1694 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1695 1696 /* ------------------------------ */ 1697 .balign 128 1698 .L_op_aget_wide: /* 0x45 */ 1699 /* File: x86_64/op_aget_wide.S */ 1700 /* File: x86_64/op_aget.S */ 1701 /* 1702 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1703 * 1704 * for: aget, aget-boolean, aget-byte, aget-char, aget-short, aget-wide 1705 * 1706 */ 1707 /* op vAA, vBB, vCC */ 1708 movzbq 2(rPC), %rax # eax <- BB 1709 movzbq 3(rPC), %rcx # ecx <- CC 1710 GET_VREG %eax, %rax # eax <- vBB (array object) 1711 GET_VREG %ecx, %rcx # ecx <- vCC (requested index) 1712 testl %eax, %eax # null array object? 1713 je common_errNullObject # bail if so 1714 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1715 jae common_errArrayIndex # index >= length, bail. 1716 .if 1 1717 movq MIRROR_WIDE_ARRAY_DATA_OFFSET(%rax,%rcx,8), %rax 1718 SET_WIDE_VREG %rax, rINSTq 1719 .else 1720 movq MIRROR_WIDE_ARRAY_DATA_OFFSET(%rax,%rcx,8), %eax 1721 SET_VREG %eax, rINSTq 1722 .endif 1723 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1724 1725 1726 /* ------------------------------ */ 1727 .balign 128 1728 .L_op_aget_object: /* 0x46 */ 1729 /* File: x86_64/op_aget_object.S */ 1730 /* 1731 * Array object get. vAA <- vBB[vCC]. 1732 * 1733 * for: aget-object 1734 */ 1735 /* op vAA, vBB, vCC */ 1736 movzbq 2(rPC), %rax # rax <- BB 1737 movzbq 3(rPC), %rcx # rcx <- CC 1738 GET_VREG OUT_32_ARG0, %rax # eax <- vBB (array object) 1739 GET_VREG OUT_32_ARG1, %rcx # ecx <- vCC (requested index) 1740 EXPORT_PC 1741 call SYMBOL(artAGetObjectFromMterp) # (array, index) 1742 movq rSELF, %rcx 1743 cmpq $0, THREAD_EXCEPTION_OFFSET(%rcx) 1744 jnz MterpException 1745 SET_VREG_OBJECT %eax, rINSTq 1746 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1747 1748 /* ------------------------------ */ 1749 .balign 128 1750 .L_op_aget_boolean: /* 0x47 */ 1751 /* File: x86_64/op_aget_boolean.S */ 1752 /* File: x86_64/op_aget.S */ 1753 /* 1754 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1755 * 1756 * for: aget, aget-boolean, aget-byte, aget-char, aget-short, aget-wide 1757 * 1758 */ 1759 /* op vAA, vBB, vCC */ 1760 movzbq 2(rPC), %rax # eax <- BB 1761 movzbq 3(rPC), %rcx # ecx <- CC 1762 GET_VREG %eax, %rax # eax <- vBB (array object) 1763 GET_VREG %ecx, %rcx # ecx <- vCC (requested index) 1764 testl %eax, %eax # null array object? 1765 je common_errNullObject # bail if so 1766 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1767 jae common_errArrayIndex # index >= length, bail. 1768 .if 0 1769 movq MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(%rax,%rcx,8), %rax 1770 SET_WIDE_VREG %rax, rINSTq 1771 .else 1772 movzbl MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(%rax,%rcx,1), %eax 1773 SET_VREG %eax, rINSTq 1774 .endif 1775 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1776 1777 1778 /* ------------------------------ */ 1779 .balign 128 1780 .L_op_aget_byte: /* 0x48 */ 1781 /* File: x86_64/op_aget_byte.S */ 1782 /* File: x86_64/op_aget.S */ 1783 /* 1784 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1785 * 1786 * for: aget, aget-boolean, aget-byte, aget-char, aget-short, aget-wide 1787 * 1788 */ 1789 /* op vAA, vBB, vCC */ 1790 movzbq 2(rPC), %rax # eax <- BB 1791 movzbq 3(rPC), %rcx # ecx <- CC 1792 GET_VREG %eax, %rax # eax <- vBB (array object) 1793 GET_VREG %ecx, %rcx # ecx <- vCC (requested index) 1794 testl %eax, %eax # null array object? 1795 je common_errNullObject # bail if so 1796 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1797 jae common_errArrayIndex # index >= length, bail. 1798 .if 0 1799 movq MIRROR_BYTE_ARRAY_DATA_OFFSET(%rax,%rcx,8), %rax 1800 SET_WIDE_VREG %rax, rINSTq 1801 .else 1802 movsbl MIRROR_BYTE_ARRAY_DATA_OFFSET(%rax,%rcx,1), %eax 1803 SET_VREG %eax, rINSTq 1804 .endif 1805 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1806 1807 1808 /* ------------------------------ */ 1809 .balign 128 1810 .L_op_aget_char: /* 0x49 */ 1811 /* File: x86_64/op_aget_char.S */ 1812 /* File: x86_64/op_aget.S */ 1813 /* 1814 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1815 * 1816 * for: aget, aget-boolean, aget-byte, aget-char, aget-short, aget-wide 1817 * 1818 */ 1819 /* op vAA, vBB, vCC */ 1820 movzbq 2(rPC), %rax # eax <- BB 1821 movzbq 3(rPC), %rcx # ecx <- CC 1822 GET_VREG %eax, %rax # eax <- vBB (array object) 1823 GET_VREG %ecx, %rcx # ecx <- vCC (requested index) 1824 testl %eax, %eax # null array object? 1825 je common_errNullObject # bail if so 1826 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1827 jae common_errArrayIndex # index >= length, bail. 1828 .if 0 1829 movq MIRROR_CHAR_ARRAY_DATA_OFFSET(%rax,%rcx,8), %rax 1830 SET_WIDE_VREG %rax, rINSTq 1831 .else 1832 movzwl MIRROR_CHAR_ARRAY_DATA_OFFSET(%rax,%rcx,2), %eax 1833 SET_VREG %eax, rINSTq 1834 .endif 1835 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1836 1837 1838 /* ------------------------------ */ 1839 .balign 128 1840 .L_op_aget_short: /* 0x4a */ 1841 /* File: x86_64/op_aget_short.S */ 1842 /* File: x86_64/op_aget.S */ 1843 /* 1844 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1845 * 1846 * for: aget, aget-boolean, aget-byte, aget-char, aget-short, aget-wide 1847 * 1848 */ 1849 /* op vAA, vBB, vCC */ 1850 movzbq 2(rPC), %rax # eax <- BB 1851 movzbq 3(rPC), %rcx # ecx <- CC 1852 GET_VREG %eax, %rax # eax <- vBB (array object) 1853 GET_VREG %ecx, %rcx # ecx <- vCC (requested index) 1854 testl %eax, %eax # null array object? 1855 je common_errNullObject # bail if so 1856 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1857 jae common_errArrayIndex # index >= length, bail. 1858 .if 0 1859 movq MIRROR_SHORT_ARRAY_DATA_OFFSET(%rax,%rcx,8), %rax 1860 SET_WIDE_VREG %rax, rINSTq 1861 .else 1862 movswl MIRROR_SHORT_ARRAY_DATA_OFFSET(%rax,%rcx,2), %eax 1863 SET_VREG %eax, rINSTq 1864 .endif 1865 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1866 1867 1868 /* ------------------------------ */ 1869 .balign 128 1870 .L_op_aput: /* 0x4b */ 1871 /* File: x86_64/op_aput.S */ 1872 /* 1873 * Array put, 32 bits or less. vBB[vCC] <- vAA. 1874 * 1875 * for: aput, aput-boolean, aput-byte, aput-char, aput-short, aput-wide 1876 * 1877 */ 1878 /* op vAA, vBB, vCC */ 1879 movzbq 2(rPC), %rax # rax <- BB 1880 movzbq 3(rPC), %rcx # rcx <- CC 1881 GET_VREG %eax, %rax # eax <- vBB (array object) 1882 GET_VREG %ecx, %rcx # ecx <- vCC (requested index) 1883 testl %eax, %eax # null array object? 1884 je common_errNullObject # bail if so 1885 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1886 jae common_errArrayIndex # index >= length, bail. 1887 .if 0 1888 GET_WIDE_VREG rINSTq, rINSTq 1889 .else 1890 GET_VREG rINST, rINSTq 1891 .endif 1892 movl rINST, MIRROR_INT_ARRAY_DATA_OFFSET(%rax,%rcx,4) 1893 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1894 1895 /* ------------------------------ */ 1896 .balign 128 1897 .L_op_aput_wide: /* 0x4c */ 1898 /* File: x86_64/op_aput_wide.S */ 1899 /* File: x86_64/op_aput.S */ 1900 /* 1901 * Array put, 32 bits or less. vBB[vCC] <- vAA. 1902 * 1903 * for: aput, aput-boolean, aput-byte, aput-char, aput-short, aput-wide 1904 * 1905 */ 1906 /* op vAA, vBB, vCC */ 1907 movzbq 2(rPC), %rax # rax <- BB 1908 movzbq 3(rPC), %rcx # rcx <- CC 1909 GET_VREG %eax, %rax # eax <- vBB (array object) 1910 GET_VREG %ecx, %rcx # ecx <- vCC (requested index) 1911 testl %eax, %eax # null array object? 1912 je common_errNullObject # bail if so 1913 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1914 jae common_errArrayIndex # index >= length, bail. 1915 .if 1 1916 GET_WIDE_VREG rINSTq, rINSTq 1917 .else 1918 GET_VREG rINST, rINSTq 1919 .endif 1920 movq rINSTq, MIRROR_WIDE_ARRAY_DATA_OFFSET(%rax,%rcx,8) 1921 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1922 1923 1924 /* ------------------------------ */ 1925 .balign 128 1926 .L_op_aput_object: /* 0x4d */ 1927 /* File: x86_64/op_aput_object.S */ 1928 /* 1929 * Store an object into an array. vBB[vCC] <- vAA. 1930 */ 1931 /* op vAA, vBB, vCC */ 1932 EXPORT_PC 1933 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG0 1934 movq rPC, OUT_ARG1 1935 REFRESH_INST 77 1936 movq rINSTq, OUT_ARG2 1937 call SYMBOL(MterpAputObject) # (array, index) 1938 testb %al, %al 1939 jz MterpPossibleException 1940 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1941 1942 /* ------------------------------ */ 1943 .balign 128 1944 .L_op_aput_boolean: /* 0x4e */ 1945 /* File: x86_64/op_aput_boolean.S */ 1946 /* File: x86_64/op_aput.S */ 1947 /* 1948 * Array put, 32 bits or less. vBB[vCC] <- vAA. 1949 * 1950 * for: aput, aput-boolean, aput-byte, aput-char, aput-short, aput-wide 1951 * 1952 */ 1953 /* op vAA, vBB, vCC */ 1954 movzbq 2(rPC), %rax # rax <- BB 1955 movzbq 3(rPC), %rcx # rcx <- CC 1956 GET_VREG %eax, %rax # eax <- vBB (array object) 1957 GET_VREG %ecx, %rcx # ecx <- vCC (requested index) 1958 testl %eax, %eax # null array object? 1959 je common_errNullObject # bail if so 1960 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1961 jae common_errArrayIndex # index >= length, bail. 1962 .if 0 1963 GET_WIDE_VREG rINSTq, rINSTq 1964 .else 1965 GET_VREG rINST, rINSTq 1966 .endif 1967 movb rINSTbl, MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(%rax,%rcx,1) 1968 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1969 1970 1971 /* ------------------------------ */ 1972 .balign 128 1973 .L_op_aput_byte: /* 0x4f */ 1974 /* File: x86_64/op_aput_byte.S */ 1975 /* File: x86_64/op_aput.S */ 1976 /* 1977 * Array put, 32 bits or less. vBB[vCC] <- vAA. 1978 * 1979 * for: aput, aput-boolean, aput-byte, aput-char, aput-short, aput-wide 1980 * 1981 */ 1982 /* op vAA, vBB, vCC */ 1983 movzbq 2(rPC), %rax # rax <- BB 1984 movzbq 3(rPC), %rcx # rcx <- CC 1985 GET_VREG %eax, %rax # eax <- vBB (array object) 1986 GET_VREG %ecx, %rcx # ecx <- vCC (requested index) 1987 testl %eax, %eax # null array object? 1988 je common_errNullObject # bail if so 1989 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1990 jae common_errArrayIndex # index >= length, bail. 1991 .if 0 1992 GET_WIDE_VREG rINSTq, rINSTq 1993 .else 1994 GET_VREG rINST, rINSTq 1995 .endif 1996 movb rINSTbl, MIRROR_BYTE_ARRAY_DATA_OFFSET(%rax,%rcx,1) 1997 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1998 1999 2000 /* ------------------------------ */ 2001 .balign 128 2002 .L_op_aput_char: /* 0x50 */ 2003 /* File: x86_64/op_aput_char.S */ 2004 /* File: x86_64/op_aput.S */ 2005 /* 2006 * Array put, 32 bits or less. vBB[vCC] <- vAA. 2007 * 2008 * for: aput, aput-boolean, aput-byte, aput-char, aput-short, aput-wide 2009 * 2010 */ 2011 /* op vAA, vBB, vCC */ 2012 movzbq 2(rPC), %rax # rax <- BB 2013 movzbq 3(rPC), %rcx # rcx <- CC 2014 GET_VREG %eax, %rax # eax <- vBB (array object) 2015 GET_VREG %ecx, %rcx # ecx <- vCC (requested index) 2016 testl %eax, %eax # null array object? 2017 je common_errNullObject # bail if so 2018 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 2019 jae common_errArrayIndex # index >= length, bail. 2020 .if 0 2021 GET_WIDE_VREG rINSTq, rINSTq 2022 .else 2023 GET_VREG rINST, rINSTq 2024 .endif 2025 movw rINSTw, MIRROR_CHAR_ARRAY_DATA_OFFSET(%rax,%rcx,2) 2026 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2027 2028 2029 /* ------------------------------ */ 2030 .balign 128 2031 .L_op_aput_short: /* 0x51 */ 2032 /* File: x86_64/op_aput_short.S */ 2033 /* File: x86_64/op_aput.S */ 2034 /* 2035 * Array put, 32 bits or less. vBB[vCC] <- vAA. 2036 * 2037 * for: aput, aput-boolean, aput-byte, aput-char, aput-short, aput-wide 2038 * 2039 */ 2040 /* op vAA, vBB, vCC */ 2041 movzbq 2(rPC), %rax # rax <- BB 2042 movzbq 3(rPC), %rcx # rcx <- CC 2043 GET_VREG %eax, %rax # eax <- vBB (array object) 2044 GET_VREG %ecx, %rcx # ecx <- vCC (requested index) 2045 testl %eax, %eax # null array object? 2046 je common_errNullObject # bail if so 2047 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 2048 jae common_errArrayIndex # index >= length, bail. 2049 .if 0 2050 GET_WIDE_VREG rINSTq, rINSTq 2051 .else 2052 GET_VREG rINST, rINSTq 2053 .endif 2054 movw rINSTw, MIRROR_SHORT_ARRAY_DATA_OFFSET(%rax,%rcx,2) 2055 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2056 2057 2058 /* ------------------------------ */ 2059 .balign 128 2060 .L_op_iget: /* 0x52 */ 2061 /* File: x86_64/op_iget.S */ 2062 /* 2063 * General instance field get. 2064 * 2065 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short, iget-wide 2066 */ 2067 EXPORT_PC 2068 movzbq rINSTbl, %rcx # rcx <- BA 2069 movzwl 2(rPC), OUT_32_ARG0 # eax <- field ref CCCC 2070 sarl $4, %ecx # ecx <- B 2071 GET_VREG OUT_32_ARG1, %rcx # the object pointer 2072 movq OFF_FP_METHOD(rFP), OUT_ARG2 # referrer 2073 movq rSELF, OUT_ARG3 2074 call SYMBOL(artGet32InstanceFromCode) 2075 movq rSELF, %rcx 2076 cmpq $0, THREAD_EXCEPTION_OFFSET(%rcx) 2077 jnz MterpException # bail out 2078 andb $0xf, rINSTbl # rINST <- A 2079 .if 0 2080 SET_VREG_OBJECT %eax, rINSTq # fp[A] <-value 2081 .else 2082 .if 0 2083 SET_WIDE_VREG %rax, rINSTq # fp[A] <-value 2084 .else 2085 SET_VREG %eax, rINSTq # fp[A] <-value 2086 .endif 2087 .endif 2088 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2089 2090 /* ------------------------------ */ 2091 .balign 128 2092 .L_op_iget_wide: /* 0x53 */ 2093 /* File: x86_64/op_iget_wide.S */ 2094 /* File: x86_64/op_iget.S */ 2095 /* 2096 * General instance field get. 2097 * 2098 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short, iget-wide 2099 */ 2100 EXPORT_PC 2101 movzbq rINSTbl, %rcx # rcx <- BA 2102 movzwl 2(rPC), OUT_32_ARG0 # eax <- field ref CCCC 2103 sarl $4, %ecx # ecx <- B 2104 GET_VREG OUT_32_ARG1, %rcx # the object pointer 2105 movq OFF_FP_METHOD(rFP), OUT_ARG2 # referrer 2106 movq rSELF, OUT_ARG3 2107 call SYMBOL(artGet64InstanceFromCode) 2108 movq rSELF, %rcx 2109 cmpq $0, THREAD_EXCEPTION_OFFSET(%rcx) 2110 jnz MterpException # bail out 2111 andb $0xf, rINSTbl # rINST <- A 2112 .if 0 2113 SET_VREG_OBJECT %eax, rINSTq # fp[A] <-value 2114 .else 2115 .if 1 2116 SET_WIDE_VREG %rax, rINSTq # fp[A] <-value 2117 .else 2118 SET_VREG %eax, rINSTq # fp[A] <-value 2119 .endif 2120 .endif 2121 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2122 2123 2124 /* ------------------------------ */ 2125 .balign 128 2126 .L_op_iget_object: /* 0x54 */ 2127 /* File: x86_64/op_iget_object.S */ 2128 /* File: x86_64/op_iget.S */ 2129 /* 2130 * General instance field get. 2131 * 2132 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short, iget-wide 2133 */ 2134 EXPORT_PC 2135 movzbq rINSTbl, %rcx # rcx <- BA 2136 movzwl 2(rPC), OUT_32_ARG0 # eax <- field ref CCCC 2137 sarl $4, %ecx # ecx <- B 2138 GET_VREG OUT_32_ARG1, %rcx # the object pointer 2139 movq OFF_FP_METHOD(rFP), OUT_ARG2 # referrer 2140 movq rSELF, OUT_ARG3 2141 call SYMBOL(artGetObjInstanceFromCode) 2142 movq rSELF, %rcx 2143 cmpq $0, THREAD_EXCEPTION_OFFSET(%rcx) 2144 jnz MterpException # bail out 2145 andb $0xf, rINSTbl # rINST <- A 2146 .if 1 2147 SET_VREG_OBJECT %eax, rINSTq # fp[A] <-value 2148 .else 2149 .if 0 2150 SET_WIDE_VREG %rax, rINSTq # fp[A] <-value 2151 .else 2152 SET_VREG %eax, rINSTq # fp[A] <-value 2153 .endif 2154 .endif 2155 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2156 2157 2158 /* ------------------------------ */ 2159 .balign 128 2160 .L_op_iget_boolean: /* 0x55 */ 2161 /* File: x86_64/op_iget_boolean.S */ 2162 /* File: x86_64/op_iget.S */ 2163 /* 2164 * General instance field get. 2165 * 2166 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short, iget-wide 2167 */ 2168 EXPORT_PC 2169 movzbq rINSTbl, %rcx # rcx <- BA 2170 movzwl 2(rPC), OUT_32_ARG0 # eax <- field ref CCCC 2171 sarl $4, %ecx # ecx <- B 2172 GET_VREG OUT_32_ARG1, %rcx # the object pointer 2173 movq OFF_FP_METHOD(rFP), OUT_ARG2 # referrer 2174 movq rSELF, OUT_ARG3 2175 call SYMBOL(artGetBooleanInstanceFromCode) 2176 movq rSELF, %rcx 2177 cmpq $0, THREAD_EXCEPTION_OFFSET(%rcx) 2178 jnz MterpException # bail out 2179 andb $0xf, rINSTbl # rINST <- A 2180 .if 0 2181 SET_VREG_OBJECT %eax, rINSTq # fp[A] <-value 2182 .else 2183 .if 0 2184 SET_WIDE_VREG %rax, rINSTq # fp[A] <-value 2185 .else 2186 SET_VREG %eax, rINSTq # fp[A] <-value 2187 .endif 2188 .endif 2189 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2190 2191 2192 /* ------------------------------ */ 2193 .balign 128 2194 .L_op_iget_byte: /* 0x56 */ 2195 /* File: x86_64/op_iget_byte.S */ 2196 /* File: x86_64/op_iget.S */ 2197 /* 2198 * General instance field get. 2199 * 2200 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short, iget-wide 2201 */ 2202 EXPORT_PC 2203 movzbq rINSTbl, %rcx # rcx <- BA 2204 movzwl 2(rPC), OUT_32_ARG0 # eax <- field ref CCCC 2205 sarl $4, %ecx # ecx <- B 2206 GET_VREG OUT_32_ARG1, %rcx # the object pointer 2207 movq OFF_FP_METHOD(rFP), OUT_ARG2 # referrer 2208 movq rSELF, OUT_ARG3 2209 call SYMBOL(artGetByteInstanceFromCode) 2210 movq rSELF, %rcx 2211 cmpq $0, THREAD_EXCEPTION_OFFSET(%rcx) 2212 jnz MterpException # bail out 2213 andb $0xf, rINSTbl # rINST <- A 2214 .if 0 2215 SET_VREG_OBJECT %eax, rINSTq # fp[A] <-value 2216 .else 2217 .if 0 2218 SET_WIDE_VREG %rax, rINSTq # fp[A] <-value 2219 .else 2220 SET_VREG %eax, rINSTq # fp[A] <-value 2221 .endif 2222 .endif 2223 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2224 2225 2226 /* ------------------------------ */ 2227 .balign 128 2228 .L_op_iget_char: /* 0x57 */ 2229 /* File: x86_64/op_iget_char.S */ 2230 /* File: x86_64/op_iget.S */ 2231 /* 2232 * General instance field get. 2233 * 2234 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short, iget-wide 2235 */ 2236 EXPORT_PC 2237 movzbq rINSTbl, %rcx # rcx <- BA 2238 movzwl 2(rPC), OUT_32_ARG0 # eax <- field ref CCCC 2239 sarl $4, %ecx # ecx <- B 2240 GET_VREG OUT_32_ARG1, %rcx # the object pointer 2241 movq OFF_FP_METHOD(rFP), OUT_ARG2 # referrer 2242 movq rSELF, OUT_ARG3 2243 call SYMBOL(artGetCharInstanceFromCode) 2244 movq rSELF, %rcx 2245 cmpq $0, THREAD_EXCEPTION_OFFSET(%rcx) 2246 jnz MterpException # bail out 2247 andb $0xf, rINSTbl # rINST <- A 2248 .if 0 2249 SET_VREG_OBJECT %eax, rINSTq # fp[A] <-value 2250 .else 2251 .if 0 2252 SET_WIDE_VREG %rax, rINSTq # fp[A] <-value 2253 .else 2254 SET_VREG %eax, rINSTq # fp[A] <-value 2255 .endif 2256 .endif 2257 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2258 2259 2260 /* ------------------------------ */ 2261 .balign 128 2262 .L_op_iget_short: /* 0x58 */ 2263 /* File: x86_64/op_iget_short.S */ 2264 /* File: x86_64/op_iget.S */ 2265 /* 2266 * General instance field get. 2267 * 2268 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short, iget-wide 2269 */ 2270 EXPORT_PC 2271 movzbq rINSTbl, %rcx # rcx <- BA 2272 movzwl 2(rPC), OUT_32_ARG0 # eax <- field ref CCCC 2273 sarl $4, %ecx # ecx <- B 2274 GET_VREG OUT_32_ARG1, %rcx # the object pointer 2275 movq OFF_FP_METHOD(rFP), OUT_ARG2 # referrer 2276 movq rSELF, OUT_ARG3 2277 call SYMBOL(artGetShortInstanceFromCode) 2278 movq rSELF, %rcx 2279 cmpq $0, THREAD_EXCEPTION_OFFSET(%rcx) 2280 jnz MterpException # bail out 2281 andb $0xf, rINSTbl # rINST <- A 2282 .if 0 2283 SET_VREG_OBJECT %eax, rINSTq # fp[A] <-value 2284 .else 2285 .if 0 2286 SET_WIDE_VREG %rax, rINSTq # fp[A] <-value 2287 .else 2288 SET_VREG %eax, rINSTq # fp[A] <-value 2289 .endif 2290 .endif 2291 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2292 2293 2294 /* ------------------------------ */ 2295 .balign 128 2296 .L_op_iput: /* 0x59 */ 2297 /* File: x86_64/op_iput.S */ 2298 /* 2299 * General 32-bit instance field put. 2300 * 2301 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2302 */ 2303 /* op vA, vB, field@CCCC */ 2304 .extern artSet32InstanceFromMterp 2305 EXPORT_PC 2306 movzwl 2(rPC), OUT_32_ARG0 # field ref <- 0000CCCC 2307 movzbq rINSTbl, %rcx # rcx<- BA 2308 sarl $4, %ecx # ecx<- B 2309 GET_VREG OUT_32_ARG1, %rcx # the object pointer 2310 andb $0xf, rINSTbl # rINST<- A 2311 GET_VREG OUT_32_ARG2, rINSTq # fp[A] 2312 movq OFF_FP_METHOD(rFP), OUT_ARG3 # referrer 2313 call SYMBOL(artSet32InstanceFromMterp) 2314 testb %al, %al 2315 jnz MterpPossibleException 2316 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2317 2318 /* ------------------------------ */ 2319 .balign 128 2320 .L_op_iput_wide: /* 0x5a */ 2321 /* File: x86_64/op_iput_wide.S */ 2322 /* iput-wide vA, vB, field@CCCC */ 2323 .extern artSet64InstanceFromMterp 2324 EXPORT_PC 2325 movzwq 2(rPC), OUT_ARG0 # field ref CCCC 2326 movzbq rINSTbl, %rcx # rcx <- BA 2327 sarl $4, %ecx # ecx <- B 2328 GET_VREG OUT_32_ARG1, %rcx # the object pointer 2329 andb $0xf, rINSTbl # rINST <- A 2330 leaq VREG_ADDRESS(rINSTq), OUT_ARG2 # &fp[A] 2331 movq OFF_FP_METHOD(rFP), OUT_ARG3 # referrer 2332 call SYMBOL(artSet64InstanceFromMterp) 2333 testb %al, %al 2334 jnz MterpPossibleException 2335 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2336 2337 /* ------------------------------ */ 2338 .balign 128 2339 .L_op_iput_object: /* 0x5b */ 2340 /* File: x86_64/op_iput_object.S */ 2341 EXPORT_PC 2342 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG0 2343 movq rPC, OUT_ARG1 2344 REFRESH_INST 91 2345 movl rINST, OUT_32_ARG2 2346 movq rSELF, OUT_ARG3 2347 call SYMBOL(MterpIputObject) 2348 testb %al, %al 2349 jz MterpException 2350 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2351 2352 /* ------------------------------ */ 2353 .balign 128 2354 .L_op_iput_boolean: /* 0x5c */ 2355 /* File: x86_64/op_iput_boolean.S */ 2356 /* File: x86_64/op_iput.S */ 2357 /* 2358 * General 32-bit instance field put. 2359 * 2360 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2361 */ 2362 /* op vA, vB, field@CCCC */ 2363 .extern artSet8InstanceFromMterp 2364 EXPORT_PC 2365 movzwl 2(rPC), OUT_32_ARG0 # field ref <- 0000CCCC 2366 movzbq rINSTbl, %rcx # rcx<- BA 2367 sarl $4, %ecx # ecx<- B 2368 GET_VREG OUT_32_ARG1, %rcx # the object pointer 2369 andb $0xf, rINSTbl # rINST<- A 2370 GET_VREG OUT_32_ARG2, rINSTq # fp[A] 2371 movq OFF_FP_METHOD(rFP), OUT_ARG3 # referrer 2372 call SYMBOL(artSet8InstanceFromMterp) 2373 testb %al, %al 2374 jnz MterpPossibleException 2375 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2376 2377 2378 /* ------------------------------ */ 2379 .balign 128 2380 .L_op_iput_byte: /* 0x5d */ 2381 /* File: x86_64/op_iput_byte.S */ 2382 /* File: x86_64/op_iput.S */ 2383 /* 2384 * General 32-bit instance field put. 2385 * 2386 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2387 */ 2388 /* op vA, vB, field@CCCC */ 2389 .extern artSet8InstanceFromMterp 2390 EXPORT_PC 2391 movzwl 2(rPC), OUT_32_ARG0 # field ref <- 0000CCCC 2392 movzbq rINSTbl, %rcx # rcx<- BA 2393 sarl $4, %ecx # ecx<- B 2394 GET_VREG OUT_32_ARG1, %rcx # the object pointer 2395 andb $0xf, rINSTbl # rINST<- A 2396 GET_VREG OUT_32_ARG2, rINSTq # fp[A] 2397 movq OFF_FP_METHOD(rFP), OUT_ARG3 # referrer 2398 call SYMBOL(artSet8InstanceFromMterp) 2399 testb %al, %al 2400 jnz MterpPossibleException 2401 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2402 2403 2404 /* ------------------------------ */ 2405 .balign 128 2406 .L_op_iput_char: /* 0x5e */ 2407 /* File: x86_64/op_iput_char.S */ 2408 /* File: x86_64/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 artSet16InstanceFromMterp 2416 EXPORT_PC 2417 movzwl 2(rPC), OUT_32_ARG0 # field ref <- 0000CCCC 2418 movzbq rINSTbl, %rcx # rcx<- BA 2419 sarl $4, %ecx # ecx<- B 2420 GET_VREG OUT_32_ARG1, %rcx # the object pointer 2421 andb $0xf, rINSTbl # rINST<- A 2422 GET_VREG OUT_32_ARG2, rINSTq # fp[A] 2423 movq OFF_FP_METHOD(rFP), OUT_ARG3 # referrer 2424 call SYMBOL(artSet16InstanceFromMterp) 2425 testb %al, %al 2426 jnz MterpPossibleException 2427 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2428 2429 2430 /* ------------------------------ */ 2431 .balign 128 2432 .L_op_iput_short: /* 0x5f */ 2433 /* File: x86_64/op_iput_short.S */ 2434 /* File: x86_64/op_iput.S */ 2435 /* 2436 * General 32-bit instance field put. 2437 * 2438 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2439 */ 2440 /* op vA, vB, field@CCCC */ 2441 .extern artSet16InstanceFromMterp 2442 EXPORT_PC 2443 movzwl 2(rPC), OUT_32_ARG0 # field ref <- 0000CCCC 2444 movzbq rINSTbl, %rcx # rcx<- BA 2445 sarl $4, %ecx # ecx<- B 2446 GET_VREG OUT_32_ARG1, %rcx # the object pointer 2447 andb $0xf, rINSTbl # rINST<- A 2448 GET_VREG OUT_32_ARG2, rINSTq # fp[A] 2449 movq OFF_FP_METHOD(rFP), OUT_ARG3 # referrer 2450 call SYMBOL(artSet16InstanceFromMterp) 2451 testb %al, %al 2452 jnz MterpPossibleException 2453 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2454 2455 2456 /* ------------------------------ */ 2457 .balign 128 2458 .L_op_sget: /* 0x60 */ 2459 /* File: x86_64/op_sget.S */ 2460 /* 2461 * General SGET handler wrapper. 2462 * 2463 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short, sget-wide 2464 */ 2465 /* op vAA, field@BBBB */ 2466 .extern MterpGet32Static 2467 EXPORT_PC 2468 movzwq 2(rPC), OUT_ARG0 # field ref CCCC 2469 movq OFF_FP_METHOD(rFP), OUT_ARG1 # referrer 2470 movq rSELF, OUT_ARG2 # self 2471 call SYMBOL(MterpGet32Static) 2472 movq rSELF, %rcx 2473 cmpl $0, THREAD_EXCEPTION_OFFSET(%rcx) 2474 jnz MterpException 2475 .if 0 2476 SET_VREG_OBJECT %eax, rINSTq # fp[A] <- value 2477 .else 2478 .if 0 2479 SET_WIDE_VREG %rax, rINSTq # fp[A] <- value 2480 .else 2481 SET_VREG %eax, rINSTq # fp[A] <- value 2482 .endif 2483 .endif 2484 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2485 2486 /* ------------------------------ */ 2487 .balign 128 2488 .L_op_sget_wide: /* 0x61 */ 2489 /* File: x86_64/op_sget_wide.S */ 2490 /* File: x86_64/op_sget.S */ 2491 /* 2492 * General SGET handler wrapper. 2493 * 2494 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short, sget-wide 2495 */ 2496 /* op vAA, field@BBBB */ 2497 .extern MterpGet64Static 2498 EXPORT_PC 2499 movzwq 2(rPC), OUT_ARG0 # field ref CCCC 2500 movq OFF_FP_METHOD(rFP), OUT_ARG1 # referrer 2501 movq rSELF, OUT_ARG2 # self 2502 call SYMBOL(MterpGet64Static) 2503 movq rSELF, %rcx 2504 cmpl $0, THREAD_EXCEPTION_OFFSET(%rcx) 2505 jnz MterpException 2506 .if 0 2507 SET_VREG_OBJECT %eax, rINSTq # fp[A] <- value 2508 .else 2509 .if 1 2510 SET_WIDE_VREG %rax, rINSTq # fp[A] <- value 2511 .else 2512 SET_VREG %eax, rINSTq # fp[A] <- value 2513 .endif 2514 .endif 2515 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2516 2517 2518 /* ------------------------------ */ 2519 .balign 128 2520 .L_op_sget_object: /* 0x62 */ 2521 /* File: x86_64/op_sget_object.S */ 2522 /* File: x86_64/op_sget.S */ 2523 /* 2524 * General SGET handler wrapper. 2525 * 2526 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short, sget-wide 2527 */ 2528 /* op vAA, field@BBBB */ 2529 .extern MterpGetObjStatic 2530 EXPORT_PC 2531 movzwq 2(rPC), OUT_ARG0 # field ref CCCC 2532 movq OFF_FP_METHOD(rFP), OUT_ARG1 # referrer 2533 movq rSELF, OUT_ARG2 # self 2534 call SYMBOL(MterpGetObjStatic) 2535 movq rSELF, %rcx 2536 cmpl $0, THREAD_EXCEPTION_OFFSET(%rcx) 2537 jnz MterpException 2538 .if 1 2539 SET_VREG_OBJECT %eax, rINSTq # fp[A] <- value 2540 .else 2541 .if 0 2542 SET_WIDE_VREG %rax, rINSTq # fp[A] <- value 2543 .else 2544 SET_VREG %eax, rINSTq # fp[A] <- value 2545 .endif 2546 .endif 2547 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2548 2549 2550 /* ------------------------------ */ 2551 .balign 128 2552 .L_op_sget_boolean: /* 0x63 */ 2553 /* File: x86_64/op_sget_boolean.S */ 2554 /* File: x86_64/op_sget.S */ 2555 /* 2556 * General SGET handler wrapper. 2557 * 2558 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short, sget-wide 2559 */ 2560 /* op vAA, field@BBBB */ 2561 .extern MterpGetBooleanStatic 2562 EXPORT_PC 2563 movzwq 2(rPC), OUT_ARG0 # field ref CCCC 2564 movq OFF_FP_METHOD(rFP), OUT_ARG1 # referrer 2565 movq rSELF, OUT_ARG2 # self 2566 call SYMBOL(MterpGetBooleanStatic) 2567 movq rSELF, %rcx 2568 cmpl $0, THREAD_EXCEPTION_OFFSET(%rcx) 2569 jnz MterpException 2570 .if 0 2571 SET_VREG_OBJECT %eax, rINSTq # fp[A] <- value 2572 .else 2573 .if 0 2574 SET_WIDE_VREG %rax, rINSTq # fp[A] <- value 2575 .else 2576 SET_VREG %eax, rINSTq # fp[A] <- value 2577 .endif 2578 .endif 2579 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2580 2581 2582 /* ------------------------------ */ 2583 .balign 128 2584 .L_op_sget_byte: /* 0x64 */ 2585 /* File: x86_64/op_sget_byte.S */ 2586 /* File: x86_64/op_sget.S */ 2587 /* 2588 * General SGET handler wrapper. 2589 * 2590 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short, sget-wide 2591 */ 2592 /* op vAA, field@BBBB */ 2593 .extern MterpGetByteStatic 2594 EXPORT_PC 2595 movzwq 2(rPC), OUT_ARG0 # field ref CCCC 2596 movq OFF_FP_METHOD(rFP), OUT_ARG1 # referrer 2597 movq rSELF, OUT_ARG2 # self 2598 call SYMBOL(MterpGetByteStatic) 2599 movq rSELF, %rcx 2600 cmpl $0, THREAD_EXCEPTION_OFFSET(%rcx) 2601 jnz MterpException 2602 .if 0 2603 SET_VREG_OBJECT %eax, rINSTq # fp[A] <- value 2604 .else 2605 .if 0 2606 SET_WIDE_VREG %rax, rINSTq # fp[A] <- value 2607 .else 2608 SET_VREG %eax, rINSTq # fp[A] <- value 2609 .endif 2610 .endif 2611 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2612 2613 2614 /* ------------------------------ */ 2615 .balign 128 2616 .L_op_sget_char: /* 0x65 */ 2617 /* File: x86_64/op_sget_char.S */ 2618 /* File: x86_64/op_sget.S */ 2619 /* 2620 * General SGET handler wrapper. 2621 * 2622 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short, sget-wide 2623 */ 2624 /* op vAA, field@BBBB */ 2625 .extern MterpGetCharStatic 2626 EXPORT_PC 2627 movzwq 2(rPC), OUT_ARG0 # field ref CCCC 2628 movq OFF_FP_METHOD(rFP), OUT_ARG1 # referrer 2629 movq rSELF, OUT_ARG2 # self 2630 call SYMBOL(MterpGetCharStatic) 2631 movq rSELF, %rcx 2632 cmpl $0, THREAD_EXCEPTION_OFFSET(%rcx) 2633 jnz MterpException 2634 .if 0 2635 SET_VREG_OBJECT %eax, rINSTq # fp[A] <- value 2636 .else 2637 .if 0 2638 SET_WIDE_VREG %rax, rINSTq # fp[A] <- value 2639 .else 2640 SET_VREG %eax, rINSTq # fp[A] <- value 2641 .endif 2642 .endif 2643 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2644 2645 2646 /* ------------------------------ */ 2647 .balign 128 2648 .L_op_sget_short: /* 0x66 */ 2649 /* File: x86_64/op_sget_short.S */ 2650 /* File: x86_64/op_sget.S */ 2651 /* 2652 * General SGET handler wrapper. 2653 * 2654 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short, sget-wide 2655 */ 2656 /* op vAA, field@BBBB */ 2657 .extern MterpGetShortStatic 2658 EXPORT_PC 2659 movzwq 2(rPC), OUT_ARG0 # field ref CCCC 2660 movq OFF_FP_METHOD(rFP), OUT_ARG1 # referrer 2661 movq rSELF, OUT_ARG2 # self 2662 call SYMBOL(MterpGetShortStatic) 2663 movq rSELF, %rcx 2664 cmpl $0, THREAD_EXCEPTION_OFFSET(%rcx) 2665 jnz MterpException 2666 .if 0 2667 SET_VREG_OBJECT %eax, rINSTq # fp[A] <- value 2668 .else 2669 .if 0 2670 SET_WIDE_VREG %rax, rINSTq # fp[A] <- value 2671 .else 2672 SET_VREG %eax, rINSTq # fp[A] <- value 2673 .endif 2674 .endif 2675 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2676 2677 2678 /* ------------------------------ */ 2679 .balign 128 2680 .L_op_sput: /* 0x67 */ 2681 /* File: x86_64/op_sput.S */ 2682 /* 2683 * General SPUT handler wrapper. 2684 * 2685 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2686 */ 2687 /* op vAA, field@BBBB */ 2688 .extern MterpSet32Static 2689 EXPORT_PC 2690 movzwq 2(rPC), OUT_ARG0 # field ref BBBB 2691 GET_VREG OUT_32_ARG1, rINSTq # fp[AA] 2692 movq OFF_FP_METHOD(rFP), OUT_ARG2 # referrer 2693 movq rSELF, OUT_ARG3 # self 2694 call SYMBOL(MterpSet32Static) 2695 testb %al, %al 2696 jnz MterpException 2697 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2698 2699 /* ------------------------------ */ 2700 .balign 128 2701 .L_op_sput_wide: /* 0x68 */ 2702 /* File: x86_64/op_sput_wide.S */ 2703 /* 2704 * SPUT_WIDE handler wrapper. 2705 * 2706 */ 2707 /* sput-wide vAA, field@BBBB */ 2708 .extern MterpSet64Static 2709 EXPORT_PC 2710 movzwq 2(rPC), OUT_ARG0 # field ref BBBB 2711 leaq VREG_ADDRESS(rINSTq), OUT_ARG1 # &fp[AA] 2712 movq OFF_FP_METHOD(rFP), OUT_ARG2 # referrer 2713 movq rSELF, OUT_ARG3 # self 2714 call SYMBOL(MterpSet64Static) 2715 testb %al, %al 2716 jnz MterpException 2717 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2718 2719 /* ------------------------------ */ 2720 .balign 128 2721 .L_op_sput_object: /* 0x69 */ 2722 /* File: x86_64/op_sput_object.S */ 2723 EXPORT_PC 2724 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG0 2725 movq rPC, OUT_ARG1 2726 REFRESH_INST 105 2727 movq rINSTq, OUT_ARG2 2728 movq rSELF, OUT_ARG3 2729 call SYMBOL(MterpSputObject) 2730 testb %al, %al 2731 jz MterpException 2732 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2733 2734 /* ------------------------------ */ 2735 .balign 128 2736 .L_op_sput_boolean: /* 0x6a */ 2737 /* File: x86_64/op_sput_boolean.S */ 2738 /* File: x86_64/op_sput.S */ 2739 /* 2740 * General SPUT handler wrapper. 2741 * 2742 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2743 */ 2744 /* op vAA, field@BBBB */ 2745 .extern MterpSetBooleanStatic 2746 EXPORT_PC 2747 movzwq 2(rPC), OUT_ARG0 # field ref BBBB 2748 GET_VREG OUT_32_ARG1, rINSTq # fp[AA] 2749 movq OFF_FP_METHOD(rFP), OUT_ARG2 # referrer 2750 movq rSELF, OUT_ARG3 # self 2751 call SYMBOL(MterpSetBooleanStatic) 2752 testb %al, %al 2753 jnz MterpException 2754 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2755 2756 2757 /* ------------------------------ */ 2758 .balign 128 2759 .L_op_sput_byte: /* 0x6b */ 2760 /* File: x86_64/op_sput_byte.S */ 2761 /* File: x86_64/op_sput.S */ 2762 /* 2763 * General SPUT handler wrapper. 2764 * 2765 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2766 */ 2767 /* op vAA, field@BBBB */ 2768 .extern MterpSetByteStatic 2769 EXPORT_PC 2770 movzwq 2(rPC), OUT_ARG0 # field ref BBBB 2771 GET_VREG OUT_32_ARG1, rINSTq # fp[AA] 2772 movq OFF_FP_METHOD(rFP), OUT_ARG2 # referrer 2773 movq rSELF, OUT_ARG3 # self 2774 call SYMBOL(MterpSetByteStatic) 2775 testb %al, %al 2776 jnz MterpException 2777 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2778 2779 2780 /* ------------------------------ */ 2781 .balign 128 2782 .L_op_sput_char: /* 0x6c */ 2783 /* File: x86_64/op_sput_char.S */ 2784 /* File: x86_64/op_sput.S */ 2785 /* 2786 * General SPUT handler wrapper. 2787 * 2788 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2789 */ 2790 /* op vAA, field@BBBB */ 2791 .extern MterpSetCharStatic 2792 EXPORT_PC 2793 movzwq 2(rPC), OUT_ARG0 # field ref BBBB 2794 GET_VREG OUT_32_ARG1, rINSTq # fp[AA] 2795 movq OFF_FP_METHOD(rFP), OUT_ARG2 # referrer 2796 movq rSELF, OUT_ARG3 # self 2797 call SYMBOL(MterpSetCharStatic) 2798 testb %al, %al 2799 jnz MterpException 2800 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2801 2802 2803 /* ------------------------------ */ 2804 .balign 128 2805 .L_op_sput_short: /* 0x6d */ 2806 /* File: x86_64/op_sput_short.S */ 2807 /* File: x86_64/op_sput.S */ 2808 /* 2809 * General SPUT handler wrapper. 2810 * 2811 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2812 */ 2813 /* op vAA, field@BBBB */ 2814 .extern MterpSetShortStatic 2815 EXPORT_PC 2816 movzwq 2(rPC), OUT_ARG0 # field ref BBBB 2817 GET_VREG OUT_32_ARG1, rINSTq # fp[AA] 2818 movq OFF_FP_METHOD(rFP), OUT_ARG2 # referrer 2819 movq rSELF, OUT_ARG3 # self 2820 call SYMBOL(MterpSetShortStatic) 2821 testb %al, %al 2822 jnz MterpException 2823 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2824 2825 2826 /* ------------------------------ */ 2827 .balign 128 2828 .L_op_invoke_virtual: /* 0x6e */ 2829 /* File: x86_64/op_invoke_virtual.S */ 2830 /* File: x86_64/invoke.S */ 2831 /* 2832 * Generic invoke handler wrapper. 2833 */ 2834 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2835 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2836 .extern MterpInvokeVirtual 2837 EXPORT_PC 2838 movq rSELF, OUT_ARG0 2839 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 2840 movq rPC, OUT_ARG2 2841 REFRESH_INST 110 2842 movl rINST, OUT_32_ARG3 2843 call SYMBOL(MterpInvokeVirtual) 2844 testb %al, %al 2845 jz MterpException 2846 ADVANCE_PC 3 2847 call SYMBOL(MterpShouldSwitchInterpreters) 2848 testb %al, %al 2849 jnz MterpFallback 2850 FETCH_INST 2851 GOTO_NEXT 2852 2853 /* 2854 * Handle a virtual method call. 2855 * 2856 * for: invoke-virtual, invoke-virtual/range 2857 */ 2858 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2859 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2860 2861 /* ------------------------------ */ 2862 .balign 128 2863 .L_op_invoke_super: /* 0x6f */ 2864 /* File: x86_64/op_invoke_super.S */ 2865 /* File: x86_64/invoke.S */ 2866 /* 2867 * Generic invoke handler wrapper. 2868 */ 2869 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2870 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2871 .extern MterpInvokeSuper 2872 EXPORT_PC 2873 movq rSELF, OUT_ARG0 2874 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 2875 movq rPC, OUT_ARG2 2876 REFRESH_INST 111 2877 movl rINST, OUT_32_ARG3 2878 call SYMBOL(MterpInvokeSuper) 2879 testb %al, %al 2880 jz MterpException 2881 ADVANCE_PC 3 2882 call SYMBOL(MterpShouldSwitchInterpreters) 2883 testb %al, %al 2884 jnz MterpFallback 2885 FETCH_INST 2886 GOTO_NEXT 2887 2888 /* 2889 * Handle a "super" method call. 2890 * 2891 * for: invoke-super, invoke-super/range 2892 */ 2893 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2894 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2895 2896 /* ------------------------------ */ 2897 .balign 128 2898 .L_op_invoke_direct: /* 0x70 */ 2899 /* File: x86_64/op_invoke_direct.S */ 2900 /* File: x86_64/invoke.S */ 2901 /* 2902 * Generic invoke handler wrapper. 2903 */ 2904 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2905 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2906 .extern MterpInvokeDirect 2907 EXPORT_PC 2908 movq rSELF, OUT_ARG0 2909 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 2910 movq rPC, OUT_ARG2 2911 REFRESH_INST 112 2912 movl rINST, OUT_32_ARG3 2913 call SYMBOL(MterpInvokeDirect) 2914 testb %al, %al 2915 jz MterpException 2916 ADVANCE_PC 3 2917 call SYMBOL(MterpShouldSwitchInterpreters) 2918 testb %al, %al 2919 jnz MterpFallback 2920 FETCH_INST 2921 GOTO_NEXT 2922 2923 2924 /* ------------------------------ */ 2925 .balign 128 2926 .L_op_invoke_static: /* 0x71 */ 2927 /* File: x86_64/op_invoke_static.S */ 2928 /* File: x86_64/invoke.S */ 2929 /* 2930 * Generic invoke handler wrapper. 2931 */ 2932 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2933 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2934 .extern MterpInvokeStatic 2935 EXPORT_PC 2936 movq rSELF, OUT_ARG0 2937 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 2938 movq rPC, OUT_ARG2 2939 REFRESH_INST 113 2940 movl rINST, OUT_32_ARG3 2941 call SYMBOL(MterpInvokeStatic) 2942 testb %al, %al 2943 jz MterpException 2944 ADVANCE_PC 3 2945 call SYMBOL(MterpShouldSwitchInterpreters) 2946 testb %al, %al 2947 jnz MterpFallback 2948 FETCH_INST 2949 GOTO_NEXT 2950 2951 2952 2953 /* ------------------------------ */ 2954 .balign 128 2955 .L_op_invoke_interface: /* 0x72 */ 2956 /* File: x86_64/op_invoke_interface.S */ 2957 /* File: x86_64/invoke.S */ 2958 /* 2959 * Generic invoke handler wrapper. 2960 */ 2961 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2962 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2963 .extern MterpInvokeInterface 2964 EXPORT_PC 2965 movq rSELF, OUT_ARG0 2966 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 2967 movq rPC, OUT_ARG2 2968 REFRESH_INST 114 2969 movl rINST, OUT_32_ARG3 2970 call SYMBOL(MterpInvokeInterface) 2971 testb %al, %al 2972 jz MterpException 2973 ADVANCE_PC 3 2974 call SYMBOL(MterpShouldSwitchInterpreters) 2975 testb %al, %al 2976 jnz MterpFallback 2977 FETCH_INST 2978 GOTO_NEXT 2979 2980 /* 2981 * Handle an interface method call. 2982 * 2983 * for: invoke-interface, invoke-interface/range 2984 */ 2985 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2986 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2987 2988 /* ------------------------------ */ 2989 .balign 128 2990 .L_op_return_void_no_barrier: /* 0x73 */ 2991 /* File: x86_64/op_return_void_no_barrier.S */ 2992 movq rSELF, OUT_ARG0 2993 testl $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(OUT_ARG0) 2994 jz 1f 2995 call SYMBOL(MterpSuspendCheck) 2996 1: 2997 xorq %rax, %rax 2998 jmp MterpReturn 2999 3000 /* ------------------------------ */ 3001 .balign 128 3002 .L_op_invoke_virtual_range: /* 0x74 */ 3003 /* File: x86_64/op_invoke_virtual_range.S */ 3004 /* File: x86_64/invoke.S */ 3005 /* 3006 * Generic invoke handler wrapper. 3007 */ 3008 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3009 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3010 .extern MterpInvokeVirtualRange 3011 EXPORT_PC 3012 movq rSELF, OUT_ARG0 3013 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 3014 movq rPC, OUT_ARG2 3015 REFRESH_INST 116 3016 movl rINST, OUT_32_ARG3 3017 call SYMBOL(MterpInvokeVirtualRange) 3018 testb %al, %al 3019 jz MterpException 3020 ADVANCE_PC 3 3021 call SYMBOL(MterpShouldSwitchInterpreters) 3022 testb %al, %al 3023 jnz MterpFallback 3024 FETCH_INST 3025 GOTO_NEXT 3026 3027 3028 /* ------------------------------ */ 3029 .balign 128 3030 .L_op_invoke_super_range: /* 0x75 */ 3031 /* File: x86_64/op_invoke_super_range.S */ 3032 /* File: x86_64/invoke.S */ 3033 /* 3034 * Generic invoke handler wrapper. 3035 */ 3036 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3037 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3038 .extern MterpInvokeSuperRange 3039 EXPORT_PC 3040 movq rSELF, OUT_ARG0 3041 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 3042 movq rPC, OUT_ARG2 3043 REFRESH_INST 117 3044 movl rINST, OUT_32_ARG3 3045 call SYMBOL(MterpInvokeSuperRange) 3046 testb %al, %al 3047 jz MterpException 3048 ADVANCE_PC 3 3049 call SYMBOL(MterpShouldSwitchInterpreters) 3050 testb %al, %al 3051 jnz MterpFallback 3052 FETCH_INST 3053 GOTO_NEXT 3054 3055 3056 /* ------------------------------ */ 3057 .balign 128 3058 .L_op_invoke_direct_range: /* 0x76 */ 3059 /* File: x86_64/op_invoke_direct_range.S */ 3060 /* File: x86_64/invoke.S */ 3061 /* 3062 * Generic invoke handler wrapper. 3063 */ 3064 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3065 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3066 .extern MterpInvokeDirectRange 3067 EXPORT_PC 3068 movq rSELF, OUT_ARG0 3069 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 3070 movq rPC, OUT_ARG2 3071 REFRESH_INST 118 3072 movl rINST, OUT_32_ARG3 3073 call SYMBOL(MterpInvokeDirectRange) 3074 testb %al, %al 3075 jz MterpException 3076 ADVANCE_PC 3 3077 call SYMBOL(MterpShouldSwitchInterpreters) 3078 testb %al, %al 3079 jnz MterpFallback 3080 FETCH_INST 3081 GOTO_NEXT 3082 3083 3084 /* ------------------------------ */ 3085 .balign 128 3086 .L_op_invoke_static_range: /* 0x77 */ 3087 /* File: x86_64/op_invoke_static_range.S */ 3088 /* File: x86_64/invoke.S */ 3089 /* 3090 * Generic invoke handler wrapper. 3091 */ 3092 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3093 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3094 .extern MterpInvokeStaticRange 3095 EXPORT_PC 3096 movq rSELF, OUT_ARG0 3097 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 3098 movq rPC, OUT_ARG2 3099 REFRESH_INST 119 3100 movl rINST, OUT_32_ARG3 3101 call SYMBOL(MterpInvokeStaticRange) 3102 testb %al, %al 3103 jz MterpException 3104 ADVANCE_PC 3 3105 call SYMBOL(MterpShouldSwitchInterpreters) 3106 testb %al, %al 3107 jnz MterpFallback 3108 FETCH_INST 3109 GOTO_NEXT 3110 3111 3112 /* ------------------------------ */ 3113 .balign 128 3114 .L_op_invoke_interface_range: /* 0x78 */ 3115 /* File: x86_64/op_invoke_interface_range.S */ 3116 /* File: x86_64/invoke.S */ 3117 /* 3118 * Generic invoke handler wrapper. 3119 */ 3120 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3121 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3122 .extern MterpInvokeInterfaceRange 3123 EXPORT_PC 3124 movq rSELF, OUT_ARG0 3125 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 3126 movq rPC, OUT_ARG2 3127 REFRESH_INST 120 3128 movl rINST, OUT_32_ARG3 3129 call SYMBOL(MterpInvokeInterfaceRange) 3130 testb %al, %al 3131 jz MterpException 3132 ADVANCE_PC 3 3133 call SYMBOL(MterpShouldSwitchInterpreters) 3134 testb %al, %al 3135 jnz MterpFallback 3136 FETCH_INST 3137 GOTO_NEXT 3138 3139 3140 /* ------------------------------ */ 3141 .balign 128 3142 .L_op_unused_79: /* 0x79 */ 3143 /* File: x86_64/op_unused_79.S */ 3144 /* File: x86_64/unused.S */ 3145 /* 3146 * Bail to reference interpreter to throw. 3147 */ 3148 jmp MterpFallback 3149 3150 3151 /* ------------------------------ */ 3152 .balign 128 3153 .L_op_unused_7a: /* 0x7a */ 3154 /* File: x86_64/op_unused_7a.S */ 3155 /* File: x86_64/unused.S */ 3156 /* 3157 * Bail to reference interpreter to throw. 3158 */ 3159 jmp MterpFallback 3160 3161 3162 /* ------------------------------ */ 3163 .balign 128 3164 .L_op_neg_int: /* 0x7b */ 3165 /* File: x86_64/op_neg_int.S */ 3166 /* File: x86_64/unop.S */ 3167 /* 3168 * Generic 32/64-bit unary operation. Provide an "instr" line that 3169 * specifies an instruction that performs "result = op eax". 3170 */ 3171 /* unop vA, vB */ 3172 movl rINST, %ecx # rcx <- A+ 3173 sarl $4,rINST # rINST <- B 3174 .if 0 3175 GET_WIDE_VREG %rax, rINSTq # rax <- vB 3176 .else 3177 GET_VREG %eax, rINSTq # eax <- vB 3178 .endif 3179 andb $0xf,%cl # ecx <- A 3180 3181 negl %eax 3182 .if 0 3183 SET_WIDE_VREG %rax, %rcx 3184 .else 3185 SET_VREG %eax, %rcx 3186 .endif 3187 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3188 3189 3190 /* ------------------------------ */ 3191 .balign 128 3192 .L_op_not_int: /* 0x7c */ 3193 /* File: x86_64/op_not_int.S */ 3194 /* File: x86_64/unop.S */ 3195 /* 3196 * Generic 32/64-bit unary operation. Provide an "instr" line that 3197 * specifies an instruction that performs "result = op eax". 3198 */ 3199 /* unop vA, vB */ 3200 movl rINST, %ecx # rcx <- A+ 3201 sarl $4,rINST # rINST <- B 3202 .if 0 3203 GET_WIDE_VREG %rax, rINSTq # rax <- vB 3204 .else 3205 GET_VREG %eax, rINSTq # eax <- vB 3206 .endif 3207 andb $0xf,%cl # ecx <- A 3208 3209 notl %eax 3210 .if 0 3211 SET_WIDE_VREG %rax, %rcx 3212 .else 3213 SET_VREG %eax, %rcx 3214 .endif 3215 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3216 3217 3218 /* ------------------------------ */ 3219 .balign 128 3220 .L_op_neg_long: /* 0x7d */ 3221 /* File: x86_64/op_neg_long.S */ 3222 /* File: x86_64/unop.S */ 3223 /* 3224 * Generic 32/64-bit unary operation. Provide an "instr" line that 3225 * specifies an instruction that performs "result = op eax". 3226 */ 3227 /* unop vA, vB */ 3228 movl rINST, %ecx # rcx <- A+ 3229 sarl $4,rINST # rINST <- B 3230 .if 1 3231 GET_WIDE_VREG %rax, rINSTq # rax <- vB 3232 .else 3233 GET_VREG %eax, rINSTq # eax <- vB 3234 .endif 3235 andb $0xf,%cl # ecx <- A 3236 3237 negq %rax 3238 .if 1 3239 SET_WIDE_VREG %rax, %rcx 3240 .else 3241 SET_VREG %eax, %rcx 3242 .endif 3243 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3244 3245 3246 /* ------------------------------ */ 3247 .balign 128 3248 .L_op_not_long: /* 0x7e */ 3249 /* File: x86_64/op_not_long.S */ 3250 /* File: x86_64/unop.S */ 3251 /* 3252 * Generic 32/64-bit unary operation. Provide an "instr" line that 3253 * specifies an instruction that performs "result = op eax". 3254 */ 3255 /* unop vA, vB */ 3256 movl rINST, %ecx # rcx <- A+ 3257 sarl $4,rINST # rINST <- B 3258 .if 1 3259 GET_WIDE_VREG %rax, rINSTq # rax <- vB 3260 .else 3261 GET_VREG %eax, rINSTq # eax <- vB 3262 .endif 3263 andb $0xf,%cl # ecx <- A 3264 3265 notq %rax 3266 .if 1 3267 SET_WIDE_VREG %rax, %rcx 3268 .else 3269 SET_VREG %eax, %rcx 3270 .endif 3271 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3272 3273 3274 /* ------------------------------ */ 3275 .balign 128 3276 .L_op_neg_float: /* 0x7f */ 3277 /* File: x86_64/op_neg_float.S */ 3278 /* File: x86_64/unop.S */ 3279 /* 3280 * Generic 32/64-bit unary operation. Provide an "instr" line that 3281 * specifies an instruction that performs "result = op eax". 3282 */ 3283 /* unop vA, vB */ 3284 movl rINST, %ecx # rcx <- A+ 3285 sarl $4,rINST # rINST <- B 3286 .if 0 3287 GET_WIDE_VREG %rax, rINSTq # rax <- vB 3288 .else 3289 GET_VREG %eax, rINSTq # eax <- vB 3290 .endif 3291 andb $0xf,%cl # ecx <- A 3292 3293 xorl $0x80000000, %eax 3294 .if 0 3295 SET_WIDE_VREG %rax, %rcx 3296 .else 3297 SET_VREG %eax, %rcx 3298 .endif 3299 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3300 3301 3302 /* ------------------------------ */ 3303 .balign 128 3304 .L_op_neg_double: /* 0x80 */ 3305 /* File: x86_64/op_neg_double.S */ 3306 /* File: x86_64/unop.S */ 3307 /* 3308 * Generic 32/64-bit unary operation. Provide an "instr" line that 3309 * specifies an instruction that performs "result = op eax". 3310 */ 3311 /* unop vA, vB */ 3312 movl rINST, %ecx # rcx <- A+ 3313 sarl $4,rINST # rINST <- B 3314 .if 1 3315 GET_WIDE_VREG %rax, rINSTq # rax <- vB 3316 .else 3317 GET_VREG %eax, rINSTq # eax <- vB 3318 .endif 3319 andb $0xf,%cl # ecx <- A 3320 movq $0x8000000000000000, %rsi 3321 xorq %rsi, %rax 3322 .if 1 3323 SET_WIDE_VREG %rax, %rcx 3324 .else 3325 SET_VREG %eax, %rcx 3326 .endif 3327 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3328 3329 3330 /* ------------------------------ */ 3331 .balign 128 3332 .L_op_int_to_long: /* 0x81 */ 3333 /* File: x86_64/op_int_to_long.S */ 3334 /* int to long vA, vB */ 3335 movzbq rINSTbl, %rax # rax <- +A 3336 sarl $4, %eax # eax <- B 3337 andb $0xf, rINSTbl # rINST <- A 3338 movslq VREG_ADDRESS(%rax), %rax 3339 SET_WIDE_VREG %rax, rINSTq # v[A] <- %rax 3340 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3341 3342 3343 /* ------------------------------ */ 3344 .balign 128 3345 .L_op_int_to_float: /* 0x82 */ 3346 /* File: x86_64/op_int_to_float.S */ 3347 /* File: x86_64/fpcvt.S */ 3348 /* 3349 * Generic 32-bit FP conversion operation. 3350 */ 3351 /* unop vA, vB */ 3352 movl rINST, %ecx # rcx <- A+ 3353 sarl $4, rINST # rINST <- B 3354 andb $0xf, %cl # ecx <- A 3355 cvtsi2ssl VREG_ADDRESS(rINSTq), %xmm0 3356 .if 0 3357 movsd %xmm0, VREG_ADDRESS(%rcx) 3358 CLEAR_WIDE_REF %rcx 3359 .else 3360 movss %xmm0, VREG_ADDRESS(%rcx) 3361 CLEAR_REF %rcx 3362 .endif 3363 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3364 3365 3366 /* ------------------------------ */ 3367 .balign 128 3368 .L_op_int_to_double: /* 0x83 */ 3369 /* File: x86_64/op_int_to_double.S */ 3370 /* File: x86_64/fpcvt.S */ 3371 /* 3372 * Generic 32-bit FP conversion operation. 3373 */ 3374 /* unop vA, vB */ 3375 movl rINST, %ecx # rcx <- A+ 3376 sarl $4, rINST # rINST <- B 3377 andb $0xf, %cl # ecx <- A 3378 cvtsi2sdl VREG_ADDRESS(rINSTq), %xmm0 3379 .if 1 3380 movsd %xmm0, VREG_ADDRESS(%rcx) 3381 CLEAR_WIDE_REF %rcx 3382 .else 3383 movss %xmm0, VREG_ADDRESS(%rcx) 3384 CLEAR_REF %rcx 3385 .endif 3386 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3387 3388 3389 /* ------------------------------ */ 3390 .balign 128 3391 .L_op_long_to_int: /* 0x84 */ 3392 /* File: x86_64/op_long_to_int.S */ 3393 /* we ignore the high word, making this equivalent to a 32-bit reg move */ 3394 /* File: x86_64/op_move.S */ 3395 /* for move, move-object, long-to-int */ 3396 /* op vA, vB */ 3397 movl rINST, %eax # eax <- BA 3398 andb $0xf, %al # eax <- A 3399 shrl $4, rINST # rINST <- B 3400 GET_VREG %edx, rINSTq 3401 .if 0 3402 SET_VREG_OBJECT %edx, %rax # fp[A] <- fp[B] 3403 .else 3404 SET_VREG %edx, %rax # fp[A] <- fp[B] 3405 .endif 3406 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3407 3408 3409 /* ------------------------------ */ 3410 .balign 128 3411 .L_op_long_to_float: /* 0x85 */ 3412 /* File: x86_64/op_long_to_float.S */ 3413 /* File: x86_64/fpcvt.S */ 3414 /* 3415 * Generic 32-bit FP conversion operation. 3416 */ 3417 /* unop vA, vB */ 3418 movl rINST, %ecx # rcx <- A+ 3419 sarl $4, rINST # rINST <- B 3420 andb $0xf, %cl # ecx <- A 3421 cvtsi2ssq VREG_ADDRESS(rINSTq), %xmm0 3422 .if 0 3423 movsd %xmm0, VREG_ADDRESS(%rcx) 3424 CLEAR_WIDE_REF %rcx 3425 .else 3426 movss %xmm0, VREG_ADDRESS(%rcx) 3427 CLEAR_REF %rcx 3428 .endif 3429 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3430 3431 3432 /* ------------------------------ */ 3433 .balign 128 3434 .L_op_long_to_double: /* 0x86 */ 3435 /* File: x86_64/op_long_to_double.S */ 3436 /* File: x86_64/fpcvt.S */ 3437 /* 3438 * Generic 32-bit FP conversion operation. 3439 */ 3440 /* unop vA, vB */ 3441 movl rINST, %ecx # rcx <- A+ 3442 sarl $4, rINST # rINST <- B 3443 andb $0xf, %cl # ecx <- A 3444 cvtsi2sdq VREG_ADDRESS(rINSTq), %xmm0 3445 .if 1 3446 movsd %xmm0, VREG_ADDRESS(%rcx) 3447 CLEAR_WIDE_REF %rcx 3448 .else 3449 movss %xmm0, VREG_ADDRESS(%rcx) 3450 CLEAR_REF %rcx 3451 .endif 3452 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3453 3454 3455 /* ------------------------------ */ 3456 .balign 128 3457 .L_op_float_to_int: /* 0x87 */ 3458 /* File: x86_64/op_float_to_int.S */ 3459 /* File: x86_64/cvtfp_int.S */ 3460 /* On fp to int conversions, Java requires that 3461 * if the result > maxint, it should be clamped to maxint. If it is less 3462 * than minint, it should be clamped to minint. If it is a nan, the result 3463 * should be zero. Further, the rounding mode is to truncate. 3464 */ 3465 /* float/double to int/long vA, vB */ 3466 movl rINST, %ecx # rcx <- A+ 3467 sarl $4, rINST # rINST <- B 3468 andb $0xf, %cl # ecx <- A 3469 movss VREG_ADDRESS(rINSTq), %xmm0 3470 movl $0x7fffffff, %eax 3471 cvtsi2ssl %eax, %xmm1 3472 comiss %xmm1, %xmm0 3473 jae 1f 3474 jp 2f 3475 cvttss2sil %xmm0, %eax 3476 jmp 1f 3477 2: 3478 xorl %eax, %eax 3479 1: 3480 .if 0 3481 SET_WIDE_VREG %eax, %rcx 3482 .else 3483 SET_VREG %eax, %rcx 3484 .endif 3485 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3486 3487 3488 /* ------------------------------ */ 3489 .balign 128 3490 .L_op_float_to_long: /* 0x88 */ 3491 /* File: x86_64/op_float_to_long.S */ 3492 /* File: x86_64/cvtfp_int.S */ 3493 /* On fp to int conversions, Java requires that 3494 * if the result > maxint, it should be clamped to maxint. If it is less 3495 * than minint, it should be clamped to minint. If it is a nan, the result 3496 * should be zero. Further, the rounding mode is to truncate. 3497 */ 3498 /* float/double to int/long vA, vB */ 3499 movl rINST, %ecx # rcx <- A+ 3500 sarl $4, rINST # rINST <- B 3501 andb $0xf, %cl # ecx <- A 3502 movss VREG_ADDRESS(rINSTq), %xmm0 3503 movq $0x7fffffffffffffff, %rax 3504 cvtsi2ssq %rax, %xmm1 3505 comiss %xmm1, %xmm0 3506 jae 1f 3507 jp 2f 3508 cvttss2siq %xmm0, %rax 3509 jmp 1f 3510 2: 3511 xorq %rax, %rax 3512 1: 3513 .if 1 3514 SET_WIDE_VREG %rax, %rcx 3515 .else 3516 SET_VREG %rax, %rcx 3517 .endif 3518 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3519 3520 3521 /* ------------------------------ */ 3522 .balign 128 3523 .L_op_float_to_double: /* 0x89 */ 3524 /* File: x86_64/op_float_to_double.S */ 3525 /* File: x86_64/fpcvt.S */ 3526 /* 3527 * Generic 32-bit FP conversion operation. 3528 */ 3529 /* unop vA, vB */ 3530 movl rINST, %ecx # rcx <- A+ 3531 sarl $4, rINST # rINST <- B 3532 andb $0xf, %cl # ecx <- A 3533 cvtss2sd VREG_ADDRESS(rINSTq), %xmm0 3534 .if 1 3535 movsd %xmm0, VREG_ADDRESS(%rcx) 3536 CLEAR_WIDE_REF %rcx 3537 .else 3538 movss %xmm0, VREG_ADDRESS(%rcx) 3539 CLEAR_REF %rcx 3540 .endif 3541 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3542 3543 3544 /* ------------------------------ */ 3545 .balign 128 3546 .L_op_double_to_int: /* 0x8a */ 3547 /* File: x86_64/op_double_to_int.S */ 3548 /* File: x86_64/cvtfp_int.S */ 3549 /* On fp to int conversions, Java requires that 3550 * if the result > maxint, it should be clamped to maxint. If it is less 3551 * than minint, it should be clamped to minint. If it is a nan, the result 3552 * should be zero. Further, the rounding mode is to truncate. 3553 */ 3554 /* float/double to int/long vA, vB */ 3555 movl rINST, %ecx # rcx <- A+ 3556 sarl $4, rINST # rINST <- B 3557 andb $0xf, %cl # ecx <- A 3558 movsd VREG_ADDRESS(rINSTq), %xmm0 3559 movl $0x7fffffff, %eax 3560 cvtsi2sdl %eax, %xmm1 3561 comisd %xmm1, %xmm0 3562 jae 1f 3563 jp 2f 3564 cvttsd2sil %xmm0, %eax 3565 jmp 1f 3566 2: 3567 xorl %eax, %eax 3568 1: 3569 .if 0 3570 SET_WIDE_VREG %eax, %rcx 3571 .else 3572 SET_VREG %eax, %rcx 3573 .endif 3574 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3575 3576 3577 /* ------------------------------ */ 3578 .balign 128 3579 .L_op_double_to_long: /* 0x8b */ 3580 /* File: x86_64/op_double_to_long.S */ 3581 /* File: x86_64/cvtfp_int.S */ 3582 /* On fp to int conversions, Java requires that 3583 * if the result > maxint, it should be clamped to maxint. If it is less 3584 * than minint, it should be clamped to minint. If it is a nan, the result 3585 * should be zero. Further, the rounding mode is to truncate. 3586 */ 3587 /* float/double to int/long vA, vB */ 3588 movl rINST, %ecx # rcx <- A+ 3589 sarl $4, rINST # rINST <- B 3590 andb $0xf, %cl # ecx <- A 3591 movsd VREG_ADDRESS(rINSTq), %xmm0 3592 movq $0x7fffffffffffffff, %rax 3593 cvtsi2sdq %rax, %xmm1 3594 comisd %xmm1, %xmm0 3595 jae 1f 3596 jp 2f 3597 cvttsd2siq %xmm0, %rax 3598 jmp 1f 3599 2: 3600 xorq %rax, %rax 3601 1: 3602 .if 1 3603 SET_WIDE_VREG %rax, %rcx 3604 .else 3605 SET_VREG %rax, %rcx 3606 .endif 3607 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3608 3609 3610 /* ------------------------------ */ 3611 .balign 128 3612 .L_op_double_to_float: /* 0x8c */ 3613 /* File: x86_64/op_double_to_float.S */ 3614 /* File: x86_64/fpcvt.S */ 3615 /* 3616 * Generic 32-bit FP conversion operation. 3617 */ 3618 /* unop vA, vB */ 3619 movl rINST, %ecx # rcx <- A+ 3620 sarl $4, rINST # rINST <- B 3621 andb $0xf, %cl # ecx <- A 3622 cvtsd2ss VREG_ADDRESS(rINSTq), %xmm0 3623 .if 0 3624 movsd %xmm0, VREG_ADDRESS(%rcx) 3625 CLEAR_WIDE_REF %rcx 3626 .else 3627 movss %xmm0, VREG_ADDRESS(%rcx) 3628 CLEAR_REF %rcx 3629 .endif 3630 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3631 3632 3633 /* ------------------------------ */ 3634 .balign 128 3635 .L_op_int_to_byte: /* 0x8d */ 3636 /* File: x86_64/op_int_to_byte.S */ 3637 /* File: x86_64/unop.S */ 3638 /* 3639 * Generic 32/64-bit unary operation. Provide an "instr" line that 3640 * specifies an instruction that performs "result = op eax". 3641 */ 3642 /* unop vA, vB */ 3643 movl rINST, %ecx # rcx <- A+ 3644 sarl $4,rINST # rINST <- B 3645 .if 0 3646 GET_WIDE_VREG %rax, rINSTq # rax <- vB 3647 .else 3648 GET_VREG %eax, rINSTq # eax <- vB 3649 .endif 3650 andb $0xf,%cl # ecx <- A 3651 3652 movsbl %al, %eax 3653 .if 0 3654 SET_WIDE_VREG %rax, %rcx 3655 .else 3656 SET_VREG %eax, %rcx 3657 .endif 3658 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3659 3660 3661 /* ------------------------------ */ 3662 .balign 128 3663 .L_op_int_to_char: /* 0x8e */ 3664 /* File: x86_64/op_int_to_char.S */ 3665 /* File: x86_64/unop.S */ 3666 /* 3667 * Generic 32/64-bit unary operation. Provide an "instr" line that 3668 * specifies an instruction that performs "result = op eax". 3669 */ 3670 /* unop vA, vB */ 3671 movl rINST, %ecx # rcx <- A+ 3672 sarl $4,rINST # rINST <- B 3673 .if 0 3674 GET_WIDE_VREG %rax, rINSTq # rax <- vB 3675 .else 3676 GET_VREG %eax, rINSTq # eax <- vB 3677 .endif 3678 andb $0xf,%cl # ecx <- A 3679 3680 movzwl %ax,%eax 3681 .if 0 3682 SET_WIDE_VREG %rax, %rcx 3683 .else 3684 SET_VREG %eax, %rcx 3685 .endif 3686 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3687 3688 3689 /* ------------------------------ */ 3690 .balign 128 3691 .L_op_int_to_short: /* 0x8f */ 3692 /* File: x86_64/op_int_to_short.S */ 3693 /* File: x86_64/unop.S */ 3694 /* 3695 * Generic 32/64-bit unary operation. Provide an "instr" line that 3696 * specifies an instruction that performs "result = op eax". 3697 */ 3698 /* unop vA, vB */ 3699 movl rINST, %ecx # rcx <- A+ 3700 sarl $4,rINST # rINST <- B 3701 .if 0 3702 GET_WIDE_VREG %rax, rINSTq # rax <- vB 3703 .else 3704 GET_VREG %eax, rINSTq # eax <- vB 3705 .endif 3706 andb $0xf,%cl # ecx <- A 3707 3708 movswl %ax, %eax 3709 .if 0 3710 SET_WIDE_VREG %rax, %rcx 3711 .else 3712 SET_VREG %eax, %rcx 3713 .endif 3714 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3715 3716 3717 /* ------------------------------ */ 3718 .balign 128 3719 .L_op_add_int: /* 0x90 */ 3720 /* File: x86_64/op_add_int.S */ 3721 /* File: x86_64/binop.S */ 3722 /* 3723 * Generic 32-bit binary operation. Provide an "instr" line that 3724 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)". 3725 * This could be an x86 instruction or a function call. (If the result 3726 * comes back in a register other than eax, you can override "result".) 3727 * 3728 * For: add-int, sub-int, and-int, or-int, 3729 * xor-int, shl-int, shr-int, ushr-int 3730 */ 3731 /* binop vAA, vBB, vCC */ 3732 movzbq 2(rPC), %rax # rax <- BB 3733 movzbq 3(rPC), %rcx # rcx <- CC 3734 GET_VREG %eax, %rax # eax <- vBB 3735 addl (rFP,%rcx,4), %eax # ex: addl (rFP,%rcx,4),%eax 3736 SET_VREG %eax, rINSTq 3737 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 3738 3739 3740 /* ------------------------------ */ 3741 .balign 128 3742 .L_op_sub_int: /* 0x91 */ 3743 /* File: x86_64/op_sub_int.S */ 3744 /* File: x86_64/binop.S */ 3745 /* 3746 * Generic 32-bit binary operation. Provide an "instr" line that 3747 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)". 3748 * This could be an x86 instruction or a function call. (If the result 3749 * comes back in a register other than eax, you can override "result".) 3750 * 3751 * For: add-int, sub-int, and-int, or-int, 3752 * xor-int, shl-int, shr-int, ushr-int 3753 */ 3754 /* binop vAA, vBB, vCC */ 3755 movzbq 2(rPC), %rax # rax <- BB 3756 movzbq 3(rPC), %rcx # rcx <- CC 3757 GET_VREG %eax, %rax # eax <- vBB 3758 subl (rFP,%rcx,4), %eax # ex: addl (rFP,%rcx,4),%eax 3759 SET_VREG %eax, rINSTq 3760 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 3761 3762 3763 /* ------------------------------ */ 3764 .balign 128 3765 .L_op_mul_int: /* 0x92 */ 3766 /* File: x86_64/op_mul_int.S */ 3767 /* File: x86_64/binop.S */ 3768 /* 3769 * Generic 32-bit binary operation. Provide an "instr" line that 3770 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)". 3771 * This could be an x86 instruction or a function call. (If the result 3772 * comes back in a register other than eax, you can override "result".) 3773 * 3774 * For: add-int, sub-int, and-int, or-int, 3775 * xor-int, shl-int, shr-int, ushr-int 3776 */ 3777 /* binop vAA, vBB, vCC */ 3778 movzbq 2(rPC), %rax # rax <- BB 3779 movzbq 3(rPC), %rcx # rcx <- CC 3780 GET_VREG %eax, %rax # eax <- vBB 3781 imull (rFP,%rcx,4), %eax # ex: addl (rFP,%rcx,4),%eax 3782 SET_VREG %eax, rINSTq 3783 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 3784 3785 3786 /* ------------------------------ */ 3787 .balign 128 3788 .L_op_div_int: /* 0x93 */ 3789 /* File: x86_64/op_div_int.S */ 3790 /* File: x86_64/bindiv.S */ 3791 /* 3792 * 32-bit binary div/rem operation. Handles special case of op1=-1. 3793 */ 3794 /* div/rem vAA, vBB, vCC */ 3795 movzbq 2(rPC), %rax # rax <- BB 3796 movzbq 3(rPC), %rcx # rcx <- CC 3797 .if 0 3798 GET_WIDE_VREG %rax, %rax # eax <- vBB 3799 GET_WIDE_VREG %ecx, %rcx # ecx <- vCC 3800 .else 3801 GET_VREG %eax, %rax # eax <- vBB 3802 GET_VREG %ecx, %rcx # ecx <- vCC 3803 .endif 3804 testl %ecx, %ecx 3805 jz common_errDivideByZero 3806 cmpl $-1, %ecx 3807 je 2f 3808 cdq # rdx:rax <- sign-extended of rax 3809 idivl %ecx 3810 1: 3811 .if 0 3812 SET_WIDE_VREG %eax, rINSTq # eax <- vBB 3813 .else 3814 SET_VREG %eax, rINSTq # eax <- vBB 3815 .endif 3816 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 3817 2: 3818 .if 0 3819 xorl %eax, %eax 3820 .else 3821 negl %eax 3822 .endif 3823 jmp 1b 3824 3825 3826 /* ------------------------------ */ 3827 .balign 128 3828 .L_op_rem_int: /* 0x94 */ 3829 /* File: x86_64/op_rem_int.S */ 3830 /* File: x86_64/bindiv.S */ 3831 /* 3832 * 32-bit binary div/rem operation. Handles special case of op1=-1. 3833 */ 3834 /* div/rem vAA, vBB, vCC */ 3835 movzbq 2(rPC), %rax # rax <- BB 3836 movzbq 3(rPC), %rcx # rcx <- CC 3837 .if 0 3838 GET_WIDE_VREG %rax, %rax # eax <- vBB 3839 GET_WIDE_VREG %ecx, %rcx # ecx <- vCC 3840 .else 3841 GET_VREG %eax, %rax # eax <- vBB 3842 GET_VREG %ecx, %rcx # ecx <- vCC 3843 .endif 3844 testl %ecx, %ecx 3845 jz common_errDivideByZero 3846 cmpl $-1, %ecx 3847 je 2f 3848 cdq # rdx:rax <- sign-extended of rax 3849 idivl %ecx 3850 1: 3851 .if 0 3852 SET_WIDE_VREG %edx, rINSTq # eax <- vBB 3853 .else 3854 SET_VREG %edx, rINSTq # eax <- vBB 3855 .endif 3856 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 3857 2: 3858 .if 1 3859 xorl %edx, %edx 3860 .else 3861 negl %edx 3862 .endif 3863 jmp 1b 3864 3865 3866 /* ------------------------------ */ 3867 .balign 128 3868 .L_op_and_int: /* 0x95 */ 3869 /* File: x86_64/op_and_int.S */ 3870 /* File: x86_64/binop.S */ 3871 /* 3872 * Generic 32-bit binary operation. Provide an "instr" line that 3873 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)". 3874 * This could be an x86 instruction or a function call. (If the result 3875 * comes back in a register other than eax, you can override "result".) 3876 * 3877 * For: add-int, sub-int, and-int, or-int, 3878 * xor-int, shl-int, shr-int, ushr-int 3879 */ 3880 /* binop vAA, vBB, vCC */ 3881 movzbq 2(rPC), %rax # rax <- BB 3882 movzbq 3(rPC), %rcx # rcx <- CC 3883 GET_VREG %eax, %rax # eax <- vBB 3884 andl (rFP,%rcx,4), %eax # ex: addl (rFP,%rcx,4),%eax 3885 SET_VREG %eax, rINSTq 3886 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 3887 3888 3889 /* ------------------------------ */ 3890 .balign 128 3891 .L_op_or_int: /* 0x96 */ 3892 /* File: x86_64/op_or_int.S */ 3893 /* File: x86_64/binop.S */ 3894 /* 3895 * Generic 32-bit binary operation. Provide an "instr" line that 3896 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)". 3897 * This could be an x86 instruction or a function call. (If the result 3898 * comes back in a register other than eax, you can override "result".) 3899 * 3900 * For: add-int, sub-int, and-int, or-int, 3901 * xor-int, shl-int, shr-int, ushr-int 3902 */ 3903 /* binop vAA, vBB, vCC */ 3904 movzbq 2(rPC), %rax # rax <- BB 3905 movzbq 3(rPC), %rcx # rcx <- CC 3906 GET_VREG %eax, %rax # eax <- vBB 3907 orl (rFP,%rcx,4), %eax # ex: addl (rFP,%rcx,4),%eax 3908 SET_VREG %eax, rINSTq 3909 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 3910 3911 3912 /* ------------------------------ */ 3913 .balign 128 3914 .L_op_xor_int: /* 0x97 */ 3915 /* File: x86_64/op_xor_int.S */ 3916 /* File: x86_64/binop.S */ 3917 /* 3918 * Generic 32-bit binary operation. Provide an "instr" line that 3919 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)". 3920 * This could be an x86 instruction or a function call. (If the result 3921 * comes back in a register other than eax, you can override "result".) 3922 * 3923 * For: add-int, sub-int, and-int, or-int, 3924 * xor-int, shl-int, shr-int, ushr-int 3925 */ 3926 /* binop vAA, vBB, vCC */ 3927 movzbq 2(rPC), %rax # rax <- BB 3928 movzbq 3(rPC), %rcx # rcx <- CC 3929 GET_VREG %eax, %rax # eax <- vBB 3930 xorl (rFP,%rcx,4), %eax # ex: addl (rFP,%rcx,4),%eax 3931 SET_VREG %eax, rINSTq 3932 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 3933 3934 3935 /* ------------------------------ */ 3936 .balign 128 3937 .L_op_shl_int: /* 0x98 */ 3938 /* File: x86_64/op_shl_int.S */ 3939 /* File: x86_64/binop1.S */ 3940 /* 3941 * Generic 32-bit binary operation in which both operands loaded to 3942 * registers (op0 in eax, op1 in ecx). 3943 */ 3944 /* binop vAA, vBB, vCC */ 3945 movzbq 2(rPC), %rax # eax <- BB 3946 movzbq 3(rPC), %rcx # ecx <- CC 3947 GET_VREG %ecx, %rcx # eax <- vCC 3948 .if 0 3949 GET_WIDE_VREG %rax, %rax # rax <- vBB 3950 sall %cl, %eax # ex: addl %ecx,%eax 3951 SET_WIDE_VREG %rax, rINSTq 3952 .else 3953 GET_VREG %eax, %rax # eax <- vBB 3954 sall %cl, %eax # ex: addl %ecx,%eax 3955 SET_VREG %eax, rINSTq 3956 .endif 3957 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 3958 3959 3960 /* ------------------------------ */ 3961 .balign 128 3962 .L_op_shr_int: /* 0x99 */ 3963 /* File: x86_64/op_shr_int.S */ 3964 /* File: x86_64/binop1.S */ 3965 /* 3966 * Generic 32-bit binary operation in which both operands loaded to 3967 * registers (op0 in eax, op1 in ecx). 3968 */ 3969 /* binop vAA, vBB, vCC */ 3970 movzbq 2(rPC), %rax # eax <- BB 3971 movzbq 3(rPC), %rcx # ecx <- CC 3972 GET_VREG %ecx, %rcx # eax <- vCC 3973 .if 0 3974 GET_WIDE_VREG %rax, %rax # rax <- vBB 3975 sarl %cl, %eax # ex: addl %ecx,%eax 3976 SET_WIDE_VREG %rax, rINSTq 3977 .else 3978 GET_VREG %eax, %rax # eax <- vBB 3979 sarl %cl, %eax # ex: addl %ecx,%eax 3980 SET_VREG %eax, rINSTq 3981 .endif 3982 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 3983 3984 3985 /* ------------------------------ */ 3986 .balign 128 3987 .L_op_ushr_int: /* 0x9a */ 3988 /* File: x86_64/op_ushr_int.S */ 3989 /* File: x86_64/binop1.S */ 3990 /* 3991 * Generic 32-bit binary operation in which both operands loaded to 3992 * registers (op0 in eax, op1 in ecx). 3993 */ 3994 /* binop vAA, vBB, vCC */ 3995 movzbq 2(rPC), %rax # eax <- BB 3996 movzbq 3(rPC), %rcx # ecx <- CC 3997 GET_VREG %ecx, %rcx # eax <- vCC 3998 .if 0 3999 GET_WIDE_VREG %rax, %rax # rax <- vBB 4000 shrl %cl, %eax # ex: addl %ecx,%eax 4001 SET_WIDE_VREG %rax, rINSTq 4002 .else 4003 GET_VREG %eax, %rax # eax <- vBB 4004 shrl %cl, %eax # ex: addl %ecx,%eax 4005 SET_VREG %eax, rINSTq 4006 .endif 4007 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4008 4009 4010 /* ------------------------------ */ 4011 .balign 128 4012 .L_op_add_long: /* 0x9b */ 4013 /* File: x86_64/op_add_long.S */ 4014 /* File: x86_64/binopWide.S */ 4015 /* 4016 * Generic 64-bit binary operation. 4017 */ 4018 /* binop vAA, vBB, vCC */ 4019 movzbq 2(rPC), %rax # eax <- BB 4020 movzbq 3(rPC), %rcx # ecx <- CC 4021 GET_WIDE_VREG %rax, %rax # rax <- v[BB] 4022 addq (rFP,%rcx,4), %rax # ex: addq (rFP,%rcx,4),%rax 4023 SET_WIDE_VREG %rax, rINSTq # v[AA] <- rax 4024 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4025 4026 4027 /* ------------------------------ */ 4028 .balign 128 4029 .L_op_sub_long: /* 0x9c */ 4030 /* File: x86_64/op_sub_long.S */ 4031 /* File: x86_64/binopWide.S */ 4032 /* 4033 * Generic 64-bit binary operation. 4034 */ 4035 /* binop vAA, vBB, vCC */ 4036 movzbq 2(rPC), %rax # eax <- BB 4037 movzbq 3(rPC), %rcx # ecx <- CC 4038 GET_WIDE_VREG %rax, %rax # rax <- v[BB] 4039 subq (rFP,%rcx,4), %rax # ex: addq (rFP,%rcx,4),%rax 4040 SET_WIDE_VREG %rax, rINSTq # v[AA] <- rax 4041 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4042 4043 4044 /* ------------------------------ */ 4045 .balign 128 4046 .L_op_mul_long: /* 0x9d */ 4047 /* File: x86_64/op_mul_long.S */ 4048 /* File: x86_64/binopWide.S */ 4049 /* 4050 * Generic 64-bit binary operation. 4051 */ 4052 /* binop vAA, vBB, vCC */ 4053 movzbq 2(rPC), %rax # eax <- BB 4054 movzbq 3(rPC), %rcx # ecx <- CC 4055 GET_WIDE_VREG %rax, %rax # rax <- v[BB] 4056 imulq (rFP,%rcx,4), %rax # ex: addq (rFP,%rcx,4),%rax 4057 SET_WIDE_VREG %rax, rINSTq # v[AA] <- rax 4058 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4059 4060 4061 /* ------------------------------ */ 4062 .balign 128 4063 .L_op_div_long: /* 0x9e */ 4064 /* File: x86_64/op_div_long.S */ 4065 /* File: x86_64/bindiv.S */ 4066 /* 4067 * 32-bit binary div/rem operation. Handles special case of op1=-1. 4068 */ 4069 /* div/rem vAA, vBB, vCC */ 4070 movzbq 2(rPC), %rax # rax <- BB 4071 movzbq 3(rPC), %rcx # rcx <- CC 4072 .if 1 4073 GET_WIDE_VREG %rax, %rax # eax <- vBB 4074 GET_WIDE_VREG %rcx, %rcx # ecx <- vCC 4075 .else 4076 GET_VREG %eax, %rax # eax <- vBB 4077 GET_VREG %rcx, %rcx # ecx <- vCC 4078 .endif 4079 testq %rcx, %rcx 4080 jz common_errDivideByZero 4081 cmpq $-1, %rcx 4082 je 2f 4083 cqo # rdx:rax <- sign-extended of rax 4084 idivq %rcx 4085 1: 4086 .if 1 4087 SET_WIDE_VREG %rax, rINSTq # eax <- vBB 4088 .else 4089 SET_VREG %rax, rINSTq # eax <- vBB 4090 .endif 4091 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4092 2: 4093 .if 0 4094 xorq %rax, %rax 4095 .else 4096 negq %rax 4097 .endif 4098 jmp 1b 4099 4100 4101 /* ------------------------------ */ 4102 .balign 128 4103 .L_op_rem_long: /* 0x9f */ 4104 /* File: x86_64/op_rem_long.S */ 4105 /* File: x86_64/bindiv.S */ 4106 /* 4107 * 32-bit binary div/rem operation. Handles special case of op1=-1. 4108 */ 4109 /* div/rem vAA, vBB, vCC */ 4110 movzbq 2(rPC), %rax # rax <- BB 4111 movzbq 3(rPC), %rcx # rcx <- CC 4112 .if 1 4113 GET_WIDE_VREG %rax, %rax # eax <- vBB 4114 GET_WIDE_VREG %rcx, %rcx # ecx <- vCC 4115 .else 4116 GET_VREG %eax, %rax # eax <- vBB 4117 GET_VREG %rcx, %rcx # ecx <- vCC 4118 .endif 4119 testq %rcx, %rcx 4120 jz common_errDivideByZero 4121 cmpq $-1, %rcx 4122 je 2f 4123 cqo # rdx:rax <- sign-extended of rax 4124 idivq %rcx 4125 1: 4126 .if 1 4127 SET_WIDE_VREG %rdx, rINSTq # eax <- vBB 4128 .else 4129 SET_VREG %rdx, rINSTq # eax <- vBB 4130 .endif 4131 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4132 2: 4133 .if 1 4134 xorq %rdx, %rdx 4135 .else 4136 negq %rdx 4137 .endif 4138 jmp 1b 4139 4140 4141 /* ------------------------------ */ 4142 .balign 128 4143 .L_op_and_long: /* 0xa0 */ 4144 /* File: x86_64/op_and_long.S */ 4145 /* File: x86_64/binopWide.S */ 4146 /* 4147 * Generic 64-bit binary operation. 4148 */ 4149 /* binop vAA, vBB, vCC */ 4150 movzbq 2(rPC), %rax # eax <- BB 4151 movzbq 3(rPC), %rcx # ecx <- CC 4152 GET_WIDE_VREG %rax, %rax # rax <- v[BB] 4153 andq (rFP,%rcx,4), %rax # ex: addq (rFP,%rcx,4),%rax 4154 SET_WIDE_VREG %rax, rINSTq # v[AA] <- rax 4155 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4156 4157 4158 /* ------------------------------ */ 4159 .balign 128 4160 .L_op_or_long: /* 0xa1 */ 4161 /* File: x86_64/op_or_long.S */ 4162 /* File: x86_64/binopWide.S */ 4163 /* 4164 * Generic 64-bit binary operation. 4165 */ 4166 /* binop vAA, vBB, vCC */ 4167 movzbq 2(rPC), %rax # eax <- BB 4168 movzbq 3(rPC), %rcx # ecx <- CC 4169 GET_WIDE_VREG %rax, %rax # rax <- v[BB] 4170 orq (rFP,%rcx,4), %rax # ex: addq (rFP,%rcx,4),%rax 4171 SET_WIDE_VREG %rax, rINSTq # v[AA] <- rax 4172 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4173 4174 4175 /* ------------------------------ */ 4176 .balign 128 4177 .L_op_xor_long: /* 0xa2 */ 4178 /* File: x86_64/op_xor_long.S */ 4179 /* File: x86_64/binopWide.S */ 4180 /* 4181 * Generic 64-bit binary operation. 4182 */ 4183 /* binop vAA, vBB, vCC */ 4184 movzbq 2(rPC), %rax # eax <- BB 4185 movzbq 3(rPC), %rcx # ecx <- CC 4186 GET_WIDE_VREG %rax, %rax # rax <- v[BB] 4187 xorq (rFP,%rcx,4), %rax # ex: addq (rFP,%rcx,4),%rax 4188 SET_WIDE_VREG %rax, rINSTq # v[AA] <- rax 4189 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4190 4191 4192 /* ------------------------------ */ 4193 .balign 128 4194 .L_op_shl_long: /* 0xa3 */ 4195 /* File: x86_64/op_shl_long.S */ 4196 /* File: x86_64/binop1.S */ 4197 /* 4198 * Generic 32-bit binary operation in which both operands loaded to 4199 * registers (op0 in eax, op1 in ecx). 4200 */ 4201 /* binop vAA, vBB, vCC */ 4202 movzbq 2(rPC), %rax # eax <- BB 4203 movzbq 3(rPC), %rcx # ecx <- CC 4204 GET_VREG %ecx, %rcx # eax <- vCC 4205 .if 1 4206 GET_WIDE_VREG %rax, %rax # rax <- vBB 4207 salq %cl, %rax # ex: addl %ecx,%eax 4208 SET_WIDE_VREG %rax, rINSTq 4209 .else 4210 GET_VREG %eax, %rax # eax <- vBB 4211 salq %cl, %rax # ex: addl %ecx,%eax 4212 SET_VREG %eax, rINSTq 4213 .endif 4214 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4215 4216 4217 /* ------------------------------ */ 4218 .balign 128 4219 .L_op_shr_long: /* 0xa4 */ 4220 /* File: x86_64/op_shr_long.S */ 4221 /* File: x86_64/binop1.S */ 4222 /* 4223 * Generic 32-bit binary operation in which both operands loaded to 4224 * registers (op0 in eax, op1 in ecx). 4225 */ 4226 /* binop vAA, vBB, vCC */ 4227 movzbq 2(rPC), %rax # eax <- BB 4228 movzbq 3(rPC), %rcx # ecx <- CC 4229 GET_VREG %ecx, %rcx # eax <- vCC 4230 .if 1 4231 GET_WIDE_VREG %rax, %rax # rax <- vBB 4232 sarq %cl, %rax # ex: addl %ecx,%eax 4233 SET_WIDE_VREG %rax, rINSTq 4234 .else 4235 GET_VREG %eax, %rax # eax <- vBB 4236 sarq %cl, %rax # ex: addl %ecx,%eax 4237 SET_VREG %eax, rINSTq 4238 .endif 4239 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4240 4241 4242 /* ------------------------------ */ 4243 .balign 128 4244 .L_op_ushr_long: /* 0xa5 */ 4245 /* File: x86_64/op_ushr_long.S */ 4246 /* File: x86_64/binop1.S */ 4247 /* 4248 * Generic 32-bit binary operation in which both operands loaded to 4249 * registers (op0 in eax, op1 in ecx). 4250 */ 4251 /* binop vAA, vBB, vCC */ 4252 movzbq 2(rPC), %rax # eax <- BB 4253 movzbq 3(rPC), %rcx # ecx <- CC 4254 GET_VREG %ecx, %rcx # eax <- vCC 4255 .if 1 4256 GET_WIDE_VREG %rax, %rax # rax <- vBB 4257 shrq %cl, %rax # ex: addl %ecx,%eax 4258 SET_WIDE_VREG %rax, rINSTq 4259 .else 4260 GET_VREG %eax, %rax # eax <- vBB 4261 shrq %cl, %rax # ex: addl %ecx,%eax 4262 SET_VREG %eax, rINSTq 4263 .endif 4264 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4265 4266 4267 /* ------------------------------ */ 4268 .balign 128 4269 .L_op_add_float: /* 0xa6 */ 4270 /* File: x86_64/op_add_float.S */ 4271 /* File: x86_64/sseBinop.S */ 4272 movzbq 2(rPC), %rcx # ecx <- BB 4273 movzbq 3(rPC), %rax # eax <- CC 4274 movss VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 4275 addss VREG_ADDRESS(%rax), %xmm0 4276 movss %xmm0, VREG_ADDRESS(rINSTq) # vAA <- %xmm0 4277 pxor %xmm0, %xmm0 4278 movss %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 4279 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4280 4281 4282 /* ------------------------------ */ 4283 .balign 128 4284 .L_op_sub_float: /* 0xa7 */ 4285 /* File: x86_64/op_sub_float.S */ 4286 /* File: x86_64/sseBinop.S */ 4287 movzbq 2(rPC), %rcx # ecx <- BB 4288 movzbq 3(rPC), %rax # eax <- CC 4289 movss VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 4290 subss VREG_ADDRESS(%rax), %xmm0 4291 movss %xmm0, VREG_ADDRESS(rINSTq) # vAA <- %xmm0 4292 pxor %xmm0, %xmm0 4293 movss %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 4294 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4295 4296 4297 /* ------------------------------ */ 4298 .balign 128 4299 .L_op_mul_float: /* 0xa8 */ 4300 /* File: x86_64/op_mul_float.S */ 4301 /* File: x86_64/sseBinop.S */ 4302 movzbq 2(rPC), %rcx # ecx <- BB 4303 movzbq 3(rPC), %rax # eax <- CC 4304 movss VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 4305 mulss VREG_ADDRESS(%rax), %xmm0 4306 movss %xmm0, VREG_ADDRESS(rINSTq) # vAA <- %xmm0 4307 pxor %xmm0, %xmm0 4308 movss %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 4309 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4310 4311 4312 /* ------------------------------ */ 4313 .balign 128 4314 .L_op_div_float: /* 0xa9 */ 4315 /* File: x86_64/op_div_float.S */ 4316 /* File: x86_64/sseBinop.S */ 4317 movzbq 2(rPC), %rcx # ecx <- BB 4318 movzbq 3(rPC), %rax # eax <- CC 4319 movss VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 4320 divss VREG_ADDRESS(%rax), %xmm0 4321 movss %xmm0, VREG_ADDRESS(rINSTq) # vAA <- %xmm0 4322 pxor %xmm0, %xmm0 4323 movss %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 4324 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4325 4326 4327 /* ------------------------------ */ 4328 .balign 128 4329 .L_op_rem_float: /* 0xaa */ 4330 /* File: x86_64/op_rem_float.S */ 4331 /* rem_float vAA, vBB, vCC */ 4332 movzbq 3(rPC), %rcx # ecx <- BB 4333 movzbq 2(rPC), %rax # eax <- CC 4334 flds VREG_ADDRESS(%rcx) # vBB to fp stack 4335 flds VREG_ADDRESS(%rax) # vCC to fp stack 4336 1: 4337 fprem 4338 fstsw %ax 4339 sahf 4340 jp 1b 4341 fstp %st(1) 4342 fstps VREG_ADDRESS(rINSTq) # %st to vAA 4343 CLEAR_REF rINSTq 4344 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4345 4346 /* ------------------------------ */ 4347 .balign 128 4348 .L_op_add_double: /* 0xab */ 4349 /* File: x86_64/op_add_double.S */ 4350 /* File: x86_64/sseBinop.S */ 4351 movzbq 2(rPC), %rcx # ecx <- BB 4352 movzbq 3(rPC), %rax # eax <- CC 4353 movsd VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 4354 addsd VREG_ADDRESS(%rax), %xmm0 4355 movsd %xmm0, VREG_ADDRESS(rINSTq) # vAA <- %xmm0 4356 pxor %xmm0, %xmm0 4357 movsd %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 4358 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4359 4360 4361 /* ------------------------------ */ 4362 .balign 128 4363 .L_op_sub_double: /* 0xac */ 4364 /* File: x86_64/op_sub_double.S */ 4365 /* File: x86_64/sseBinop.S */ 4366 movzbq 2(rPC), %rcx # ecx <- BB 4367 movzbq 3(rPC), %rax # eax <- CC 4368 movsd VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 4369 subsd VREG_ADDRESS(%rax), %xmm0 4370 movsd %xmm0, VREG_ADDRESS(rINSTq) # vAA <- %xmm0 4371 pxor %xmm0, %xmm0 4372 movsd %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 4373 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4374 4375 4376 /* ------------------------------ */ 4377 .balign 128 4378 .L_op_mul_double: /* 0xad */ 4379 /* File: x86_64/op_mul_double.S */ 4380 /* File: x86_64/sseBinop.S */ 4381 movzbq 2(rPC), %rcx # ecx <- BB 4382 movzbq 3(rPC), %rax # eax <- CC 4383 movsd VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 4384 mulsd VREG_ADDRESS(%rax), %xmm0 4385 movsd %xmm0, VREG_ADDRESS(rINSTq) # vAA <- %xmm0 4386 pxor %xmm0, %xmm0 4387 movsd %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 4388 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4389 4390 4391 /* ------------------------------ */ 4392 .balign 128 4393 .L_op_div_double: /* 0xae */ 4394 /* File: x86_64/op_div_double.S */ 4395 /* File: x86_64/sseBinop.S */ 4396 movzbq 2(rPC), %rcx # ecx <- BB 4397 movzbq 3(rPC), %rax # eax <- CC 4398 movsd VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 4399 divsd VREG_ADDRESS(%rax), %xmm0 4400 movsd %xmm0, VREG_ADDRESS(rINSTq) # vAA <- %xmm0 4401 pxor %xmm0, %xmm0 4402 movsd %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 4403 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4404 4405 4406 /* ------------------------------ */ 4407 .balign 128 4408 .L_op_rem_double: /* 0xaf */ 4409 /* File: x86_64/op_rem_double.S */ 4410 /* rem_double vAA, vBB, vCC */ 4411 movzbq 3(rPC), %rcx # ecx <- BB 4412 movzbq 2(rPC), %rax # eax <- CC 4413 fldl VREG_ADDRESS(%rcx) # %st1 <- fp[vBB] 4414 fldl VREG_ADDRESS(%rax) # %st0 <- fp[vCC] 4415 1: 4416 fprem 4417 fstsw %ax 4418 sahf 4419 jp 1b 4420 fstp %st(1) 4421 fstpl VREG_ADDRESS(rINSTq) # fp[vAA] <- %st 4422 CLEAR_WIDE_REF rINSTq 4423 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4424 4425 /* ------------------------------ */ 4426 .balign 128 4427 .L_op_add_int_2addr: /* 0xb0 */ 4428 /* File: x86_64/op_add_int_2addr.S */ 4429 /* File: x86_64/binop2addr.S */ 4430 /* 4431 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4432 * that specifies an instruction that performs "result = r0 op r1". 4433 * This could be an instruction or a function call. 4434 * 4435 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4436 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4437 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4438 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4439 */ 4440 /* binop/2addr vA, vB */ 4441 movl rINST, %ecx # rcx <- A+ 4442 sarl $4, rINST # rINST <- B 4443 andb $0xf, %cl # ecx <- A 4444 GET_VREG %eax, rINSTq # eax <- vB 4445 addl %eax, (rFP,%rcx,4) # for ex: addl %eax,(rFP,%ecx,4) 4446 CLEAR_REF %rcx 4447 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4448 4449 4450 /* ------------------------------ */ 4451 .balign 128 4452 .L_op_sub_int_2addr: /* 0xb1 */ 4453 /* File: x86_64/op_sub_int_2addr.S */ 4454 /* File: x86_64/binop2addr.S */ 4455 /* 4456 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4457 * that specifies an instruction that performs "result = r0 op r1". 4458 * This could be an instruction or a function call. 4459 * 4460 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4461 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4462 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4463 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4464 */ 4465 /* binop/2addr vA, vB */ 4466 movl rINST, %ecx # rcx <- A+ 4467 sarl $4, rINST # rINST <- B 4468 andb $0xf, %cl # ecx <- A 4469 GET_VREG %eax, rINSTq # eax <- vB 4470 subl %eax, (rFP,%rcx,4) # for ex: addl %eax,(rFP,%ecx,4) 4471 CLEAR_REF %rcx 4472 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4473 4474 4475 /* ------------------------------ */ 4476 .balign 128 4477 .L_op_mul_int_2addr: /* 0xb2 */ 4478 /* File: x86_64/op_mul_int_2addr.S */ 4479 /* mul vA, vB */ 4480 movl rINST, %ecx # rcx <- A+ 4481 sarl $4, rINST # rINST <- B 4482 andb $0xf, %cl # ecx <- A 4483 GET_VREG %eax, %rcx # eax <- vA 4484 imull (rFP,rINSTq,4), %eax 4485 SET_VREG %eax, %rcx 4486 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4487 4488 /* ------------------------------ */ 4489 .balign 128 4490 .L_op_div_int_2addr: /* 0xb3 */ 4491 /* File: x86_64/op_div_int_2addr.S */ 4492 /* File: x86_64/bindiv2addr.S */ 4493 /* 4494 * 32-bit binary div/rem operation. Handles special case of op1=-1. 4495 */ 4496 /* div/rem/2addr vA, vB */ 4497 movl rINST, %ecx # rcx <- BA 4498 sarl $4, %ecx # rcx <- B 4499 andb $0xf, rINSTbl # rINST <- A 4500 .if 0 4501 GET_WIDE_VREG %rax, rINSTq # eax <- vA 4502 GET_WIDE_VREG %ecx, %rcx # ecx <- vB 4503 .else 4504 GET_VREG %eax, rINSTq # eax <- vA 4505 GET_VREG %ecx, %rcx # ecx <- vB 4506 .endif 4507 testl %ecx, %ecx 4508 jz common_errDivideByZero 4509 cmpl $-1, %ecx 4510 je 2f 4511 cdq # rdx:rax <- sign-extended of rax 4512 idivl %ecx 4513 1: 4514 .if 0 4515 SET_WIDE_VREG %eax, rINSTq # vA <- result 4516 .else 4517 SET_VREG %eax, rINSTq # vA <- result 4518 .endif 4519 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4520 2: 4521 .if 0 4522 xorl %eax, %eax 4523 .else 4524 negl %eax 4525 .endif 4526 jmp 1b 4527 4528 4529 /* ------------------------------ */ 4530 .balign 128 4531 .L_op_rem_int_2addr: /* 0xb4 */ 4532 /* File: x86_64/op_rem_int_2addr.S */ 4533 /* File: x86_64/bindiv2addr.S */ 4534 /* 4535 * 32-bit binary div/rem operation. Handles special case of op1=-1. 4536 */ 4537 /* div/rem/2addr vA, vB */ 4538 movl rINST, %ecx # rcx <- BA 4539 sarl $4, %ecx # rcx <- B 4540 andb $0xf, rINSTbl # rINST <- A 4541 .if 0 4542 GET_WIDE_VREG %rax, rINSTq # eax <- vA 4543 GET_WIDE_VREG %ecx, %rcx # ecx <- vB 4544 .else 4545 GET_VREG %eax, rINSTq # eax <- vA 4546 GET_VREG %ecx, %rcx # ecx <- vB 4547 .endif 4548 testl %ecx, %ecx 4549 jz common_errDivideByZero 4550 cmpl $-1, %ecx 4551 je 2f 4552 cdq # rdx:rax <- sign-extended of rax 4553 idivl %ecx 4554 1: 4555 .if 0 4556 SET_WIDE_VREG %edx, rINSTq # vA <- result 4557 .else 4558 SET_VREG %edx, rINSTq # vA <- result 4559 .endif 4560 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4561 2: 4562 .if 1 4563 xorl %edx, %edx 4564 .else 4565 negl %edx 4566 .endif 4567 jmp 1b 4568 4569 4570 /* ------------------------------ */ 4571 .balign 128 4572 .L_op_and_int_2addr: /* 0xb5 */ 4573 /* File: x86_64/op_and_int_2addr.S */ 4574 /* File: x86_64/binop2addr.S */ 4575 /* 4576 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4577 * that specifies an instruction that performs "result = r0 op r1". 4578 * This could be an instruction or a function call. 4579 * 4580 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4581 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4582 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4583 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4584 */ 4585 /* binop/2addr vA, vB */ 4586 movl rINST, %ecx # rcx <- A+ 4587 sarl $4, rINST # rINST <- B 4588 andb $0xf, %cl # ecx <- A 4589 GET_VREG %eax, rINSTq # eax <- vB 4590 andl %eax, (rFP,%rcx,4) # for ex: addl %eax,(rFP,%ecx,4) 4591 CLEAR_REF %rcx 4592 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4593 4594 4595 /* ------------------------------ */ 4596 .balign 128 4597 .L_op_or_int_2addr: /* 0xb6 */ 4598 /* File: x86_64/op_or_int_2addr.S */ 4599 /* File: x86_64/binop2addr.S */ 4600 /* 4601 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4602 * that specifies an instruction that performs "result = r0 op r1". 4603 * This could be an instruction or a function call. 4604 * 4605 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4606 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4607 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4608 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4609 */ 4610 /* binop/2addr vA, vB */ 4611 movl rINST, %ecx # rcx <- A+ 4612 sarl $4, rINST # rINST <- B 4613 andb $0xf, %cl # ecx <- A 4614 GET_VREG %eax, rINSTq # eax <- vB 4615 orl %eax, (rFP,%rcx,4) # for ex: addl %eax,(rFP,%ecx,4) 4616 CLEAR_REF %rcx 4617 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4618 4619 4620 /* ------------------------------ */ 4621 .balign 128 4622 .L_op_xor_int_2addr: /* 0xb7 */ 4623 /* File: x86_64/op_xor_int_2addr.S */ 4624 /* File: x86_64/binop2addr.S */ 4625 /* 4626 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4627 * that specifies an instruction that performs "result = r0 op r1". 4628 * This could be an instruction or a function call. 4629 * 4630 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4631 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4632 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4633 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4634 */ 4635 /* binop/2addr vA, vB */ 4636 movl rINST, %ecx # rcx <- A+ 4637 sarl $4, rINST # rINST <- B 4638 andb $0xf, %cl # ecx <- A 4639 GET_VREG %eax, rINSTq # eax <- vB 4640 xorl %eax, (rFP,%rcx,4) # for ex: addl %eax,(rFP,%ecx,4) 4641 CLEAR_REF %rcx 4642 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4643 4644 4645 /* ------------------------------ */ 4646 .balign 128 4647 .L_op_shl_int_2addr: /* 0xb8 */ 4648 /* File: x86_64/op_shl_int_2addr.S */ 4649 /* File: x86_64/shop2addr.S */ 4650 /* 4651 * Generic 32-bit "shift/2addr" operation. 4652 */ 4653 /* shift/2addr vA, vB */ 4654 movl rINST, %ecx # ecx <- BA 4655 sarl $4, %ecx # ecx <- B 4656 GET_VREG %ecx, %rcx # ecx <- vBB 4657 andb $0xf, rINSTbl # rINST <- A 4658 .if 0 4659 GET_WIDE_VREG %rax, rINSTq # rax <- vAA 4660 sall %cl, %eax # ex: sarl %cl, %eax 4661 SET_WIDE_VREG %rax, rINSTq 4662 .else 4663 GET_VREG %eax, rINSTq # eax <- vAA 4664 sall %cl, %eax # ex: sarl %cl, %eax 4665 SET_VREG %eax, rINSTq 4666 .endif 4667 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4668 4669 4670 /* ------------------------------ */ 4671 .balign 128 4672 .L_op_shr_int_2addr: /* 0xb9 */ 4673 /* File: x86_64/op_shr_int_2addr.S */ 4674 /* File: x86_64/shop2addr.S */ 4675 /* 4676 * Generic 32-bit "shift/2addr" operation. 4677 */ 4678 /* shift/2addr vA, vB */ 4679 movl rINST, %ecx # ecx <- BA 4680 sarl $4, %ecx # ecx <- B 4681 GET_VREG %ecx, %rcx # ecx <- vBB 4682 andb $0xf, rINSTbl # rINST <- A 4683 .if 0 4684 GET_WIDE_VREG %rax, rINSTq # rax <- vAA 4685 sarl %cl, %eax # ex: sarl %cl, %eax 4686 SET_WIDE_VREG %rax, rINSTq 4687 .else 4688 GET_VREG %eax, rINSTq # eax <- vAA 4689 sarl %cl, %eax # ex: sarl %cl, %eax 4690 SET_VREG %eax, rINSTq 4691 .endif 4692 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4693 4694 4695 /* ------------------------------ */ 4696 .balign 128 4697 .L_op_ushr_int_2addr: /* 0xba */ 4698 /* File: x86_64/op_ushr_int_2addr.S */ 4699 /* File: x86_64/shop2addr.S */ 4700 /* 4701 * Generic 32-bit "shift/2addr" operation. 4702 */ 4703 /* shift/2addr vA, vB */ 4704 movl rINST, %ecx # ecx <- BA 4705 sarl $4, %ecx # ecx <- B 4706 GET_VREG %ecx, %rcx # ecx <- vBB 4707 andb $0xf, rINSTbl # rINST <- A 4708 .if 0 4709 GET_WIDE_VREG %rax, rINSTq # rax <- vAA 4710 shrl %cl, %eax # ex: sarl %cl, %eax 4711 SET_WIDE_VREG %rax, rINSTq 4712 .else 4713 GET_VREG %eax, rINSTq # eax <- vAA 4714 shrl %cl, %eax # ex: sarl %cl, %eax 4715 SET_VREG %eax, rINSTq 4716 .endif 4717 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4718 4719 4720 /* ------------------------------ */ 4721 .balign 128 4722 .L_op_add_long_2addr: /* 0xbb */ 4723 /* File: x86_64/op_add_long_2addr.S */ 4724 /* File: x86_64/binopWide2addr.S */ 4725 /* 4726 * Generic 64-bit binary operation. 4727 */ 4728 /* binop/2addr vA, vB */ 4729 movl rINST, %ecx # rcx <- A+ 4730 sarl $4, rINST # rINST <- B 4731 andb $0xf, %cl # ecx <- A 4732 GET_WIDE_VREG %rax, rINSTq # rax <- vB 4733 addq %rax, (rFP,%rcx,4) # for ex: addq %rax,(rFP,%rcx,4) 4734 CLEAR_WIDE_REF %rcx 4735 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4736 4737 4738 /* ------------------------------ */ 4739 .balign 128 4740 .L_op_sub_long_2addr: /* 0xbc */ 4741 /* File: x86_64/op_sub_long_2addr.S */ 4742 /* File: x86_64/binopWide2addr.S */ 4743 /* 4744 * Generic 64-bit binary operation. 4745 */ 4746 /* binop/2addr vA, vB */ 4747 movl rINST, %ecx # rcx <- A+ 4748 sarl $4, rINST # rINST <- B 4749 andb $0xf, %cl # ecx <- A 4750 GET_WIDE_VREG %rax, rINSTq # rax <- vB 4751 subq %rax, (rFP,%rcx,4) # for ex: addq %rax,(rFP,%rcx,4) 4752 CLEAR_WIDE_REF %rcx 4753 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4754 4755 4756 /* ------------------------------ */ 4757 .balign 128 4758 .L_op_mul_long_2addr: /* 0xbd */ 4759 /* File: x86_64/op_mul_long_2addr.S */ 4760 /* mul vA, vB */ 4761 movl rINST, %ecx # rcx <- A+ 4762 sarl $4, rINST # rINST <- B 4763 andb $0xf, %cl # ecx <- A 4764 GET_WIDE_VREG %rax, %rcx # rax <- vA 4765 imulq (rFP,rINSTq,4), %rax 4766 SET_WIDE_VREG %rax, %rcx 4767 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4768 4769 /* ------------------------------ */ 4770 .balign 128 4771 .L_op_div_long_2addr: /* 0xbe */ 4772 /* File: x86_64/op_div_long_2addr.S */ 4773 /* File: x86_64/bindiv2addr.S */ 4774 /* 4775 * 32-bit binary div/rem operation. Handles special case of op1=-1. 4776 */ 4777 /* div/rem/2addr vA, vB */ 4778 movl rINST, %ecx # rcx <- BA 4779 sarl $4, %ecx # rcx <- B 4780 andb $0xf, rINSTbl # rINST <- A 4781 .if 1 4782 GET_WIDE_VREG %rax, rINSTq # eax <- vA 4783 GET_WIDE_VREG %rcx, %rcx # ecx <- vB 4784 .else 4785 GET_VREG %eax, rINSTq # eax <- vA 4786 GET_VREG %rcx, %rcx # ecx <- vB 4787 .endif 4788 testq %rcx, %rcx 4789 jz common_errDivideByZero 4790 cmpq $-1, %rcx 4791 je 2f 4792 cqo # rdx:rax <- sign-extended of rax 4793 idivq %rcx 4794 1: 4795 .if 1 4796 SET_WIDE_VREG %rax, rINSTq # vA <- result 4797 .else 4798 SET_VREG %rax, rINSTq # vA <- result 4799 .endif 4800 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4801 2: 4802 .if 0 4803 xorq %rax, %rax 4804 .else 4805 negq %rax 4806 .endif 4807 jmp 1b 4808 4809 4810 /* ------------------------------ */ 4811 .balign 128 4812 .L_op_rem_long_2addr: /* 0xbf */ 4813 /* File: x86_64/op_rem_long_2addr.S */ 4814 /* File: x86_64/bindiv2addr.S */ 4815 /* 4816 * 32-bit binary div/rem operation. Handles special case of op1=-1. 4817 */ 4818 /* div/rem/2addr vA, vB */ 4819 movl rINST, %ecx # rcx <- BA 4820 sarl $4, %ecx # rcx <- B 4821 andb $0xf, rINSTbl # rINST <- A 4822 .if 1 4823 GET_WIDE_VREG %rax, rINSTq # eax <- vA 4824 GET_WIDE_VREG %rcx, %rcx # ecx <- vB 4825 .else 4826 GET_VREG %eax, rINSTq # eax <- vA 4827 GET_VREG %rcx, %rcx # ecx <- vB 4828 .endif 4829 testq %rcx, %rcx 4830 jz common_errDivideByZero 4831 cmpq $-1, %rcx 4832 je 2f 4833 cqo # rdx:rax <- sign-extended of rax 4834 idivq %rcx 4835 1: 4836 .if 1 4837 SET_WIDE_VREG %rdx, rINSTq # vA <- result 4838 .else 4839 SET_VREG %rdx, rINSTq # vA <- result 4840 .endif 4841 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4842 2: 4843 .if 1 4844 xorq %rdx, %rdx 4845 .else 4846 negq %rdx 4847 .endif 4848 jmp 1b 4849 4850 4851 /* ------------------------------ */ 4852 .balign 128 4853 .L_op_and_long_2addr: /* 0xc0 */ 4854 /* File: x86_64/op_and_long_2addr.S */ 4855 /* File: x86_64/binopWide2addr.S */ 4856 /* 4857 * Generic 64-bit binary operation. 4858 */ 4859 /* binop/2addr vA, vB */ 4860 movl rINST, %ecx # rcx <- A+ 4861 sarl $4, rINST # rINST <- B 4862 andb $0xf, %cl # ecx <- A 4863 GET_WIDE_VREG %rax, rINSTq # rax <- vB 4864 andq %rax, (rFP,%rcx,4) # for ex: addq %rax,(rFP,%rcx,4) 4865 CLEAR_WIDE_REF %rcx 4866 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4867 4868 4869 /* ------------------------------ */ 4870 .balign 128 4871 .L_op_or_long_2addr: /* 0xc1 */ 4872 /* File: x86_64/op_or_long_2addr.S */ 4873 /* File: x86_64/binopWide2addr.S */ 4874 /* 4875 * Generic 64-bit binary operation. 4876 */ 4877 /* binop/2addr vA, vB */ 4878 movl rINST, %ecx # rcx <- A+ 4879 sarl $4, rINST # rINST <- B 4880 andb $0xf, %cl # ecx <- A 4881 GET_WIDE_VREG %rax, rINSTq # rax <- vB 4882 orq %rax, (rFP,%rcx,4) # for ex: addq %rax,(rFP,%rcx,4) 4883 CLEAR_WIDE_REF %rcx 4884 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4885 4886 4887 /* ------------------------------ */ 4888 .balign 128 4889 .L_op_xor_long_2addr: /* 0xc2 */ 4890 /* File: x86_64/op_xor_long_2addr.S */ 4891 /* File: x86_64/binopWide2addr.S */ 4892 /* 4893 * Generic 64-bit binary operation. 4894 */ 4895 /* binop/2addr vA, vB */ 4896 movl rINST, %ecx # rcx <- A+ 4897 sarl $4, rINST # rINST <- B 4898 andb $0xf, %cl # ecx <- A 4899 GET_WIDE_VREG %rax, rINSTq # rax <- vB 4900 xorq %rax, (rFP,%rcx,4) # for ex: addq %rax,(rFP,%rcx,4) 4901 CLEAR_WIDE_REF %rcx 4902 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4903 4904 4905 /* ------------------------------ */ 4906 .balign 128 4907 .L_op_shl_long_2addr: /* 0xc3 */ 4908 /* File: x86_64/op_shl_long_2addr.S */ 4909 /* File: x86_64/shop2addr.S */ 4910 /* 4911 * Generic 32-bit "shift/2addr" operation. 4912 */ 4913 /* shift/2addr vA, vB */ 4914 movl rINST, %ecx # ecx <- BA 4915 sarl $4, %ecx # ecx <- B 4916 GET_VREG %ecx, %rcx # ecx <- vBB 4917 andb $0xf, rINSTbl # rINST <- A 4918 .if 1 4919 GET_WIDE_VREG %rax, rINSTq # rax <- vAA 4920 salq %cl, %rax # ex: sarl %cl, %eax 4921 SET_WIDE_VREG %rax, rINSTq 4922 .else 4923 GET_VREG %eax, rINSTq # eax <- vAA 4924 salq %cl, %rax # ex: sarl %cl, %eax 4925 SET_VREG %eax, rINSTq 4926 .endif 4927 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4928 4929 4930 /* ------------------------------ */ 4931 .balign 128 4932 .L_op_shr_long_2addr: /* 0xc4 */ 4933 /* File: x86_64/op_shr_long_2addr.S */ 4934 /* File: x86_64/shop2addr.S */ 4935 /* 4936 * Generic 32-bit "shift/2addr" operation. 4937 */ 4938 /* shift/2addr vA, vB */ 4939 movl rINST, %ecx # ecx <- BA 4940 sarl $4, %ecx # ecx <- B 4941 GET_VREG %ecx, %rcx # ecx <- vBB 4942 andb $0xf, rINSTbl # rINST <- A 4943 .if 1 4944 GET_WIDE_VREG %rax, rINSTq # rax <- vAA 4945 sarq %cl, %rax # ex: sarl %cl, %eax 4946 SET_WIDE_VREG %rax, rINSTq 4947 .else 4948 GET_VREG %eax, rINSTq # eax <- vAA 4949 sarq %cl, %rax # ex: sarl %cl, %eax 4950 SET_VREG %eax, rINSTq 4951 .endif 4952 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4953 4954 4955 /* ------------------------------ */ 4956 .balign 128 4957 .L_op_ushr_long_2addr: /* 0xc5 */ 4958 /* File: x86_64/op_ushr_long_2addr.S */ 4959 /* File: x86_64/shop2addr.S */ 4960 /* 4961 * Generic 32-bit "shift/2addr" operation. 4962 */ 4963 /* shift/2addr vA, vB */ 4964 movl rINST, %ecx # ecx <- BA 4965 sarl $4, %ecx # ecx <- B 4966 GET_VREG %ecx, %rcx # ecx <- vBB 4967 andb $0xf, rINSTbl # rINST <- A 4968 .if 1 4969 GET_WIDE_VREG %rax, rINSTq # rax <- vAA 4970 shrq %cl, %rax # ex: sarl %cl, %eax 4971 SET_WIDE_VREG %rax, rINSTq 4972 .else 4973 GET_VREG %eax, rINSTq # eax <- vAA 4974 shrq %cl, %rax # ex: sarl %cl, %eax 4975 SET_VREG %eax, rINSTq 4976 .endif 4977 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4978 4979 4980 /* ------------------------------ */ 4981 .balign 128 4982 .L_op_add_float_2addr: /* 0xc6 */ 4983 /* File: x86_64/op_add_float_2addr.S */ 4984 /* File: x86_64/sseBinop2Addr.S */ 4985 movl rINST, %ecx # ecx <- A+ 4986 andl $0xf, %ecx # ecx <- A 4987 movss VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 4988 sarl $4, rINST # rINST<- B 4989 addss VREG_ADDRESS(rINSTq), %xmm0 4990 movss %xmm0, VREG_ADDRESS(%rcx) # vAA<- %xmm0 4991 pxor %xmm0, %xmm0 4992 movss %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 4993 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4994 4995 4996 /* ------------------------------ */ 4997 .balign 128 4998 .L_op_sub_float_2addr: /* 0xc7 */ 4999 /* File: x86_64/op_sub_float_2addr.S */ 5000 /* File: x86_64/sseBinop2Addr.S */ 5001 movl rINST, %ecx # ecx <- A+ 5002 andl $0xf, %ecx # ecx <- A 5003 movss VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 5004 sarl $4, rINST # rINST<- B 5005 subss VREG_ADDRESS(rINSTq), %xmm0 5006 movss %xmm0, VREG_ADDRESS(%rcx) # vAA<- %xmm0 5007 pxor %xmm0, %xmm0 5008 movss %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 5009 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5010 5011 5012 /* ------------------------------ */ 5013 .balign 128 5014 .L_op_mul_float_2addr: /* 0xc8 */ 5015 /* File: x86_64/op_mul_float_2addr.S */ 5016 /* File: x86_64/sseBinop2Addr.S */ 5017 movl rINST, %ecx # ecx <- A+ 5018 andl $0xf, %ecx # ecx <- A 5019 movss VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 5020 sarl $4, rINST # rINST<- B 5021 mulss VREG_ADDRESS(rINSTq), %xmm0 5022 movss %xmm0, VREG_ADDRESS(%rcx) # vAA<- %xmm0 5023 pxor %xmm0, %xmm0 5024 movss %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 5025 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5026 5027 5028 /* ------------------------------ */ 5029 .balign 128 5030 .L_op_div_float_2addr: /* 0xc9 */ 5031 /* File: x86_64/op_div_float_2addr.S */ 5032 /* File: x86_64/sseBinop2Addr.S */ 5033 movl rINST, %ecx # ecx <- A+ 5034 andl $0xf, %ecx # ecx <- A 5035 movss VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 5036 sarl $4, rINST # rINST<- B 5037 divss VREG_ADDRESS(rINSTq), %xmm0 5038 movss %xmm0, VREG_ADDRESS(%rcx) # vAA<- %xmm0 5039 pxor %xmm0, %xmm0 5040 movss %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 5041 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5042 5043 5044 /* ------------------------------ */ 5045 .balign 128 5046 .L_op_rem_float_2addr: /* 0xca */ 5047 /* File: x86_64/op_rem_float_2addr.S */ 5048 /* rem_float/2addr vA, vB */ 5049 movzbq rINSTbl, %rcx # ecx <- A+ 5050 sarl $4, rINST # rINST <- B 5051 flds VREG_ADDRESS(rINSTq) # vB to fp stack 5052 andb $0xf, %cl # ecx <- A 5053 flds VREG_ADDRESS(%rcx) # vA to fp stack 5054 1: 5055 fprem 5056 fstsw %ax 5057 sahf 5058 jp 1b 5059 fstp %st(1) 5060 fstps VREG_ADDRESS(%rcx) # %st to vA 5061 CLEAR_REF %rcx 5062 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5063 5064 /* ------------------------------ */ 5065 .balign 128 5066 .L_op_add_double_2addr: /* 0xcb */ 5067 /* File: x86_64/op_add_double_2addr.S */ 5068 /* File: x86_64/sseBinop2Addr.S */ 5069 movl rINST, %ecx # ecx <- A+ 5070 andl $0xf, %ecx # ecx <- A 5071 movsd VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 5072 sarl $4, rINST # rINST<- B 5073 addsd VREG_ADDRESS(rINSTq), %xmm0 5074 movsd %xmm0, VREG_ADDRESS(%rcx) # vAA<- %xmm0 5075 pxor %xmm0, %xmm0 5076 movsd %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 5077 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5078 5079 5080 /* ------------------------------ */ 5081 .balign 128 5082 .L_op_sub_double_2addr: /* 0xcc */ 5083 /* File: x86_64/op_sub_double_2addr.S */ 5084 /* File: x86_64/sseBinop2Addr.S */ 5085 movl rINST, %ecx # ecx <- A+ 5086 andl $0xf, %ecx # ecx <- A 5087 movsd VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 5088 sarl $4, rINST # rINST<- B 5089 subsd VREG_ADDRESS(rINSTq), %xmm0 5090 movsd %xmm0, VREG_ADDRESS(%rcx) # vAA<- %xmm0 5091 pxor %xmm0, %xmm0 5092 movsd %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 5093 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5094 5095 5096 /* ------------------------------ */ 5097 .balign 128 5098 .L_op_mul_double_2addr: /* 0xcd */ 5099 /* File: x86_64/op_mul_double_2addr.S */ 5100 /* File: x86_64/sseBinop2Addr.S */ 5101 movl rINST, %ecx # ecx <- A+ 5102 andl $0xf, %ecx # ecx <- A 5103 movsd VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 5104 sarl $4, rINST # rINST<- B 5105 mulsd VREG_ADDRESS(rINSTq), %xmm0 5106 movsd %xmm0, VREG_ADDRESS(%rcx) # vAA<- %xmm0 5107 pxor %xmm0, %xmm0 5108 movsd %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 5109 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5110 5111 5112 /* ------------------------------ */ 5113 .balign 128 5114 .L_op_div_double_2addr: /* 0xce */ 5115 /* File: x86_64/op_div_double_2addr.S */ 5116 /* File: x86_64/sseBinop2Addr.S */ 5117 movl rINST, %ecx # ecx <- A+ 5118 andl $0xf, %ecx # ecx <- A 5119 movsd VREG_ADDRESS(%rcx), %xmm0 # %xmm0 <- 1st src 5120 sarl $4, rINST # rINST<- B 5121 divsd VREG_ADDRESS(rINSTq), %xmm0 5122 movsd %xmm0, VREG_ADDRESS(%rcx) # vAA<- %xmm0 5123 pxor %xmm0, %xmm0 5124 movsd %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref 5125 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5126 5127 5128 /* ------------------------------ */ 5129 .balign 128 5130 .L_op_rem_double_2addr: /* 0xcf */ 5131 /* File: x86_64/op_rem_double_2addr.S */ 5132 /* rem_double/2addr vA, vB */ 5133 movzbq rINSTbl, %rcx # ecx <- A+ 5134 sarl $4, rINST # rINST <- B 5135 fldl VREG_ADDRESS(rINSTq) # vB to fp stack 5136 andb $0xf, %cl # ecx <- A 5137 fldl VREG_ADDRESS(%rcx) # vA to fp stack 5138 1: 5139 fprem 5140 fstsw %ax 5141 sahf 5142 jp 1b 5143 fstp %st(1) 5144 fstpl VREG_ADDRESS(%rcx) # %st to vA 5145 CLEAR_WIDE_REF %rcx 5146 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5147 5148 /* ------------------------------ */ 5149 .balign 128 5150 .L_op_add_int_lit16: /* 0xd0 */ 5151 /* File: x86_64/op_add_int_lit16.S */ 5152 /* File: x86_64/binopLit16.S */ 5153 /* 5154 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5155 * that specifies an instruction that performs "result = eax op ecx". 5156 * This could be an x86 instruction or a function call. (If the result 5157 * comes back in a register other than eax, you can override "result".) 5158 * 5159 * For: add-int/lit16, rsub-int, 5160 * and-int/lit16, or-int/lit16, xor-int/lit16 5161 */ 5162 /* binop/lit16 vA, vB, #+CCCC */ 5163 movl rINST, %eax # rax <- 000000BA 5164 sarl $4, %eax # eax <- B 5165 GET_VREG %eax, %rax # eax <- vB 5166 andb $0xf, rINSTbl # rINST <- A 5167 movswl 2(rPC), %ecx # ecx <- ssssCCCC 5168 addl %ecx, %eax # for example: addl %ecx, %eax 5169 SET_VREG %eax, rINSTq 5170 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5171 5172 5173 /* ------------------------------ */ 5174 .balign 128 5175 .L_op_rsub_int: /* 0xd1 */ 5176 /* File: x86_64/op_rsub_int.S */ 5177 /* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */ 5178 /* File: x86_64/binopLit16.S */ 5179 /* 5180 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5181 * that specifies an instruction that performs "result = eax op ecx". 5182 * This could be an x86 instruction or a function call. (If the result 5183 * comes back in a register other than eax, you can override "result".) 5184 * 5185 * For: add-int/lit16, rsub-int, 5186 * and-int/lit16, or-int/lit16, xor-int/lit16 5187 */ 5188 /* binop/lit16 vA, vB, #+CCCC */ 5189 movl rINST, %eax # rax <- 000000BA 5190 sarl $4, %eax # eax <- B 5191 GET_VREG %eax, %rax # eax <- vB 5192 andb $0xf, rINSTbl # rINST <- A 5193 movswl 2(rPC), %ecx # ecx <- ssssCCCC 5194 subl %eax, %ecx # for example: addl %ecx, %eax 5195 SET_VREG %ecx, rINSTq 5196 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5197 5198 5199 /* ------------------------------ */ 5200 .balign 128 5201 .L_op_mul_int_lit16: /* 0xd2 */ 5202 /* File: x86_64/op_mul_int_lit16.S */ 5203 /* File: x86_64/binopLit16.S */ 5204 /* 5205 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5206 * that specifies an instruction that performs "result = eax op ecx". 5207 * This could be an x86 instruction or a function call. (If the result 5208 * comes back in a register other than eax, you can override "result".) 5209 * 5210 * For: add-int/lit16, rsub-int, 5211 * and-int/lit16, or-int/lit16, xor-int/lit16 5212 */ 5213 /* binop/lit16 vA, vB, #+CCCC */ 5214 movl rINST, %eax # rax <- 000000BA 5215 sarl $4, %eax # eax <- B 5216 GET_VREG %eax, %rax # eax <- vB 5217 andb $0xf, rINSTbl # rINST <- A 5218 movswl 2(rPC), %ecx # ecx <- ssssCCCC 5219 imull %ecx, %eax # for example: addl %ecx, %eax 5220 SET_VREG %eax, rINSTq 5221 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5222 5223 5224 /* ------------------------------ */ 5225 .balign 128 5226 .L_op_div_int_lit16: /* 0xd3 */ 5227 /* File: x86_64/op_div_int_lit16.S */ 5228 /* File: x86_64/bindivLit16.S */ 5229 /* 5230 * 32-bit binary div/rem operation. Handles special case of op1=-1. 5231 */ 5232 /* div/rem/lit16 vA, vB, #+CCCC */ 5233 /* Need A in rINST, ssssCCCC in ecx, vB in eax */ 5234 movl rINST, %eax # rax <- 000000BA 5235 sarl $4, %eax # eax <- B 5236 GET_VREG %eax, %rax # eax <- vB 5237 movswl 2(rPC), %ecx # ecx <- ssssCCCC 5238 andb $0xf, rINSTbl # rINST <- A 5239 testl %ecx, %ecx 5240 jz common_errDivideByZero 5241 cmpl $-1, %ecx 5242 je 2f 5243 cdq # rax <- sign-extended of eax 5244 idivl %ecx 5245 1: 5246 SET_VREG %eax, rINSTq # vA <- result 5247 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5248 2: 5249 .if 0 5250 xorl %eax, %eax 5251 .else 5252 negl %eax 5253 .endif 5254 jmp 1b 5255 5256 5257 /* ------------------------------ */ 5258 .balign 128 5259 .L_op_rem_int_lit16: /* 0xd4 */ 5260 /* File: x86_64/op_rem_int_lit16.S */ 5261 /* File: x86_64/bindivLit16.S */ 5262 /* 5263 * 32-bit binary div/rem operation. Handles special case of op1=-1. 5264 */ 5265 /* div/rem/lit16 vA, vB, #+CCCC */ 5266 /* Need A in rINST, ssssCCCC in ecx, vB in eax */ 5267 movl rINST, %eax # rax <- 000000BA 5268 sarl $4, %eax # eax <- B 5269 GET_VREG %eax, %rax # eax <- vB 5270 movswl 2(rPC), %ecx # ecx <- ssssCCCC 5271 andb $0xf, rINSTbl # rINST <- A 5272 testl %ecx, %ecx 5273 jz common_errDivideByZero 5274 cmpl $-1, %ecx 5275 je 2f 5276 cdq # rax <- sign-extended of eax 5277 idivl %ecx 5278 1: 5279 SET_VREG %edx, rINSTq # vA <- result 5280 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5281 2: 5282 .if 1 5283 xorl %edx, %edx 5284 .else 5285 negl %edx 5286 .endif 5287 jmp 1b 5288 5289 5290 /* ------------------------------ */ 5291 .balign 128 5292 .L_op_and_int_lit16: /* 0xd5 */ 5293 /* File: x86_64/op_and_int_lit16.S */ 5294 /* File: x86_64/binopLit16.S */ 5295 /* 5296 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5297 * that specifies an instruction that performs "result = eax op ecx". 5298 * This could be an x86 instruction or a function call. (If the result 5299 * comes back in a register other than eax, you can override "result".) 5300 * 5301 * For: add-int/lit16, rsub-int, 5302 * and-int/lit16, or-int/lit16, xor-int/lit16 5303 */ 5304 /* binop/lit16 vA, vB, #+CCCC */ 5305 movl rINST, %eax # rax <- 000000BA 5306 sarl $4, %eax # eax <- B 5307 GET_VREG %eax, %rax # eax <- vB 5308 andb $0xf, rINSTbl # rINST <- A 5309 movswl 2(rPC), %ecx # ecx <- ssssCCCC 5310 andl %ecx, %eax # for example: addl %ecx, %eax 5311 SET_VREG %eax, rINSTq 5312 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5313 5314 5315 /* ------------------------------ */ 5316 .balign 128 5317 .L_op_or_int_lit16: /* 0xd6 */ 5318 /* File: x86_64/op_or_int_lit16.S */ 5319 /* File: x86_64/binopLit16.S */ 5320 /* 5321 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5322 * that specifies an instruction that performs "result = eax op ecx". 5323 * This could be an x86 instruction or a function call. (If the result 5324 * comes back in a register other than eax, you can override "result".) 5325 * 5326 * For: add-int/lit16, rsub-int, 5327 * and-int/lit16, or-int/lit16, xor-int/lit16 5328 */ 5329 /* binop/lit16 vA, vB, #+CCCC */ 5330 movl rINST, %eax # rax <- 000000BA 5331 sarl $4, %eax # eax <- B 5332 GET_VREG %eax, %rax # eax <- vB 5333 andb $0xf, rINSTbl # rINST <- A 5334 movswl 2(rPC), %ecx # ecx <- ssssCCCC 5335 orl %ecx, %eax # for example: addl %ecx, %eax 5336 SET_VREG %eax, rINSTq 5337 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5338 5339 5340 /* ------------------------------ */ 5341 .balign 128 5342 .L_op_xor_int_lit16: /* 0xd7 */ 5343 /* File: x86_64/op_xor_int_lit16.S */ 5344 /* File: x86_64/binopLit16.S */ 5345 /* 5346 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5347 * that specifies an instruction that performs "result = eax op ecx". 5348 * This could be an x86 instruction or a function call. (If the result 5349 * comes back in a register other than eax, you can override "result".) 5350 * 5351 * For: add-int/lit16, rsub-int, 5352 * and-int/lit16, or-int/lit16, xor-int/lit16 5353 */ 5354 /* binop/lit16 vA, vB, #+CCCC */ 5355 movl rINST, %eax # rax <- 000000BA 5356 sarl $4, %eax # eax <- B 5357 GET_VREG %eax, %rax # eax <- vB 5358 andb $0xf, rINSTbl # rINST <- A 5359 movswl 2(rPC), %ecx # ecx <- ssssCCCC 5360 xorl %ecx, %eax # for example: addl %ecx, %eax 5361 SET_VREG %eax, rINSTq 5362 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5363 5364 5365 /* ------------------------------ */ 5366 .balign 128 5367 .L_op_add_int_lit8: /* 0xd8 */ 5368 /* File: x86_64/op_add_int_lit8.S */ 5369 /* File: x86_64/binopLit8.S */ 5370 /* 5371 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5372 * that specifies an instruction that performs "result = eax op ecx". 5373 * This could be an x86 instruction or a function call. (If the result 5374 * comes back in a register other than r0, you can override "result".) 5375 * 5376 * For: add-int/lit8, rsub-int/lit8 5377 * and-int/lit8, or-int/lit8, xor-int/lit8, 5378 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5379 */ 5380 /* binop/lit8 vAA, vBB, #+CC */ 5381 movzbq 2(rPC), %rax # rax <- BB 5382 movsbl 3(rPC), %ecx # rcx <- ssssssCC 5383 GET_VREG %eax, %rax # eax <- rBB 5384 addl %ecx, %eax # ex: addl %ecx,%eax 5385 SET_VREG %eax, rINSTq 5386 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5387 5388 5389 /* ------------------------------ */ 5390 .balign 128 5391 .L_op_rsub_int_lit8: /* 0xd9 */ 5392 /* File: x86_64/op_rsub_int_lit8.S */ 5393 /* File: x86_64/binopLit8.S */ 5394 /* 5395 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5396 * that specifies an instruction that performs "result = eax op ecx". 5397 * This could be an x86 instruction or a function call. (If the result 5398 * comes back in a register other than r0, you can override "result".) 5399 * 5400 * For: add-int/lit8, rsub-int/lit8 5401 * and-int/lit8, or-int/lit8, xor-int/lit8, 5402 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5403 */ 5404 /* binop/lit8 vAA, vBB, #+CC */ 5405 movzbq 2(rPC), %rax # rax <- BB 5406 movsbl 3(rPC), %ecx # rcx <- ssssssCC 5407 GET_VREG %eax, %rax # eax <- rBB 5408 subl %eax, %ecx # ex: addl %ecx,%eax 5409 SET_VREG %ecx, rINSTq 5410 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5411 5412 5413 /* ------------------------------ */ 5414 .balign 128 5415 .L_op_mul_int_lit8: /* 0xda */ 5416 /* File: x86_64/op_mul_int_lit8.S */ 5417 /* File: x86_64/binopLit8.S */ 5418 /* 5419 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5420 * that specifies an instruction that performs "result = eax op ecx". 5421 * This could be an x86 instruction or a function call. (If the result 5422 * comes back in a register other than r0, you can override "result".) 5423 * 5424 * For: add-int/lit8, rsub-int/lit8 5425 * and-int/lit8, or-int/lit8, xor-int/lit8, 5426 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5427 */ 5428 /* binop/lit8 vAA, vBB, #+CC */ 5429 movzbq 2(rPC), %rax # rax <- BB 5430 movsbl 3(rPC), %ecx # rcx <- ssssssCC 5431 GET_VREG %eax, %rax # eax <- rBB 5432 imull %ecx, %eax # ex: addl %ecx,%eax 5433 SET_VREG %eax, rINSTq 5434 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5435 5436 5437 /* ------------------------------ */ 5438 .balign 128 5439 .L_op_div_int_lit8: /* 0xdb */ 5440 /* File: x86_64/op_div_int_lit8.S */ 5441 /* File: x86_64/bindivLit8.S */ 5442 /* 5443 * 32-bit div/rem "lit8" binary operation. Handles special case of 5444 * op0=minint & op1=-1 5445 */ 5446 /* div/rem/lit8 vAA, vBB, #+CC */ 5447 movzbq 2(rPC), %rax # eax <- BB 5448 movsbl 3(rPC), %ecx # ecx <- ssssssCC 5449 GET_VREG %eax, %rax # eax <- rBB 5450 testl %ecx, %ecx 5451 je common_errDivideByZero 5452 cmpl $-1, %ecx 5453 je 2f 5454 cdq # rax <- sign-extended of eax 5455 idivl %ecx 5456 1: 5457 SET_VREG %eax, rINSTq # vA <- result 5458 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5459 2: 5460 .if 0 5461 xorl %eax, %eax 5462 .else 5463 negl %eax 5464 .endif 5465 jmp 1b 5466 5467 5468 /* ------------------------------ */ 5469 .balign 128 5470 .L_op_rem_int_lit8: /* 0xdc */ 5471 /* File: x86_64/op_rem_int_lit8.S */ 5472 /* File: x86_64/bindivLit8.S */ 5473 /* 5474 * 32-bit div/rem "lit8" binary operation. Handles special case of 5475 * op0=minint & op1=-1 5476 */ 5477 /* div/rem/lit8 vAA, vBB, #+CC */ 5478 movzbq 2(rPC), %rax # eax <- BB 5479 movsbl 3(rPC), %ecx # ecx <- ssssssCC 5480 GET_VREG %eax, %rax # eax <- rBB 5481 testl %ecx, %ecx 5482 je common_errDivideByZero 5483 cmpl $-1, %ecx 5484 je 2f 5485 cdq # rax <- sign-extended of eax 5486 idivl %ecx 5487 1: 5488 SET_VREG %edx, rINSTq # vA <- result 5489 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5490 2: 5491 .if 1 5492 xorl %edx, %edx 5493 .else 5494 negl %edx 5495 .endif 5496 jmp 1b 5497 5498 5499 /* ------------------------------ */ 5500 .balign 128 5501 .L_op_and_int_lit8: /* 0xdd */ 5502 /* File: x86_64/op_and_int_lit8.S */ 5503 /* File: x86_64/binopLit8.S */ 5504 /* 5505 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5506 * that specifies an instruction that performs "result = eax op ecx". 5507 * This could be an x86 instruction or a function call. (If the result 5508 * comes back in a register other than r0, you can override "result".) 5509 * 5510 * For: add-int/lit8, rsub-int/lit8 5511 * and-int/lit8, or-int/lit8, xor-int/lit8, 5512 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5513 */ 5514 /* binop/lit8 vAA, vBB, #+CC */ 5515 movzbq 2(rPC), %rax # rax <- BB 5516 movsbl 3(rPC), %ecx # rcx <- ssssssCC 5517 GET_VREG %eax, %rax # eax <- rBB 5518 andl %ecx, %eax # ex: addl %ecx,%eax 5519 SET_VREG %eax, rINSTq 5520 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5521 5522 5523 /* ------------------------------ */ 5524 .balign 128 5525 .L_op_or_int_lit8: /* 0xde */ 5526 /* File: x86_64/op_or_int_lit8.S */ 5527 /* File: x86_64/binopLit8.S */ 5528 /* 5529 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5530 * that specifies an instruction that performs "result = eax op ecx". 5531 * This could be an x86 instruction or a function call. (If the result 5532 * comes back in a register other than r0, you can override "result".) 5533 * 5534 * For: add-int/lit8, rsub-int/lit8 5535 * and-int/lit8, or-int/lit8, xor-int/lit8, 5536 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5537 */ 5538 /* binop/lit8 vAA, vBB, #+CC */ 5539 movzbq 2(rPC), %rax # rax <- BB 5540 movsbl 3(rPC), %ecx # rcx <- ssssssCC 5541 GET_VREG %eax, %rax # eax <- rBB 5542 orl %ecx, %eax # ex: addl %ecx,%eax 5543 SET_VREG %eax, rINSTq 5544 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5545 5546 5547 /* ------------------------------ */ 5548 .balign 128 5549 .L_op_xor_int_lit8: /* 0xdf */ 5550 /* File: x86_64/op_xor_int_lit8.S */ 5551 /* File: x86_64/binopLit8.S */ 5552 /* 5553 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5554 * that specifies an instruction that performs "result = eax op ecx". 5555 * This could be an x86 instruction or a function call. (If the result 5556 * comes back in a register other than r0, you can override "result".) 5557 * 5558 * For: add-int/lit8, rsub-int/lit8 5559 * and-int/lit8, or-int/lit8, xor-int/lit8, 5560 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5561 */ 5562 /* binop/lit8 vAA, vBB, #+CC */ 5563 movzbq 2(rPC), %rax # rax <- BB 5564 movsbl 3(rPC), %ecx # rcx <- ssssssCC 5565 GET_VREG %eax, %rax # eax <- rBB 5566 xorl %ecx, %eax # ex: addl %ecx,%eax 5567 SET_VREG %eax, rINSTq 5568 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5569 5570 5571 /* ------------------------------ */ 5572 .balign 128 5573 .L_op_shl_int_lit8: /* 0xe0 */ 5574 /* File: x86_64/op_shl_int_lit8.S */ 5575 /* File: x86_64/binopLit8.S */ 5576 /* 5577 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5578 * that specifies an instruction that performs "result = eax op ecx". 5579 * This could be an x86 instruction or a function call. (If the result 5580 * comes back in a register other than r0, you can override "result".) 5581 * 5582 * For: add-int/lit8, rsub-int/lit8 5583 * and-int/lit8, or-int/lit8, xor-int/lit8, 5584 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5585 */ 5586 /* binop/lit8 vAA, vBB, #+CC */ 5587 movzbq 2(rPC), %rax # rax <- BB 5588 movsbl 3(rPC), %ecx # rcx <- ssssssCC 5589 GET_VREG %eax, %rax # eax <- rBB 5590 sall %cl, %eax # ex: addl %ecx,%eax 5591 SET_VREG %eax, rINSTq 5592 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5593 5594 5595 /* ------------------------------ */ 5596 .balign 128 5597 .L_op_shr_int_lit8: /* 0xe1 */ 5598 /* File: x86_64/op_shr_int_lit8.S */ 5599 /* File: x86_64/binopLit8.S */ 5600 /* 5601 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5602 * that specifies an instruction that performs "result = eax op ecx". 5603 * This could be an x86 instruction or a function call. (If the result 5604 * comes back in a register other than r0, you can override "result".) 5605 * 5606 * For: add-int/lit8, rsub-int/lit8 5607 * and-int/lit8, or-int/lit8, xor-int/lit8, 5608 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5609 */ 5610 /* binop/lit8 vAA, vBB, #+CC */ 5611 movzbq 2(rPC), %rax # rax <- BB 5612 movsbl 3(rPC), %ecx # rcx <- ssssssCC 5613 GET_VREG %eax, %rax # eax <- rBB 5614 sarl %cl, %eax # ex: addl %ecx,%eax 5615 SET_VREG %eax, rINSTq 5616 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5617 5618 5619 /* ------------------------------ */ 5620 .balign 128 5621 .L_op_ushr_int_lit8: /* 0xe2 */ 5622 /* File: x86_64/op_ushr_int_lit8.S */ 5623 /* File: x86_64/binopLit8.S */ 5624 /* 5625 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5626 * that specifies an instruction that performs "result = eax op ecx". 5627 * This could be an x86 instruction or a function call. (If the result 5628 * comes back in a register other than r0, you can override "result".) 5629 * 5630 * For: add-int/lit8, rsub-int/lit8 5631 * and-int/lit8, or-int/lit8, xor-int/lit8, 5632 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5633 */ 5634 /* binop/lit8 vAA, vBB, #+CC */ 5635 movzbq 2(rPC), %rax # rax <- BB 5636 movsbl 3(rPC), %ecx # rcx <- ssssssCC 5637 GET_VREG %eax, %rax # eax <- rBB 5638 shrl %cl, %eax # ex: addl %ecx,%eax 5639 SET_VREG %eax, rINSTq 5640 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5641 5642 5643 /* ------------------------------ */ 5644 .balign 128 5645 .L_op_iget_quick: /* 0xe3 */ 5646 /* File: x86_64/op_iget_quick.S */ 5647 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick, iget-wide-quick */ 5648 /* op vA, vB, offset@CCCC */ 5649 movl rINST, %ecx # rcx <- BA 5650 sarl $4, %ecx # ecx <- B 5651 GET_VREG %ecx, %rcx # vB (object we're operating on) 5652 movzwq 2(rPC), %rax # eax <- field byte offset 5653 testl %ecx, %ecx # is object null? 5654 je common_errNullObject 5655 andb $0xf,rINSTbl # rINST <- A 5656 .if 0 5657 movq (%rcx,%rax,1), %rax 5658 SET_WIDE_VREG %rax, rINSTq # fp[A] <- value 5659 .else 5660 movl (%rcx,%rax,1), %eax 5661 SET_VREG %eax, rINSTq # fp[A] <- value 5662 .endif 5663 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5664 5665 /* ------------------------------ */ 5666 .balign 128 5667 .L_op_iget_wide_quick: /* 0xe4 */ 5668 /* File: x86_64/op_iget_wide_quick.S */ 5669 /* File: x86_64/op_iget_quick.S */ 5670 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick, iget-wide-quick */ 5671 /* op vA, vB, offset@CCCC */ 5672 movl rINST, %ecx # rcx <- BA 5673 sarl $4, %ecx # ecx <- B 5674 GET_VREG %ecx, %rcx # vB (object we're operating on) 5675 movzwq 2(rPC), %rax # eax <- field byte offset 5676 testl %ecx, %ecx # is object null? 5677 je common_errNullObject 5678 andb $0xf,rINSTbl # rINST <- A 5679 .if 1 5680 movq (%rcx,%rax,1), %rax 5681 SET_WIDE_VREG %rax, rINSTq # fp[A] <- value 5682 .else 5683 movswl (%rcx,%rax,1), %eax 5684 SET_VREG %eax, rINSTq # fp[A] <- value 5685 .endif 5686 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5687 5688 5689 /* ------------------------------ */ 5690 .balign 128 5691 .L_op_iget_object_quick: /* 0xe5 */ 5692 /* File: x86_64/op_iget_object_quick.S */ 5693 /* For: iget-object-quick */ 5694 /* op vA, vB, offset@CCCC */ 5695 .extern artIGetObjectFromMterp 5696 movzbq rINSTbl, %rcx # rcx <- BA 5697 sarl $4, %ecx # ecx <- B 5698 GET_VREG OUT_32_ARG0, %rcx # vB (object we're operating on) 5699 movzwl 2(rPC), OUT_32_ARG1 # eax <- field byte offset 5700 EXPORT_PC 5701 callq SYMBOL(artIGetObjectFromMterp) # (obj, offset) 5702 movq rSELF, %rcx 5703 cmpq $0, THREAD_EXCEPTION_OFFSET(%rcx) 5704 jnz MterpException # bail out 5705 andb $0xf, rINSTbl # rINST <- A 5706 SET_VREG_OBJECT %eax, rINSTq # fp[A] <- value 5707 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5708 5709 /* ------------------------------ */ 5710 .balign 128 5711 .L_op_iput_quick: /* 0xe6 */ 5712 /* File: x86_64/op_iput_quick.S */ 5713 /* For: iput-quick, iput-object-quick */ 5714 /* op vA, vB, offset@CCCC */ 5715 movzbq rINSTbl, %rcx # rcx <- BA 5716 sarl $4, %ecx # ecx <- B 5717 GET_VREG %ecx, %rcx # vB (object we're operating on) 5718 testl %ecx, %ecx # is object null? 5719 je common_errNullObject 5720 andb $0xf, rINSTbl # rINST <- A 5721 GET_VREG rINST, rINSTq # rINST <- v[A] 5722 movzwq 2(rPC), %rax # rax <- field byte offset 5723 movl rINST, (%rcx,%rax,1) 5724 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5725 5726 /* ------------------------------ */ 5727 .balign 128 5728 .L_op_iput_wide_quick: /* 0xe7 */ 5729 /* File: x86_64/op_iput_wide_quick.S */ 5730 /* iput-wide-quick vA, vB, offset@CCCC */ 5731 movzbq rINSTbl, %rcx # rcx<- BA 5732 sarl $4, %ecx # ecx<- B 5733 GET_VREG %ecx, %rcx # vB (object we're operating on) 5734 testl %ecx, %ecx # is object null? 5735 je common_errNullObject 5736 movzwq 2(rPC), %rax # rax<- field byte offset 5737 leaq (%rcx,%rax,1), %rcx # ecx<- Address of 64-bit target 5738 andb $0xf, rINSTbl # rINST<- A 5739 GET_WIDE_VREG %rax, rINSTq # rax<- fp[A]/fp[A+1] 5740 movq %rax, (%rcx) # obj.field<- r0/r1 5741 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5742 5743 /* ------------------------------ */ 5744 .balign 128 5745 .L_op_iput_object_quick: /* 0xe8 */ 5746 /* File: x86_64/op_iput_object_quick.S */ 5747 EXPORT_PC 5748 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG0 5749 movq rPC, OUT_ARG1 5750 REFRESH_INST 232 5751 movl rINST, OUT_32_ARG2 5752 call SYMBOL(MterpIputObjectQuick) 5753 testb %al, %al 5754 jz MterpException 5755 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5756 5757 /* ------------------------------ */ 5758 .balign 128 5759 .L_op_invoke_virtual_quick: /* 0xe9 */ 5760 /* File: x86_64/op_invoke_virtual_quick.S */ 5761 /* File: x86_64/invoke.S */ 5762 /* 5763 * Generic invoke handler wrapper. 5764 */ 5765 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 5766 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 5767 .extern MterpInvokeVirtualQuick 5768 EXPORT_PC 5769 movq rSELF, OUT_ARG0 5770 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 5771 movq rPC, OUT_ARG2 5772 REFRESH_INST 233 5773 movl rINST, OUT_32_ARG3 5774 call SYMBOL(MterpInvokeVirtualQuick) 5775 testb %al, %al 5776 jz MterpException 5777 ADVANCE_PC 3 5778 call SYMBOL(MterpShouldSwitchInterpreters) 5779 testb %al, %al 5780 jnz MterpFallback 5781 FETCH_INST 5782 GOTO_NEXT 5783 5784 5785 /* ------------------------------ */ 5786 .balign 128 5787 .L_op_invoke_virtual_range_quick: /* 0xea */ 5788 /* File: x86_64/op_invoke_virtual_range_quick.S */ 5789 /* File: x86_64/invoke.S */ 5790 /* 5791 * Generic invoke handler wrapper. 5792 */ 5793 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 5794 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 5795 .extern MterpInvokeVirtualQuickRange 5796 EXPORT_PC 5797 movq rSELF, OUT_ARG0 5798 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 5799 movq rPC, OUT_ARG2 5800 REFRESH_INST 234 5801 movl rINST, OUT_32_ARG3 5802 call SYMBOL(MterpInvokeVirtualQuickRange) 5803 testb %al, %al 5804 jz MterpException 5805 ADVANCE_PC 3 5806 call SYMBOL(MterpShouldSwitchInterpreters) 5807 testb %al, %al 5808 jnz MterpFallback 5809 FETCH_INST 5810 GOTO_NEXT 5811 5812 5813 /* ------------------------------ */ 5814 .balign 128 5815 .L_op_iput_boolean_quick: /* 0xeb */ 5816 /* File: x86_64/op_iput_boolean_quick.S */ 5817 /* File: x86_64/op_iput_quick.S */ 5818 /* For: iput-quick, iput-object-quick */ 5819 /* op vA, vB, offset@CCCC */ 5820 movzbq rINSTbl, %rcx # rcx <- BA 5821 sarl $4, %ecx # ecx <- B 5822 GET_VREG %ecx, %rcx # vB (object we're operating on) 5823 testl %ecx, %ecx # is object null? 5824 je common_errNullObject 5825 andb $0xf, rINSTbl # rINST <- A 5826 GET_VREG rINST, rINSTq # rINST <- v[A] 5827 movzwq 2(rPC), %rax # rax <- field byte offset 5828 movb rINSTbl, (%rcx,%rax,1) 5829 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5830 5831 5832 /* ------------------------------ */ 5833 .balign 128 5834 .L_op_iput_byte_quick: /* 0xec */ 5835 /* File: x86_64/op_iput_byte_quick.S */ 5836 /* File: x86_64/op_iput_quick.S */ 5837 /* For: iput-quick, iput-object-quick */ 5838 /* op vA, vB, offset@CCCC */ 5839 movzbq rINSTbl, %rcx # rcx <- BA 5840 sarl $4, %ecx # ecx <- B 5841 GET_VREG %ecx, %rcx # vB (object we're operating on) 5842 testl %ecx, %ecx # is object null? 5843 je common_errNullObject 5844 andb $0xf, rINSTbl # rINST <- A 5845 GET_VREG rINST, rINSTq # rINST <- v[A] 5846 movzwq 2(rPC), %rax # rax <- field byte offset 5847 movb rINSTbl, (%rcx,%rax,1) 5848 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5849 5850 5851 /* ------------------------------ */ 5852 .balign 128 5853 .L_op_iput_char_quick: /* 0xed */ 5854 /* File: x86_64/op_iput_char_quick.S */ 5855 /* File: x86_64/op_iput_quick.S */ 5856 /* For: iput-quick, iput-object-quick */ 5857 /* op vA, vB, offset@CCCC */ 5858 movzbq rINSTbl, %rcx # rcx <- BA 5859 sarl $4, %ecx # ecx <- B 5860 GET_VREG %ecx, %rcx # vB (object we're operating on) 5861 testl %ecx, %ecx # is object null? 5862 je common_errNullObject 5863 andb $0xf, rINSTbl # rINST <- A 5864 GET_VREG rINST, rINSTq # rINST <- v[A] 5865 movzwq 2(rPC), %rax # rax <- field byte offset 5866 movw rINSTw, (%rcx,%rax,1) 5867 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5868 5869 5870 /* ------------------------------ */ 5871 .balign 128 5872 .L_op_iput_short_quick: /* 0xee */ 5873 /* File: x86_64/op_iput_short_quick.S */ 5874 /* File: x86_64/op_iput_quick.S */ 5875 /* For: iput-quick, iput-object-quick */ 5876 /* op vA, vB, offset@CCCC */ 5877 movzbq rINSTbl, %rcx # rcx <- BA 5878 sarl $4, %ecx # ecx <- B 5879 GET_VREG %ecx, %rcx # vB (object we're operating on) 5880 testl %ecx, %ecx # is object null? 5881 je common_errNullObject 5882 andb $0xf, rINSTbl # rINST <- A 5883 GET_VREG rINST, rINSTq # rINST <- v[A] 5884 movzwq 2(rPC), %rax # rax <- field byte offset 5885 movw rINSTw, (%rcx,%rax,1) 5886 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5887 5888 5889 /* ------------------------------ */ 5890 .balign 128 5891 .L_op_iget_boolean_quick: /* 0xef */ 5892 /* File: x86_64/op_iget_boolean_quick.S */ 5893 /* File: x86_64/op_iget_quick.S */ 5894 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick, iget-wide-quick */ 5895 /* op vA, vB, offset@CCCC */ 5896 movl rINST, %ecx # rcx <- BA 5897 sarl $4, %ecx # ecx <- B 5898 GET_VREG %ecx, %rcx # vB (object we're operating on) 5899 movzwq 2(rPC), %rax # eax <- field byte offset 5900 testl %ecx, %ecx # is object null? 5901 je common_errNullObject 5902 andb $0xf,rINSTbl # rINST <- A 5903 .if 0 5904 movq (%rcx,%rax,1), %rax 5905 SET_WIDE_VREG %rax, rINSTq # fp[A] <- value 5906 .else 5907 movsbl (%rcx,%rax,1), %eax 5908 SET_VREG %eax, rINSTq # fp[A] <- value 5909 .endif 5910 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5911 5912 5913 /* ------------------------------ */ 5914 .balign 128 5915 .L_op_iget_byte_quick: /* 0xf0 */ 5916 /* File: x86_64/op_iget_byte_quick.S */ 5917 /* File: x86_64/op_iget_quick.S */ 5918 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick, iget-wide-quick */ 5919 /* op vA, vB, offset@CCCC */ 5920 movl rINST, %ecx # rcx <- BA 5921 sarl $4, %ecx # ecx <- B 5922 GET_VREG %ecx, %rcx # vB (object we're operating on) 5923 movzwq 2(rPC), %rax # eax <- field byte offset 5924 testl %ecx, %ecx # is object null? 5925 je common_errNullObject 5926 andb $0xf,rINSTbl # rINST <- A 5927 .if 0 5928 movq (%rcx,%rax,1), %rax 5929 SET_WIDE_VREG %rax, rINSTq # fp[A] <- value 5930 .else 5931 movsbl (%rcx,%rax,1), %eax 5932 SET_VREG %eax, rINSTq # fp[A] <- value 5933 .endif 5934 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5935 5936 5937 /* ------------------------------ */ 5938 .balign 128 5939 .L_op_iget_char_quick: /* 0xf1 */ 5940 /* File: x86_64/op_iget_char_quick.S */ 5941 /* File: x86_64/op_iget_quick.S */ 5942 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick, iget-wide-quick */ 5943 /* op vA, vB, offset@CCCC */ 5944 movl rINST, %ecx # rcx <- BA 5945 sarl $4, %ecx # ecx <- B 5946 GET_VREG %ecx, %rcx # vB (object we're operating on) 5947 movzwq 2(rPC), %rax # eax <- field byte offset 5948 testl %ecx, %ecx # is object null? 5949 je common_errNullObject 5950 andb $0xf,rINSTbl # rINST <- A 5951 .if 0 5952 movq (%rcx,%rax,1), %rax 5953 SET_WIDE_VREG %rax, rINSTq # fp[A] <- value 5954 .else 5955 movzwl (%rcx,%rax,1), %eax 5956 SET_VREG %eax, rINSTq # fp[A] <- value 5957 .endif 5958 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5959 5960 5961 /* ------------------------------ */ 5962 .balign 128 5963 .L_op_iget_short_quick: /* 0xf2 */ 5964 /* File: x86_64/op_iget_short_quick.S */ 5965 /* File: x86_64/op_iget_quick.S */ 5966 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick, iget-wide-quick */ 5967 /* op vA, vB, offset@CCCC */ 5968 movl rINST, %ecx # rcx <- BA 5969 sarl $4, %ecx # ecx <- B 5970 GET_VREG %ecx, %rcx # vB (object we're operating on) 5971 movzwq 2(rPC), %rax # eax <- field byte offset 5972 testl %ecx, %ecx # is object null? 5973 je common_errNullObject 5974 andb $0xf,rINSTbl # rINST <- A 5975 .if 0 5976 movq (%rcx,%rax,1), %rax 5977 SET_WIDE_VREG %rax, rINSTq # fp[A] <- value 5978 .else 5979 movswl (%rcx,%rax,1), %eax 5980 SET_VREG %eax, rINSTq # fp[A] <- value 5981 .endif 5982 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5983 5984 5985 /* ------------------------------ */ 5986 .balign 128 5987 .L_op_unused_f3: /* 0xf3 */ 5988 /* File: x86_64/op_unused_f3.S */ 5989 /* File: x86_64/unused.S */ 5990 /* 5991 * Bail to reference interpreter to throw. 5992 */ 5993 jmp MterpFallback 5994 5995 5996 /* ------------------------------ */ 5997 .balign 128 5998 .L_op_unused_f4: /* 0xf4 */ 5999 /* File: x86_64/op_unused_f4.S */ 6000 /* File: x86_64/unused.S */ 6001 /* 6002 * Bail to reference interpreter to throw. 6003 */ 6004 jmp MterpFallback 6005 6006 6007 /* ------------------------------ */ 6008 .balign 128 6009 .L_op_unused_f5: /* 0xf5 */ 6010 /* File: x86_64/op_unused_f5.S */ 6011 /* File: x86_64/unused.S */ 6012 /* 6013 * Bail to reference interpreter to throw. 6014 */ 6015 jmp MterpFallback 6016 6017 6018 /* ------------------------------ */ 6019 .balign 128 6020 .L_op_unused_f6: /* 0xf6 */ 6021 /* File: x86_64/op_unused_f6.S */ 6022 /* File: x86_64/unused.S */ 6023 /* 6024 * Bail to reference interpreter to throw. 6025 */ 6026 jmp MterpFallback 6027 6028 6029 /* ------------------------------ */ 6030 .balign 128 6031 .L_op_unused_f7: /* 0xf7 */ 6032 /* File: x86_64/op_unused_f7.S */ 6033 /* File: x86_64/unused.S */ 6034 /* 6035 * Bail to reference interpreter to throw. 6036 */ 6037 jmp MterpFallback 6038 6039 6040 /* ------------------------------ */ 6041 .balign 128 6042 .L_op_unused_f8: /* 0xf8 */ 6043 /* File: x86_64/op_unused_f8.S */ 6044 /* File: x86_64/unused.S */ 6045 /* 6046 * Bail to reference interpreter to throw. 6047 */ 6048 jmp MterpFallback 6049 6050 6051 /* ------------------------------ */ 6052 .balign 128 6053 .L_op_unused_f9: /* 0xf9 */ 6054 /* File: x86_64/op_unused_f9.S */ 6055 /* File: x86_64/unused.S */ 6056 /* 6057 * Bail to reference interpreter to throw. 6058 */ 6059 jmp MterpFallback 6060 6061 6062 /* ------------------------------ */ 6063 .balign 128 6064 .L_op_invoke_polymorphic: /* 0xfa */ 6065 /* File: x86_64/op_invoke_polymorphic.S */ 6066 /* File: x86_64/invoke_polymorphic.S */ 6067 /* 6068 * invoke-polymorphic handler wrapper. 6069 */ 6070 /* op {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH */ 6071 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB, proto@HHHH */ 6072 .extern MterpInvokePolymorphic 6073 EXPORT_PC 6074 movq rSELF, OUT_ARG0 6075 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6076 movq rPC, OUT_ARG2 6077 REFRESH_INST 250 6078 movl rINST, OUT_32_ARG3 6079 call SYMBOL(MterpInvokePolymorphic) 6080 testb %al, %al 6081 jz MterpException 6082 ADVANCE_PC 4 6083 call SYMBOL(MterpShouldSwitchInterpreters) 6084 testb %al, %al 6085 jnz MterpFallback 6086 FETCH_INST 6087 GOTO_NEXT 6088 6089 6090 /* ------------------------------ */ 6091 .balign 128 6092 .L_op_invoke_polymorphic_range: /* 0xfb */ 6093 /* File: x86_64/op_invoke_polymorphic_range.S */ 6094 /* File: x86_64/invoke_polymorphic.S */ 6095 /* 6096 * invoke-polymorphic handler wrapper. 6097 */ 6098 /* op {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH */ 6099 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB, proto@HHHH */ 6100 .extern MterpInvokePolymorphicRange 6101 EXPORT_PC 6102 movq rSELF, OUT_ARG0 6103 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6104 movq rPC, OUT_ARG2 6105 REFRESH_INST 251 6106 movl rINST, OUT_32_ARG3 6107 call SYMBOL(MterpInvokePolymorphicRange) 6108 testb %al, %al 6109 jz MterpException 6110 ADVANCE_PC 4 6111 call SYMBOL(MterpShouldSwitchInterpreters) 6112 testb %al, %al 6113 jnz MterpFallback 6114 FETCH_INST 6115 GOTO_NEXT 6116 6117 6118 /* ------------------------------ */ 6119 .balign 128 6120 .L_op_invoke_custom: /* 0xfc */ 6121 /* File: x86_64/op_invoke_custom.S */ 6122 /* File: x86_64/invoke.S */ 6123 /* 6124 * Generic invoke handler wrapper. 6125 */ 6126 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 6127 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 6128 .extern MterpInvokeCustom 6129 EXPORT_PC 6130 movq rSELF, OUT_ARG0 6131 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6132 movq rPC, OUT_ARG2 6133 REFRESH_INST 252 6134 movl rINST, OUT_32_ARG3 6135 call SYMBOL(MterpInvokeCustom) 6136 testb %al, %al 6137 jz MterpException 6138 ADVANCE_PC 3 6139 call SYMBOL(MterpShouldSwitchInterpreters) 6140 testb %al, %al 6141 jnz MterpFallback 6142 FETCH_INST 6143 GOTO_NEXT 6144 6145 6146 /* ------------------------------ */ 6147 .balign 128 6148 .L_op_invoke_custom_range: /* 0xfd */ 6149 /* File: x86_64/op_invoke_custom_range.S */ 6150 /* File: x86_64/invoke.S */ 6151 /* 6152 * Generic invoke handler wrapper. 6153 */ 6154 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 6155 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 6156 .extern MterpInvokeCustomRange 6157 EXPORT_PC 6158 movq rSELF, OUT_ARG0 6159 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6160 movq rPC, OUT_ARG2 6161 REFRESH_INST 253 6162 movl rINST, OUT_32_ARG3 6163 call SYMBOL(MterpInvokeCustomRange) 6164 testb %al, %al 6165 jz MterpException 6166 ADVANCE_PC 3 6167 call SYMBOL(MterpShouldSwitchInterpreters) 6168 testb %al, %al 6169 jnz MterpFallback 6170 FETCH_INST 6171 GOTO_NEXT 6172 6173 6174 /* ------------------------------ */ 6175 .balign 128 6176 .L_op_const_method_handle: /* 0xfe */ 6177 /* File: x86_64/op_const_method_handle.S */ 6178 /* File: x86_64/const.S */ 6179 /* const/class vAA, type@BBBB */ 6180 /* const/method-handle vAA, method_handle@BBBB */ 6181 /* const/method-type vAA, proto@BBBB */ 6182 /* const/string vAA, string@@BBBB */ 6183 .extern MterpConstMethodHandle 6184 EXPORT_PC 6185 movzwq 2(rPC), OUT_ARG0 # eax <- OUT_ARG0 6186 movq rINSTq, OUT_ARG1 6187 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG2 6188 movq rSELF, OUT_ARG3 6189 call SYMBOL(MterpConstMethodHandle) # (index, tgt_reg, shadow_frame, self) 6190 testb %al, %al 6191 jnz MterpPossibleException 6192 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 6193 6194 6195 /* ------------------------------ */ 6196 .balign 128 6197 .L_op_const_method_type: /* 0xff */ 6198 /* File: x86_64/op_const_method_type.S */ 6199 /* File: x86_64/const.S */ 6200 /* const/class vAA, type@BBBB */ 6201 /* const/method-handle vAA, method_handle@BBBB */ 6202 /* const/method-type vAA, proto@BBBB */ 6203 /* const/string vAA, string@@BBBB */ 6204 .extern MterpConstMethodType 6205 EXPORT_PC 6206 movzwq 2(rPC), OUT_ARG0 # eax <- OUT_ARG0 6207 movq rINSTq, OUT_ARG1 6208 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG2 6209 movq rSELF, OUT_ARG3 6210 call SYMBOL(MterpConstMethodType) # (index, tgt_reg, shadow_frame, self) 6211 testb %al, %al 6212 jnz MterpPossibleException 6213 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 6214 6215 6216 .balign 128 6217 .global SYMBOL(artMterpAsmInstructionEnd) 6218 SYMBOL(artMterpAsmInstructionEnd): 6219 6220 /* 6221 * =========================================================================== 6222 * Sister implementations 6223 * =========================================================================== 6224 */ 6225 .global SYMBOL(artMterpAsmSisterStart) 6226 .text 6227 .balign 4 6228 SYMBOL(artMterpAsmSisterStart): 6229 .global SYMBOL(artMterpAsmSisterEnd) 6230 SYMBOL(artMterpAsmSisterEnd): 6231 6232 6233 .global SYMBOL(artMterpAsmAltInstructionStart) 6234 .text 6235 6236 SYMBOL(artMterpAsmAltInstructionStart) = .L_ALT_op_nop 6237 /* ------------------------------ */ 6238 .balign 128 6239 .L_ALT_op_nop: /* 0x00 */ 6240 /* File: x86_64/alt_stub.S */ 6241 /* 6242 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6243 * any interesting requests and then jump to the real instruction 6244 * handler. Unlike the Arm handler, we can't do this as a tail call 6245 * because rIBASE is caller save and we need to reload it. 6246 * 6247 * Note that unlike in the Arm implementation, we should never arrive 6248 * here with a zero breakFlag because we always refresh rIBASE on 6249 * return. 6250 */ 6251 .extern MterpCheckBefore 6252 REFRESH_IBASE 6253 movq rSELF, OUT_ARG0 6254 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6255 movq rPC, OUT_ARG2 6256 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6257 jmp .L_op_nop+(0*128) 6258 6259 /* ------------------------------ */ 6260 .balign 128 6261 .L_ALT_op_move: /* 0x01 */ 6262 /* File: x86_64/alt_stub.S */ 6263 /* 6264 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6265 * any interesting requests and then jump to the real instruction 6266 * handler. Unlike the Arm handler, we can't do this as a tail call 6267 * because rIBASE is caller save and we need to reload it. 6268 * 6269 * Note that unlike in the Arm implementation, we should never arrive 6270 * here with a zero breakFlag because we always refresh rIBASE on 6271 * return. 6272 */ 6273 .extern MterpCheckBefore 6274 REFRESH_IBASE 6275 movq rSELF, OUT_ARG0 6276 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6277 movq rPC, OUT_ARG2 6278 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6279 jmp .L_op_nop+(1*128) 6280 6281 /* ------------------------------ */ 6282 .balign 128 6283 .L_ALT_op_move_from16: /* 0x02 */ 6284 /* File: x86_64/alt_stub.S */ 6285 /* 6286 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6287 * any interesting requests and then jump to the real instruction 6288 * handler. Unlike the Arm handler, we can't do this as a tail call 6289 * because rIBASE is caller save and we need to reload it. 6290 * 6291 * Note that unlike in the Arm implementation, we should never arrive 6292 * here with a zero breakFlag because we always refresh rIBASE on 6293 * return. 6294 */ 6295 .extern MterpCheckBefore 6296 REFRESH_IBASE 6297 movq rSELF, OUT_ARG0 6298 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6299 movq rPC, OUT_ARG2 6300 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6301 jmp .L_op_nop+(2*128) 6302 6303 /* ------------------------------ */ 6304 .balign 128 6305 .L_ALT_op_move_16: /* 0x03 */ 6306 /* File: x86_64/alt_stub.S */ 6307 /* 6308 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6309 * any interesting requests and then jump to the real instruction 6310 * handler. Unlike the Arm handler, we can't do this as a tail call 6311 * because rIBASE is caller save and we need to reload it. 6312 * 6313 * Note that unlike in the Arm implementation, we should never arrive 6314 * here with a zero breakFlag because we always refresh rIBASE on 6315 * return. 6316 */ 6317 .extern MterpCheckBefore 6318 REFRESH_IBASE 6319 movq rSELF, OUT_ARG0 6320 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6321 movq rPC, OUT_ARG2 6322 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6323 jmp .L_op_nop+(3*128) 6324 6325 /* ------------------------------ */ 6326 .balign 128 6327 .L_ALT_op_move_wide: /* 0x04 */ 6328 /* File: x86_64/alt_stub.S */ 6329 /* 6330 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6331 * any interesting requests and then jump to the real instruction 6332 * handler. Unlike the Arm handler, we can't do this as a tail call 6333 * because rIBASE is caller save and we need to reload it. 6334 * 6335 * Note that unlike in the Arm implementation, we should never arrive 6336 * here with a zero breakFlag because we always refresh rIBASE on 6337 * return. 6338 */ 6339 .extern MterpCheckBefore 6340 REFRESH_IBASE 6341 movq rSELF, OUT_ARG0 6342 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6343 movq rPC, OUT_ARG2 6344 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6345 jmp .L_op_nop+(4*128) 6346 6347 /* ------------------------------ */ 6348 .balign 128 6349 .L_ALT_op_move_wide_from16: /* 0x05 */ 6350 /* File: x86_64/alt_stub.S */ 6351 /* 6352 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6353 * any interesting requests and then jump to the real instruction 6354 * handler. Unlike the Arm handler, we can't do this as a tail call 6355 * because rIBASE is caller save and we need to reload it. 6356 * 6357 * Note that unlike in the Arm implementation, we should never arrive 6358 * here with a zero breakFlag because we always refresh rIBASE on 6359 * return. 6360 */ 6361 .extern MterpCheckBefore 6362 REFRESH_IBASE 6363 movq rSELF, OUT_ARG0 6364 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6365 movq rPC, OUT_ARG2 6366 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6367 jmp .L_op_nop+(5*128) 6368 6369 /* ------------------------------ */ 6370 .balign 128 6371 .L_ALT_op_move_wide_16: /* 0x06 */ 6372 /* File: x86_64/alt_stub.S */ 6373 /* 6374 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6375 * any interesting requests and then jump to the real instruction 6376 * handler. Unlike the Arm handler, we can't do this as a tail call 6377 * because rIBASE is caller save and we need to reload it. 6378 * 6379 * Note that unlike in the Arm implementation, we should never arrive 6380 * here with a zero breakFlag because we always refresh rIBASE on 6381 * return. 6382 */ 6383 .extern MterpCheckBefore 6384 REFRESH_IBASE 6385 movq rSELF, OUT_ARG0 6386 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6387 movq rPC, OUT_ARG2 6388 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6389 jmp .L_op_nop+(6*128) 6390 6391 /* ------------------------------ */ 6392 .balign 128 6393 .L_ALT_op_move_object: /* 0x07 */ 6394 /* File: x86_64/alt_stub.S */ 6395 /* 6396 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6397 * any interesting requests and then jump to the real instruction 6398 * handler. Unlike the Arm handler, we can't do this as a tail call 6399 * because rIBASE is caller save and we need to reload it. 6400 * 6401 * Note that unlike in the Arm implementation, we should never arrive 6402 * here with a zero breakFlag because we always refresh rIBASE on 6403 * return. 6404 */ 6405 .extern MterpCheckBefore 6406 REFRESH_IBASE 6407 movq rSELF, OUT_ARG0 6408 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6409 movq rPC, OUT_ARG2 6410 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6411 jmp .L_op_nop+(7*128) 6412 6413 /* ------------------------------ */ 6414 .balign 128 6415 .L_ALT_op_move_object_from16: /* 0x08 */ 6416 /* File: x86_64/alt_stub.S */ 6417 /* 6418 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6419 * any interesting requests and then jump to the real instruction 6420 * handler. Unlike the Arm handler, we can't do this as a tail call 6421 * because rIBASE is caller save and we need to reload it. 6422 * 6423 * Note that unlike in the Arm implementation, we should never arrive 6424 * here with a zero breakFlag because we always refresh rIBASE on 6425 * return. 6426 */ 6427 .extern MterpCheckBefore 6428 REFRESH_IBASE 6429 movq rSELF, OUT_ARG0 6430 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6431 movq rPC, OUT_ARG2 6432 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6433 jmp .L_op_nop+(8*128) 6434 6435 /* ------------------------------ */ 6436 .balign 128 6437 .L_ALT_op_move_object_16: /* 0x09 */ 6438 /* File: x86_64/alt_stub.S */ 6439 /* 6440 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6441 * any interesting requests and then jump to the real instruction 6442 * handler. Unlike the Arm handler, we can't do this as a tail call 6443 * because rIBASE is caller save and we need to reload it. 6444 * 6445 * Note that unlike in the Arm implementation, we should never arrive 6446 * here with a zero breakFlag because we always refresh rIBASE on 6447 * return. 6448 */ 6449 .extern MterpCheckBefore 6450 REFRESH_IBASE 6451 movq rSELF, OUT_ARG0 6452 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6453 movq rPC, OUT_ARG2 6454 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6455 jmp .L_op_nop+(9*128) 6456 6457 /* ------------------------------ */ 6458 .balign 128 6459 .L_ALT_op_move_result: /* 0x0a */ 6460 /* File: x86_64/alt_stub.S */ 6461 /* 6462 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6463 * any interesting requests and then jump to the real instruction 6464 * handler. Unlike the Arm handler, we can't do this as a tail call 6465 * because rIBASE is caller save and we need to reload it. 6466 * 6467 * Note that unlike in the Arm implementation, we should never arrive 6468 * here with a zero breakFlag because we always refresh rIBASE on 6469 * return. 6470 */ 6471 .extern MterpCheckBefore 6472 REFRESH_IBASE 6473 movq rSELF, OUT_ARG0 6474 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6475 movq rPC, OUT_ARG2 6476 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6477 jmp .L_op_nop+(10*128) 6478 6479 /* ------------------------------ */ 6480 .balign 128 6481 .L_ALT_op_move_result_wide: /* 0x0b */ 6482 /* File: x86_64/alt_stub.S */ 6483 /* 6484 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6485 * any interesting requests and then jump to the real instruction 6486 * handler. Unlike the Arm handler, we can't do this as a tail call 6487 * because rIBASE is caller save and we need to reload it. 6488 * 6489 * Note that unlike in the Arm implementation, we should never arrive 6490 * here with a zero breakFlag because we always refresh rIBASE on 6491 * return. 6492 */ 6493 .extern MterpCheckBefore 6494 REFRESH_IBASE 6495 movq rSELF, OUT_ARG0 6496 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6497 movq rPC, OUT_ARG2 6498 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6499 jmp .L_op_nop+(11*128) 6500 6501 /* ------------------------------ */ 6502 .balign 128 6503 .L_ALT_op_move_result_object: /* 0x0c */ 6504 /* File: x86_64/alt_stub.S */ 6505 /* 6506 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6507 * any interesting requests and then jump to the real instruction 6508 * handler. Unlike the Arm handler, we can't do this as a tail call 6509 * because rIBASE is caller save and we need to reload it. 6510 * 6511 * Note that unlike in the Arm implementation, we should never arrive 6512 * here with a zero breakFlag because we always refresh rIBASE on 6513 * return. 6514 */ 6515 .extern MterpCheckBefore 6516 REFRESH_IBASE 6517 movq rSELF, OUT_ARG0 6518 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6519 movq rPC, OUT_ARG2 6520 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6521 jmp .L_op_nop+(12*128) 6522 6523 /* ------------------------------ */ 6524 .balign 128 6525 .L_ALT_op_move_exception: /* 0x0d */ 6526 /* File: x86_64/alt_stub.S */ 6527 /* 6528 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6529 * any interesting requests and then jump to the real instruction 6530 * handler. Unlike the Arm handler, we can't do this as a tail call 6531 * because rIBASE is caller save and we need to reload it. 6532 * 6533 * Note that unlike in the Arm implementation, we should never arrive 6534 * here with a zero breakFlag because we always refresh rIBASE on 6535 * return. 6536 */ 6537 .extern MterpCheckBefore 6538 REFRESH_IBASE 6539 movq rSELF, OUT_ARG0 6540 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6541 movq rPC, OUT_ARG2 6542 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6543 jmp .L_op_nop+(13*128) 6544 6545 /* ------------------------------ */ 6546 .balign 128 6547 .L_ALT_op_return_void: /* 0x0e */ 6548 /* File: x86_64/alt_stub.S */ 6549 /* 6550 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6551 * any interesting requests and then jump to the real instruction 6552 * handler. Unlike the Arm handler, we can't do this as a tail call 6553 * because rIBASE is caller save and we need to reload it. 6554 * 6555 * Note that unlike in the Arm implementation, we should never arrive 6556 * here with a zero breakFlag because we always refresh rIBASE on 6557 * return. 6558 */ 6559 .extern MterpCheckBefore 6560 REFRESH_IBASE 6561 movq rSELF, OUT_ARG0 6562 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6563 movq rPC, OUT_ARG2 6564 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6565 jmp .L_op_nop+(14*128) 6566 6567 /* ------------------------------ */ 6568 .balign 128 6569 .L_ALT_op_return: /* 0x0f */ 6570 /* File: x86_64/alt_stub.S */ 6571 /* 6572 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6573 * any interesting requests and then jump to the real instruction 6574 * handler. Unlike the Arm handler, we can't do this as a tail call 6575 * because rIBASE is caller save and we need to reload it. 6576 * 6577 * Note that unlike in the Arm implementation, we should never arrive 6578 * here with a zero breakFlag because we always refresh rIBASE on 6579 * return. 6580 */ 6581 .extern MterpCheckBefore 6582 REFRESH_IBASE 6583 movq rSELF, OUT_ARG0 6584 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6585 movq rPC, OUT_ARG2 6586 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6587 jmp .L_op_nop+(15*128) 6588 6589 /* ------------------------------ */ 6590 .balign 128 6591 .L_ALT_op_return_wide: /* 0x10 */ 6592 /* File: x86_64/alt_stub.S */ 6593 /* 6594 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6595 * any interesting requests and then jump to the real instruction 6596 * handler. Unlike the Arm handler, we can't do this as a tail call 6597 * because rIBASE is caller save and we need to reload it. 6598 * 6599 * Note that unlike in the Arm implementation, we should never arrive 6600 * here with a zero breakFlag because we always refresh rIBASE on 6601 * return. 6602 */ 6603 .extern MterpCheckBefore 6604 REFRESH_IBASE 6605 movq rSELF, OUT_ARG0 6606 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6607 movq rPC, OUT_ARG2 6608 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6609 jmp .L_op_nop+(16*128) 6610 6611 /* ------------------------------ */ 6612 .balign 128 6613 .L_ALT_op_return_object: /* 0x11 */ 6614 /* File: x86_64/alt_stub.S */ 6615 /* 6616 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6617 * any interesting requests and then jump to the real instruction 6618 * handler. Unlike the Arm handler, we can't do this as a tail call 6619 * because rIBASE is caller save and we need to reload it. 6620 * 6621 * Note that unlike in the Arm implementation, we should never arrive 6622 * here with a zero breakFlag because we always refresh rIBASE on 6623 * return. 6624 */ 6625 .extern MterpCheckBefore 6626 REFRESH_IBASE 6627 movq rSELF, OUT_ARG0 6628 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6629 movq rPC, OUT_ARG2 6630 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6631 jmp .L_op_nop+(17*128) 6632 6633 /* ------------------------------ */ 6634 .balign 128 6635 .L_ALT_op_const_4: /* 0x12 */ 6636 /* File: x86_64/alt_stub.S */ 6637 /* 6638 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6639 * any interesting requests and then jump to the real instruction 6640 * handler. Unlike the Arm handler, we can't do this as a tail call 6641 * because rIBASE is caller save and we need to reload it. 6642 * 6643 * Note that unlike in the Arm implementation, we should never arrive 6644 * here with a zero breakFlag because we always refresh rIBASE on 6645 * return. 6646 */ 6647 .extern MterpCheckBefore 6648 REFRESH_IBASE 6649 movq rSELF, OUT_ARG0 6650 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6651 movq rPC, OUT_ARG2 6652 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6653 jmp .L_op_nop+(18*128) 6654 6655 /* ------------------------------ */ 6656 .balign 128 6657 .L_ALT_op_const_16: /* 0x13 */ 6658 /* File: x86_64/alt_stub.S */ 6659 /* 6660 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6661 * any interesting requests and then jump to the real instruction 6662 * handler. Unlike the Arm handler, we can't do this as a tail call 6663 * because rIBASE is caller save and we need to reload it. 6664 * 6665 * Note that unlike in the Arm implementation, we should never arrive 6666 * here with a zero breakFlag because we always refresh rIBASE on 6667 * return. 6668 */ 6669 .extern MterpCheckBefore 6670 REFRESH_IBASE 6671 movq rSELF, OUT_ARG0 6672 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6673 movq rPC, OUT_ARG2 6674 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6675 jmp .L_op_nop+(19*128) 6676 6677 /* ------------------------------ */ 6678 .balign 128 6679 .L_ALT_op_const: /* 0x14 */ 6680 /* File: x86_64/alt_stub.S */ 6681 /* 6682 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6683 * any interesting requests and then jump to the real instruction 6684 * handler. Unlike the Arm handler, we can't do this as a tail call 6685 * because rIBASE is caller save and we need to reload it. 6686 * 6687 * Note that unlike in the Arm implementation, we should never arrive 6688 * here with a zero breakFlag because we always refresh rIBASE on 6689 * return. 6690 */ 6691 .extern MterpCheckBefore 6692 REFRESH_IBASE 6693 movq rSELF, OUT_ARG0 6694 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6695 movq rPC, OUT_ARG2 6696 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6697 jmp .L_op_nop+(20*128) 6698 6699 /* ------------------------------ */ 6700 .balign 128 6701 .L_ALT_op_const_high16: /* 0x15 */ 6702 /* File: x86_64/alt_stub.S */ 6703 /* 6704 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6705 * any interesting requests and then jump to the real instruction 6706 * handler. Unlike the Arm handler, we can't do this as a tail call 6707 * because rIBASE is caller save and we need to reload it. 6708 * 6709 * Note that unlike in the Arm implementation, we should never arrive 6710 * here with a zero breakFlag because we always refresh rIBASE on 6711 * return. 6712 */ 6713 .extern MterpCheckBefore 6714 REFRESH_IBASE 6715 movq rSELF, OUT_ARG0 6716 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6717 movq rPC, OUT_ARG2 6718 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6719 jmp .L_op_nop+(21*128) 6720 6721 /* ------------------------------ */ 6722 .balign 128 6723 .L_ALT_op_const_wide_16: /* 0x16 */ 6724 /* File: x86_64/alt_stub.S */ 6725 /* 6726 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6727 * any interesting requests and then jump to the real instruction 6728 * handler. Unlike the Arm handler, we can't do this as a tail call 6729 * because rIBASE is caller save and we need to reload it. 6730 * 6731 * Note that unlike in the Arm implementation, we should never arrive 6732 * here with a zero breakFlag because we always refresh rIBASE on 6733 * return. 6734 */ 6735 .extern MterpCheckBefore 6736 REFRESH_IBASE 6737 movq rSELF, OUT_ARG0 6738 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6739 movq rPC, OUT_ARG2 6740 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6741 jmp .L_op_nop+(22*128) 6742 6743 /* ------------------------------ */ 6744 .balign 128 6745 .L_ALT_op_const_wide_32: /* 0x17 */ 6746 /* File: x86_64/alt_stub.S */ 6747 /* 6748 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6749 * any interesting requests and then jump to the real instruction 6750 * handler. Unlike the Arm handler, we can't do this as a tail call 6751 * because rIBASE is caller save and we need to reload it. 6752 * 6753 * Note that unlike in the Arm implementation, we should never arrive 6754 * here with a zero breakFlag because we always refresh rIBASE on 6755 * return. 6756 */ 6757 .extern MterpCheckBefore 6758 REFRESH_IBASE 6759 movq rSELF, OUT_ARG0 6760 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6761 movq rPC, OUT_ARG2 6762 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6763 jmp .L_op_nop+(23*128) 6764 6765 /* ------------------------------ */ 6766 .balign 128 6767 .L_ALT_op_const_wide: /* 0x18 */ 6768 /* File: x86_64/alt_stub.S */ 6769 /* 6770 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6771 * any interesting requests and then jump to the real instruction 6772 * handler. Unlike the Arm handler, we can't do this as a tail call 6773 * because rIBASE is caller save and we need to reload it. 6774 * 6775 * Note that unlike in the Arm implementation, we should never arrive 6776 * here with a zero breakFlag because we always refresh rIBASE on 6777 * return. 6778 */ 6779 .extern MterpCheckBefore 6780 REFRESH_IBASE 6781 movq rSELF, OUT_ARG0 6782 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6783 movq rPC, OUT_ARG2 6784 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6785 jmp .L_op_nop+(24*128) 6786 6787 /* ------------------------------ */ 6788 .balign 128 6789 .L_ALT_op_const_wide_high16: /* 0x19 */ 6790 /* File: x86_64/alt_stub.S */ 6791 /* 6792 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6793 * any interesting requests and then jump to the real instruction 6794 * handler. Unlike the Arm handler, we can't do this as a tail call 6795 * because rIBASE is caller save and we need to reload it. 6796 * 6797 * Note that unlike in the Arm implementation, we should never arrive 6798 * here with a zero breakFlag because we always refresh rIBASE on 6799 * return. 6800 */ 6801 .extern MterpCheckBefore 6802 REFRESH_IBASE 6803 movq rSELF, OUT_ARG0 6804 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6805 movq rPC, OUT_ARG2 6806 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6807 jmp .L_op_nop+(25*128) 6808 6809 /* ------------------------------ */ 6810 .balign 128 6811 .L_ALT_op_const_string: /* 0x1a */ 6812 /* File: x86_64/alt_stub.S */ 6813 /* 6814 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6815 * any interesting requests and then jump to the real instruction 6816 * handler. Unlike the Arm handler, we can't do this as a tail call 6817 * because rIBASE is caller save and we need to reload it. 6818 * 6819 * Note that unlike in the Arm implementation, we should never arrive 6820 * here with a zero breakFlag because we always refresh rIBASE on 6821 * return. 6822 */ 6823 .extern MterpCheckBefore 6824 REFRESH_IBASE 6825 movq rSELF, OUT_ARG0 6826 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6827 movq rPC, OUT_ARG2 6828 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6829 jmp .L_op_nop+(26*128) 6830 6831 /* ------------------------------ */ 6832 .balign 128 6833 .L_ALT_op_const_string_jumbo: /* 0x1b */ 6834 /* File: x86_64/alt_stub.S */ 6835 /* 6836 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6837 * any interesting requests and then jump to the real instruction 6838 * handler. Unlike the Arm handler, we can't do this as a tail call 6839 * because rIBASE is caller save and we need to reload it. 6840 * 6841 * Note that unlike in the Arm implementation, we should never arrive 6842 * here with a zero breakFlag because we always refresh rIBASE on 6843 * return. 6844 */ 6845 .extern MterpCheckBefore 6846 REFRESH_IBASE 6847 movq rSELF, OUT_ARG0 6848 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6849 movq rPC, OUT_ARG2 6850 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6851 jmp .L_op_nop+(27*128) 6852 6853 /* ------------------------------ */ 6854 .balign 128 6855 .L_ALT_op_const_class: /* 0x1c */ 6856 /* File: x86_64/alt_stub.S */ 6857 /* 6858 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6859 * any interesting requests and then jump to the real instruction 6860 * handler. Unlike the Arm handler, we can't do this as a tail call 6861 * because rIBASE is caller save and we need to reload it. 6862 * 6863 * Note that unlike in the Arm implementation, we should never arrive 6864 * here with a zero breakFlag because we always refresh rIBASE on 6865 * return. 6866 */ 6867 .extern MterpCheckBefore 6868 REFRESH_IBASE 6869 movq rSELF, OUT_ARG0 6870 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6871 movq rPC, OUT_ARG2 6872 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6873 jmp .L_op_nop+(28*128) 6874 6875 /* ------------------------------ */ 6876 .balign 128 6877 .L_ALT_op_monitor_enter: /* 0x1d */ 6878 /* File: x86_64/alt_stub.S */ 6879 /* 6880 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6881 * any interesting requests and then jump to the real instruction 6882 * handler. Unlike the Arm handler, we can't do this as a tail call 6883 * because rIBASE is caller save and we need to reload it. 6884 * 6885 * Note that unlike in the Arm implementation, we should never arrive 6886 * here with a zero breakFlag because we always refresh rIBASE on 6887 * return. 6888 */ 6889 .extern MterpCheckBefore 6890 REFRESH_IBASE 6891 movq rSELF, OUT_ARG0 6892 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6893 movq rPC, OUT_ARG2 6894 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6895 jmp .L_op_nop+(29*128) 6896 6897 /* ------------------------------ */ 6898 .balign 128 6899 .L_ALT_op_monitor_exit: /* 0x1e */ 6900 /* File: x86_64/alt_stub.S */ 6901 /* 6902 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6903 * any interesting requests and then jump to the real instruction 6904 * handler. Unlike the Arm handler, we can't do this as a tail call 6905 * because rIBASE is caller save and we need to reload it. 6906 * 6907 * Note that unlike in the Arm implementation, we should never arrive 6908 * here with a zero breakFlag because we always refresh rIBASE on 6909 * return. 6910 */ 6911 .extern MterpCheckBefore 6912 REFRESH_IBASE 6913 movq rSELF, OUT_ARG0 6914 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6915 movq rPC, OUT_ARG2 6916 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6917 jmp .L_op_nop+(30*128) 6918 6919 /* ------------------------------ */ 6920 .balign 128 6921 .L_ALT_op_check_cast: /* 0x1f */ 6922 /* File: x86_64/alt_stub.S */ 6923 /* 6924 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6925 * any interesting requests and then jump to the real instruction 6926 * handler. Unlike the Arm handler, we can't do this as a tail call 6927 * because rIBASE is caller save and we need to reload it. 6928 * 6929 * Note that unlike in the Arm implementation, we should never arrive 6930 * here with a zero breakFlag because we always refresh rIBASE on 6931 * return. 6932 */ 6933 .extern MterpCheckBefore 6934 REFRESH_IBASE 6935 movq rSELF, OUT_ARG0 6936 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6937 movq rPC, OUT_ARG2 6938 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6939 jmp .L_op_nop+(31*128) 6940 6941 /* ------------------------------ */ 6942 .balign 128 6943 .L_ALT_op_instance_of: /* 0x20 */ 6944 /* File: x86_64/alt_stub.S */ 6945 /* 6946 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6947 * any interesting requests and then jump to the real instruction 6948 * handler. Unlike the Arm handler, we can't do this as a tail call 6949 * because rIBASE is caller save and we need to reload it. 6950 * 6951 * Note that unlike in the Arm implementation, we should never arrive 6952 * here with a zero breakFlag because we always refresh rIBASE on 6953 * return. 6954 */ 6955 .extern MterpCheckBefore 6956 REFRESH_IBASE 6957 movq rSELF, OUT_ARG0 6958 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6959 movq rPC, OUT_ARG2 6960 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6961 jmp .L_op_nop+(32*128) 6962 6963 /* ------------------------------ */ 6964 .balign 128 6965 .L_ALT_op_array_length: /* 0x21 */ 6966 /* File: x86_64/alt_stub.S */ 6967 /* 6968 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6969 * any interesting requests and then jump to the real instruction 6970 * handler. Unlike the Arm handler, we can't do this as a tail call 6971 * because rIBASE is caller save and we need to reload it. 6972 * 6973 * Note that unlike in the Arm implementation, we should never arrive 6974 * here with a zero breakFlag because we always refresh rIBASE on 6975 * return. 6976 */ 6977 .extern MterpCheckBefore 6978 REFRESH_IBASE 6979 movq rSELF, OUT_ARG0 6980 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 6981 movq rPC, OUT_ARG2 6982 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6983 jmp .L_op_nop+(33*128) 6984 6985 /* ------------------------------ */ 6986 .balign 128 6987 .L_ALT_op_new_instance: /* 0x22 */ 6988 /* File: x86_64/alt_stub.S */ 6989 /* 6990 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6991 * any interesting requests and then jump to the real instruction 6992 * handler. Unlike the Arm handler, we can't do this as a tail call 6993 * because rIBASE is caller save and we need to reload it. 6994 * 6995 * Note that unlike in the Arm implementation, we should never arrive 6996 * here with a zero breakFlag because we always refresh rIBASE on 6997 * return. 6998 */ 6999 .extern MterpCheckBefore 7000 REFRESH_IBASE 7001 movq rSELF, OUT_ARG0 7002 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7003 movq rPC, OUT_ARG2 7004 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7005 jmp .L_op_nop+(34*128) 7006 7007 /* ------------------------------ */ 7008 .balign 128 7009 .L_ALT_op_new_array: /* 0x23 */ 7010 /* File: x86_64/alt_stub.S */ 7011 /* 7012 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7013 * any interesting requests and then jump to the real instruction 7014 * handler. Unlike the Arm handler, we can't do this as a tail call 7015 * because rIBASE is caller save and we need to reload it. 7016 * 7017 * Note that unlike in the Arm implementation, we should never arrive 7018 * here with a zero breakFlag because we always refresh rIBASE on 7019 * return. 7020 */ 7021 .extern MterpCheckBefore 7022 REFRESH_IBASE 7023 movq rSELF, OUT_ARG0 7024 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7025 movq rPC, OUT_ARG2 7026 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7027 jmp .L_op_nop+(35*128) 7028 7029 /* ------------------------------ */ 7030 .balign 128 7031 .L_ALT_op_filled_new_array: /* 0x24 */ 7032 /* File: x86_64/alt_stub.S */ 7033 /* 7034 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7035 * any interesting requests and then jump to the real instruction 7036 * handler. Unlike the Arm handler, we can't do this as a tail call 7037 * because rIBASE is caller save and we need to reload it. 7038 * 7039 * Note that unlike in the Arm implementation, we should never arrive 7040 * here with a zero breakFlag because we always refresh rIBASE on 7041 * return. 7042 */ 7043 .extern MterpCheckBefore 7044 REFRESH_IBASE 7045 movq rSELF, OUT_ARG0 7046 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7047 movq rPC, OUT_ARG2 7048 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7049 jmp .L_op_nop+(36*128) 7050 7051 /* ------------------------------ */ 7052 .balign 128 7053 .L_ALT_op_filled_new_array_range: /* 0x25 */ 7054 /* File: x86_64/alt_stub.S */ 7055 /* 7056 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7057 * any interesting requests and then jump to the real instruction 7058 * handler. Unlike the Arm handler, we can't do this as a tail call 7059 * because rIBASE is caller save and we need to reload it. 7060 * 7061 * Note that unlike in the Arm implementation, we should never arrive 7062 * here with a zero breakFlag because we always refresh rIBASE on 7063 * return. 7064 */ 7065 .extern MterpCheckBefore 7066 REFRESH_IBASE 7067 movq rSELF, OUT_ARG0 7068 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7069 movq rPC, OUT_ARG2 7070 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7071 jmp .L_op_nop+(37*128) 7072 7073 /* ------------------------------ */ 7074 .balign 128 7075 .L_ALT_op_fill_array_data: /* 0x26 */ 7076 /* File: x86_64/alt_stub.S */ 7077 /* 7078 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7079 * any interesting requests and then jump to the real instruction 7080 * handler. Unlike the Arm handler, we can't do this as a tail call 7081 * because rIBASE is caller save and we need to reload it. 7082 * 7083 * Note that unlike in the Arm implementation, we should never arrive 7084 * here with a zero breakFlag because we always refresh rIBASE on 7085 * return. 7086 */ 7087 .extern MterpCheckBefore 7088 REFRESH_IBASE 7089 movq rSELF, OUT_ARG0 7090 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7091 movq rPC, OUT_ARG2 7092 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7093 jmp .L_op_nop+(38*128) 7094 7095 /* ------------------------------ */ 7096 .balign 128 7097 .L_ALT_op_throw: /* 0x27 */ 7098 /* File: x86_64/alt_stub.S */ 7099 /* 7100 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7101 * any interesting requests and then jump to the real instruction 7102 * handler. Unlike the Arm handler, we can't do this as a tail call 7103 * because rIBASE is caller save and we need to reload it. 7104 * 7105 * Note that unlike in the Arm implementation, we should never arrive 7106 * here with a zero breakFlag because we always refresh rIBASE on 7107 * return. 7108 */ 7109 .extern MterpCheckBefore 7110 REFRESH_IBASE 7111 movq rSELF, OUT_ARG0 7112 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7113 movq rPC, OUT_ARG2 7114 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7115 jmp .L_op_nop+(39*128) 7116 7117 /* ------------------------------ */ 7118 .balign 128 7119 .L_ALT_op_goto: /* 0x28 */ 7120 /* File: x86_64/alt_stub.S */ 7121 /* 7122 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7123 * any interesting requests and then jump to the real instruction 7124 * handler. Unlike the Arm handler, we can't do this as a tail call 7125 * because rIBASE is caller save and we need to reload it. 7126 * 7127 * Note that unlike in the Arm implementation, we should never arrive 7128 * here with a zero breakFlag because we always refresh rIBASE on 7129 * return. 7130 */ 7131 .extern MterpCheckBefore 7132 REFRESH_IBASE 7133 movq rSELF, OUT_ARG0 7134 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7135 movq rPC, OUT_ARG2 7136 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7137 jmp .L_op_nop+(40*128) 7138 7139 /* ------------------------------ */ 7140 .balign 128 7141 .L_ALT_op_goto_16: /* 0x29 */ 7142 /* File: x86_64/alt_stub.S */ 7143 /* 7144 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7145 * any interesting requests and then jump to the real instruction 7146 * handler. Unlike the Arm handler, we can't do this as a tail call 7147 * because rIBASE is caller save and we need to reload it. 7148 * 7149 * Note that unlike in the Arm implementation, we should never arrive 7150 * here with a zero breakFlag because we always refresh rIBASE on 7151 * return. 7152 */ 7153 .extern MterpCheckBefore 7154 REFRESH_IBASE 7155 movq rSELF, OUT_ARG0 7156 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7157 movq rPC, OUT_ARG2 7158 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7159 jmp .L_op_nop+(41*128) 7160 7161 /* ------------------------------ */ 7162 .balign 128 7163 .L_ALT_op_goto_32: /* 0x2a */ 7164 /* File: x86_64/alt_stub.S */ 7165 /* 7166 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7167 * any interesting requests and then jump to the real instruction 7168 * handler. Unlike the Arm handler, we can't do this as a tail call 7169 * because rIBASE is caller save and we need to reload it. 7170 * 7171 * Note that unlike in the Arm implementation, we should never arrive 7172 * here with a zero breakFlag because we always refresh rIBASE on 7173 * return. 7174 */ 7175 .extern MterpCheckBefore 7176 REFRESH_IBASE 7177 movq rSELF, OUT_ARG0 7178 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7179 movq rPC, OUT_ARG2 7180 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7181 jmp .L_op_nop+(42*128) 7182 7183 /* ------------------------------ */ 7184 .balign 128 7185 .L_ALT_op_packed_switch: /* 0x2b */ 7186 /* File: x86_64/alt_stub.S */ 7187 /* 7188 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7189 * any interesting requests and then jump to the real instruction 7190 * handler. Unlike the Arm handler, we can't do this as a tail call 7191 * because rIBASE is caller save and we need to reload it. 7192 * 7193 * Note that unlike in the Arm implementation, we should never arrive 7194 * here with a zero breakFlag because we always refresh rIBASE on 7195 * return. 7196 */ 7197 .extern MterpCheckBefore 7198 REFRESH_IBASE 7199 movq rSELF, OUT_ARG0 7200 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7201 movq rPC, OUT_ARG2 7202 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7203 jmp .L_op_nop+(43*128) 7204 7205 /* ------------------------------ */ 7206 .balign 128 7207 .L_ALT_op_sparse_switch: /* 0x2c */ 7208 /* File: x86_64/alt_stub.S */ 7209 /* 7210 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7211 * any interesting requests and then jump to the real instruction 7212 * handler. Unlike the Arm handler, we can't do this as a tail call 7213 * because rIBASE is caller save and we need to reload it. 7214 * 7215 * Note that unlike in the Arm implementation, we should never arrive 7216 * here with a zero breakFlag because we always refresh rIBASE on 7217 * return. 7218 */ 7219 .extern MterpCheckBefore 7220 REFRESH_IBASE 7221 movq rSELF, OUT_ARG0 7222 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7223 movq rPC, OUT_ARG2 7224 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7225 jmp .L_op_nop+(44*128) 7226 7227 /* ------------------------------ */ 7228 .balign 128 7229 .L_ALT_op_cmpl_float: /* 0x2d */ 7230 /* File: x86_64/alt_stub.S */ 7231 /* 7232 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7233 * any interesting requests and then jump to the real instruction 7234 * handler. Unlike the Arm handler, we can't do this as a tail call 7235 * because rIBASE is caller save and we need to reload it. 7236 * 7237 * Note that unlike in the Arm implementation, we should never arrive 7238 * here with a zero breakFlag because we always refresh rIBASE on 7239 * return. 7240 */ 7241 .extern MterpCheckBefore 7242 REFRESH_IBASE 7243 movq rSELF, OUT_ARG0 7244 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7245 movq rPC, OUT_ARG2 7246 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7247 jmp .L_op_nop+(45*128) 7248 7249 /* ------------------------------ */ 7250 .balign 128 7251 .L_ALT_op_cmpg_float: /* 0x2e */ 7252 /* File: x86_64/alt_stub.S */ 7253 /* 7254 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7255 * any interesting requests and then jump to the real instruction 7256 * handler. Unlike the Arm handler, we can't do this as a tail call 7257 * because rIBASE is caller save and we need to reload it. 7258 * 7259 * Note that unlike in the Arm implementation, we should never arrive 7260 * here with a zero breakFlag because we always refresh rIBASE on 7261 * return. 7262 */ 7263 .extern MterpCheckBefore 7264 REFRESH_IBASE 7265 movq rSELF, OUT_ARG0 7266 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7267 movq rPC, OUT_ARG2 7268 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7269 jmp .L_op_nop+(46*128) 7270 7271 /* ------------------------------ */ 7272 .balign 128 7273 .L_ALT_op_cmpl_double: /* 0x2f */ 7274 /* File: x86_64/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. Unlike the Arm handler, we can't do this as a tail call 7279 * because rIBASE is caller save and we need to reload it. 7280 * 7281 * Note that unlike in the Arm implementation, we should never arrive 7282 * here with a zero breakFlag because we always refresh rIBASE on 7283 * return. 7284 */ 7285 .extern MterpCheckBefore 7286 REFRESH_IBASE 7287 movq rSELF, OUT_ARG0 7288 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7289 movq rPC, OUT_ARG2 7290 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7291 jmp .L_op_nop+(47*128) 7292 7293 /* ------------------------------ */ 7294 .balign 128 7295 .L_ALT_op_cmpg_double: /* 0x30 */ 7296 /* File: x86_64/alt_stub.S */ 7297 /* 7298 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7299 * any interesting requests and then jump to the real instruction 7300 * handler. Unlike the Arm handler, we can't do this as a tail call 7301 * because rIBASE is caller save and we need to reload it. 7302 * 7303 * Note that unlike in the Arm implementation, we should never arrive 7304 * here with a zero breakFlag because we always refresh rIBASE on 7305 * return. 7306 */ 7307 .extern MterpCheckBefore 7308 REFRESH_IBASE 7309 movq rSELF, OUT_ARG0 7310 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7311 movq rPC, OUT_ARG2 7312 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7313 jmp .L_op_nop+(48*128) 7314 7315 /* ------------------------------ */ 7316 .balign 128 7317 .L_ALT_op_cmp_long: /* 0x31 */ 7318 /* File: x86_64/alt_stub.S */ 7319 /* 7320 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7321 * any interesting requests and then jump to the real instruction 7322 * handler. Unlike the Arm handler, we can't do this as a tail call 7323 * because rIBASE is caller save and we need to reload it. 7324 * 7325 * Note that unlike in the Arm implementation, we should never arrive 7326 * here with a zero breakFlag because we always refresh rIBASE on 7327 * return. 7328 */ 7329 .extern MterpCheckBefore 7330 REFRESH_IBASE 7331 movq rSELF, OUT_ARG0 7332 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7333 movq rPC, OUT_ARG2 7334 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7335 jmp .L_op_nop+(49*128) 7336 7337 /* ------------------------------ */ 7338 .balign 128 7339 .L_ALT_op_if_eq: /* 0x32 */ 7340 /* File: x86_64/alt_stub.S */ 7341 /* 7342 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7343 * any interesting requests and then jump to the real instruction 7344 * handler. Unlike the Arm handler, we can't do this as a tail call 7345 * because rIBASE is caller save and we need to reload it. 7346 * 7347 * Note that unlike in the Arm implementation, we should never arrive 7348 * here with a zero breakFlag because we always refresh rIBASE on 7349 * return. 7350 */ 7351 .extern MterpCheckBefore 7352 REFRESH_IBASE 7353 movq rSELF, OUT_ARG0 7354 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7355 movq rPC, OUT_ARG2 7356 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7357 jmp .L_op_nop+(50*128) 7358 7359 /* ------------------------------ */ 7360 .balign 128 7361 .L_ALT_op_if_ne: /* 0x33 */ 7362 /* File: x86_64/alt_stub.S */ 7363 /* 7364 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7365 * any interesting requests and then jump to the real instruction 7366 * handler. Unlike the Arm handler, we can't do this as a tail call 7367 * because rIBASE is caller save and we need to reload it. 7368 * 7369 * Note that unlike in the Arm implementation, we should never arrive 7370 * here with a zero breakFlag because we always refresh rIBASE on 7371 * return. 7372 */ 7373 .extern MterpCheckBefore 7374 REFRESH_IBASE 7375 movq rSELF, OUT_ARG0 7376 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7377 movq rPC, OUT_ARG2 7378 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7379 jmp .L_op_nop+(51*128) 7380 7381 /* ------------------------------ */ 7382 .balign 128 7383 .L_ALT_op_if_lt: /* 0x34 */ 7384 /* File: x86_64/alt_stub.S */ 7385 /* 7386 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7387 * any interesting requests and then jump to the real instruction 7388 * handler. Unlike the Arm handler, we can't do this as a tail call 7389 * because rIBASE is caller save and we need to reload it. 7390 * 7391 * Note that unlike in the Arm implementation, we should never arrive 7392 * here with a zero breakFlag because we always refresh rIBASE on 7393 * return. 7394 */ 7395 .extern MterpCheckBefore 7396 REFRESH_IBASE 7397 movq rSELF, OUT_ARG0 7398 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7399 movq rPC, OUT_ARG2 7400 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7401 jmp .L_op_nop+(52*128) 7402 7403 /* ------------------------------ */ 7404 .balign 128 7405 .L_ALT_op_if_ge: /* 0x35 */ 7406 /* File: x86_64/alt_stub.S */ 7407 /* 7408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7409 * any interesting requests and then jump to the real instruction 7410 * handler. Unlike the Arm handler, we can't do this as a tail call 7411 * because rIBASE is caller save and we need to reload it. 7412 * 7413 * Note that unlike in the Arm implementation, we should never arrive 7414 * here with a zero breakFlag because we always refresh rIBASE on 7415 * return. 7416 */ 7417 .extern MterpCheckBefore 7418 REFRESH_IBASE 7419 movq rSELF, OUT_ARG0 7420 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7421 movq rPC, OUT_ARG2 7422 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7423 jmp .L_op_nop+(53*128) 7424 7425 /* ------------------------------ */ 7426 .balign 128 7427 .L_ALT_op_if_gt: /* 0x36 */ 7428 /* File: x86_64/alt_stub.S */ 7429 /* 7430 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7431 * any interesting requests and then jump to the real instruction 7432 * handler. Unlike the Arm handler, we can't do this as a tail call 7433 * because rIBASE is caller save and we need to reload it. 7434 * 7435 * Note that unlike in the Arm implementation, we should never arrive 7436 * here with a zero breakFlag because we always refresh rIBASE on 7437 * return. 7438 */ 7439 .extern MterpCheckBefore 7440 REFRESH_IBASE 7441 movq rSELF, OUT_ARG0 7442 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7443 movq rPC, OUT_ARG2 7444 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7445 jmp .L_op_nop+(54*128) 7446 7447 /* ------------------------------ */ 7448 .balign 128 7449 .L_ALT_op_if_le: /* 0x37 */ 7450 /* File: x86_64/alt_stub.S */ 7451 /* 7452 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7453 * any interesting requests and then jump to the real instruction 7454 * handler. Unlike the Arm handler, we can't do this as a tail call 7455 * because rIBASE is caller save and we need to reload it. 7456 * 7457 * Note that unlike in the Arm implementation, we should never arrive 7458 * here with a zero breakFlag because we always refresh rIBASE on 7459 * return. 7460 */ 7461 .extern MterpCheckBefore 7462 REFRESH_IBASE 7463 movq rSELF, OUT_ARG0 7464 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7465 movq rPC, OUT_ARG2 7466 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7467 jmp .L_op_nop+(55*128) 7468 7469 /* ------------------------------ */ 7470 .balign 128 7471 .L_ALT_op_if_eqz: /* 0x38 */ 7472 /* File: x86_64/alt_stub.S */ 7473 /* 7474 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7475 * any interesting requests and then jump to the real instruction 7476 * handler. Unlike the Arm handler, we can't do this as a tail call 7477 * because rIBASE is caller save and we need to reload it. 7478 * 7479 * Note that unlike in the Arm implementation, we should never arrive 7480 * here with a zero breakFlag because we always refresh rIBASE on 7481 * return. 7482 */ 7483 .extern MterpCheckBefore 7484 REFRESH_IBASE 7485 movq rSELF, OUT_ARG0 7486 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7487 movq rPC, OUT_ARG2 7488 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7489 jmp .L_op_nop+(56*128) 7490 7491 /* ------------------------------ */ 7492 .balign 128 7493 .L_ALT_op_if_nez: /* 0x39 */ 7494 /* File: x86_64/alt_stub.S */ 7495 /* 7496 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7497 * any interesting requests and then jump to the real instruction 7498 * handler. Unlike the Arm handler, we can't do this as a tail call 7499 * because rIBASE is caller save and we need to reload it. 7500 * 7501 * Note that unlike in the Arm implementation, we should never arrive 7502 * here with a zero breakFlag because we always refresh rIBASE on 7503 * return. 7504 */ 7505 .extern MterpCheckBefore 7506 REFRESH_IBASE 7507 movq rSELF, OUT_ARG0 7508 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7509 movq rPC, OUT_ARG2 7510 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7511 jmp .L_op_nop+(57*128) 7512 7513 /* ------------------------------ */ 7514 .balign 128 7515 .L_ALT_op_if_ltz: /* 0x3a */ 7516 /* File: x86_64/alt_stub.S */ 7517 /* 7518 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7519 * any interesting requests and then jump to the real instruction 7520 * handler. Unlike the Arm handler, we can't do this as a tail call 7521 * because rIBASE is caller save and we need to reload it. 7522 * 7523 * Note that unlike in the Arm implementation, we should never arrive 7524 * here with a zero breakFlag because we always refresh rIBASE on 7525 * return. 7526 */ 7527 .extern MterpCheckBefore 7528 REFRESH_IBASE 7529 movq rSELF, OUT_ARG0 7530 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7531 movq rPC, OUT_ARG2 7532 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7533 jmp .L_op_nop+(58*128) 7534 7535 /* ------------------------------ */ 7536 .balign 128 7537 .L_ALT_op_if_gez: /* 0x3b */ 7538 /* File: x86_64/alt_stub.S */ 7539 /* 7540 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7541 * any interesting requests and then jump to the real instruction 7542 * handler. Unlike the Arm handler, we can't do this as a tail call 7543 * because rIBASE is caller save and we need to reload it. 7544 * 7545 * Note that unlike in the Arm implementation, we should never arrive 7546 * here with a zero breakFlag because we always refresh rIBASE on 7547 * return. 7548 */ 7549 .extern MterpCheckBefore 7550 REFRESH_IBASE 7551 movq rSELF, OUT_ARG0 7552 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7553 movq rPC, OUT_ARG2 7554 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7555 jmp .L_op_nop+(59*128) 7556 7557 /* ------------------------------ */ 7558 .balign 128 7559 .L_ALT_op_if_gtz: /* 0x3c */ 7560 /* File: x86_64/alt_stub.S */ 7561 /* 7562 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7563 * any interesting requests and then jump to the real instruction 7564 * handler. Unlike the Arm handler, we can't do this as a tail call 7565 * because rIBASE is caller save and we need to reload it. 7566 * 7567 * Note that unlike in the Arm implementation, we should never arrive 7568 * here with a zero breakFlag because we always refresh rIBASE on 7569 * return. 7570 */ 7571 .extern MterpCheckBefore 7572 REFRESH_IBASE 7573 movq rSELF, OUT_ARG0 7574 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7575 movq rPC, OUT_ARG2 7576 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7577 jmp .L_op_nop+(60*128) 7578 7579 /* ------------------------------ */ 7580 .balign 128 7581 .L_ALT_op_if_lez: /* 0x3d */ 7582 /* File: x86_64/alt_stub.S */ 7583 /* 7584 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7585 * any interesting requests and then jump to the real instruction 7586 * handler. Unlike the Arm handler, we can't do this as a tail call 7587 * because rIBASE is caller save and we need to reload it. 7588 * 7589 * Note that unlike in the Arm implementation, we should never arrive 7590 * here with a zero breakFlag because we always refresh rIBASE on 7591 * return. 7592 */ 7593 .extern MterpCheckBefore 7594 REFRESH_IBASE 7595 movq rSELF, OUT_ARG0 7596 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7597 movq rPC, OUT_ARG2 7598 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7599 jmp .L_op_nop+(61*128) 7600 7601 /* ------------------------------ */ 7602 .balign 128 7603 .L_ALT_op_unused_3e: /* 0x3e */ 7604 /* File: x86_64/alt_stub.S */ 7605 /* 7606 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7607 * any interesting requests and then jump to the real instruction 7608 * handler. Unlike the Arm handler, we can't do this as a tail call 7609 * because rIBASE is caller save and we need to reload it. 7610 * 7611 * Note that unlike in the Arm implementation, we should never arrive 7612 * here with a zero breakFlag because we always refresh rIBASE on 7613 * return. 7614 */ 7615 .extern MterpCheckBefore 7616 REFRESH_IBASE 7617 movq rSELF, OUT_ARG0 7618 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7619 movq rPC, OUT_ARG2 7620 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7621 jmp .L_op_nop+(62*128) 7622 7623 /* ------------------------------ */ 7624 .balign 128 7625 .L_ALT_op_unused_3f: /* 0x3f */ 7626 /* File: x86_64/alt_stub.S */ 7627 /* 7628 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7629 * any interesting requests and then jump to the real instruction 7630 * handler. Unlike the Arm handler, we can't do this as a tail call 7631 * because rIBASE is caller save and we need to reload it. 7632 * 7633 * Note that unlike in the Arm implementation, we should never arrive 7634 * here with a zero breakFlag because we always refresh rIBASE on 7635 * return. 7636 */ 7637 .extern MterpCheckBefore 7638 REFRESH_IBASE 7639 movq rSELF, OUT_ARG0 7640 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7641 movq rPC, OUT_ARG2 7642 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7643 jmp .L_op_nop+(63*128) 7644 7645 /* ------------------------------ */ 7646 .balign 128 7647 .L_ALT_op_unused_40: /* 0x40 */ 7648 /* File: x86_64/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. Unlike the Arm handler, we can't do this as a tail call 7653 * because rIBASE is caller save and we need to reload it. 7654 * 7655 * Note that unlike in the Arm implementation, we should never arrive 7656 * here with a zero breakFlag because we always refresh rIBASE on 7657 * return. 7658 */ 7659 .extern MterpCheckBefore 7660 REFRESH_IBASE 7661 movq rSELF, OUT_ARG0 7662 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7663 movq rPC, OUT_ARG2 7664 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7665 jmp .L_op_nop+(64*128) 7666 7667 /* ------------------------------ */ 7668 .balign 128 7669 .L_ALT_op_unused_41: /* 0x41 */ 7670 /* File: x86_64/alt_stub.S */ 7671 /* 7672 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7673 * any interesting requests and then jump to the real instruction 7674 * handler. Unlike the Arm handler, we can't do this as a tail call 7675 * because rIBASE is caller save and we need to reload it. 7676 * 7677 * Note that unlike in the Arm implementation, we should never arrive 7678 * here with a zero breakFlag because we always refresh rIBASE on 7679 * return. 7680 */ 7681 .extern MterpCheckBefore 7682 REFRESH_IBASE 7683 movq rSELF, OUT_ARG0 7684 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7685 movq rPC, OUT_ARG2 7686 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7687 jmp .L_op_nop+(65*128) 7688 7689 /* ------------------------------ */ 7690 .balign 128 7691 .L_ALT_op_unused_42: /* 0x42 */ 7692 /* File: x86_64/alt_stub.S */ 7693 /* 7694 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7695 * any interesting requests and then jump to the real instruction 7696 * handler. Unlike the Arm handler, we can't do this as a tail call 7697 * because rIBASE is caller save and we need to reload it. 7698 * 7699 * Note that unlike in the Arm implementation, we should never arrive 7700 * here with a zero breakFlag because we always refresh rIBASE on 7701 * return. 7702 */ 7703 .extern MterpCheckBefore 7704 REFRESH_IBASE 7705 movq rSELF, OUT_ARG0 7706 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7707 movq rPC, OUT_ARG2 7708 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7709 jmp .L_op_nop+(66*128) 7710 7711 /* ------------------------------ */ 7712 .balign 128 7713 .L_ALT_op_unused_43: /* 0x43 */ 7714 /* File: x86_64/alt_stub.S */ 7715 /* 7716 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7717 * any interesting requests and then jump to the real instruction 7718 * handler. Unlike the Arm handler, we can't do this as a tail call 7719 * because rIBASE is caller save and we need to reload it. 7720 * 7721 * Note that unlike in the Arm implementation, we should never arrive 7722 * here with a zero breakFlag because we always refresh rIBASE on 7723 * return. 7724 */ 7725 .extern MterpCheckBefore 7726 REFRESH_IBASE 7727 movq rSELF, OUT_ARG0 7728 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7729 movq rPC, OUT_ARG2 7730 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7731 jmp .L_op_nop+(67*128) 7732 7733 /* ------------------------------ */ 7734 .balign 128 7735 .L_ALT_op_aget: /* 0x44 */ 7736 /* File: x86_64/alt_stub.S */ 7737 /* 7738 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7739 * any interesting requests and then jump to the real instruction 7740 * handler. Unlike the Arm handler, we can't do this as a tail call 7741 * because rIBASE is caller save and we need to reload it. 7742 * 7743 * Note that unlike in the Arm implementation, we should never arrive 7744 * here with a zero breakFlag because we always refresh rIBASE on 7745 * return. 7746 */ 7747 .extern MterpCheckBefore 7748 REFRESH_IBASE 7749 movq rSELF, OUT_ARG0 7750 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7751 movq rPC, OUT_ARG2 7752 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7753 jmp .L_op_nop+(68*128) 7754 7755 /* ------------------------------ */ 7756 .balign 128 7757 .L_ALT_op_aget_wide: /* 0x45 */ 7758 /* File: x86_64/alt_stub.S */ 7759 /* 7760 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7761 * any interesting requests and then jump to the real instruction 7762 * handler. Unlike the Arm handler, we can't do this as a tail call 7763 * because rIBASE is caller save and we need to reload it. 7764 * 7765 * Note that unlike in the Arm implementation, we should never arrive 7766 * here with a zero breakFlag because we always refresh rIBASE on 7767 * return. 7768 */ 7769 .extern MterpCheckBefore 7770 REFRESH_IBASE 7771 movq rSELF, OUT_ARG0 7772 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7773 movq rPC, OUT_ARG2 7774 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7775 jmp .L_op_nop+(69*128) 7776 7777 /* ------------------------------ */ 7778 .balign 128 7779 .L_ALT_op_aget_object: /* 0x46 */ 7780 /* File: x86_64/alt_stub.S */ 7781 /* 7782 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7783 * any interesting requests and then jump to the real instruction 7784 * handler. Unlike the Arm handler, we can't do this as a tail call 7785 * because rIBASE is caller save and we need to reload it. 7786 * 7787 * Note that unlike in the Arm implementation, we should never arrive 7788 * here with a zero breakFlag because we always refresh rIBASE on 7789 * return. 7790 */ 7791 .extern MterpCheckBefore 7792 REFRESH_IBASE 7793 movq rSELF, OUT_ARG0 7794 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7795 movq rPC, OUT_ARG2 7796 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7797 jmp .L_op_nop+(70*128) 7798 7799 /* ------------------------------ */ 7800 .balign 128 7801 .L_ALT_op_aget_boolean: /* 0x47 */ 7802 /* File: x86_64/alt_stub.S */ 7803 /* 7804 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7805 * any interesting requests and then jump to the real instruction 7806 * handler. Unlike the Arm handler, we can't do this as a tail call 7807 * because rIBASE is caller save and we need to reload it. 7808 * 7809 * Note that unlike in the Arm implementation, we should never arrive 7810 * here with a zero breakFlag because we always refresh rIBASE on 7811 * return. 7812 */ 7813 .extern MterpCheckBefore 7814 REFRESH_IBASE 7815 movq rSELF, OUT_ARG0 7816 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7817 movq rPC, OUT_ARG2 7818 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7819 jmp .L_op_nop+(71*128) 7820 7821 /* ------------------------------ */ 7822 .balign 128 7823 .L_ALT_op_aget_byte: /* 0x48 */ 7824 /* File: x86_64/alt_stub.S */ 7825 /* 7826 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7827 * any interesting requests and then jump to the real instruction 7828 * handler. Unlike the Arm handler, we can't do this as a tail call 7829 * because rIBASE is caller save and we need to reload it. 7830 * 7831 * Note that unlike in the Arm implementation, we should never arrive 7832 * here with a zero breakFlag because we always refresh rIBASE on 7833 * return. 7834 */ 7835 .extern MterpCheckBefore 7836 REFRESH_IBASE 7837 movq rSELF, OUT_ARG0 7838 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7839 movq rPC, OUT_ARG2 7840 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7841 jmp .L_op_nop+(72*128) 7842 7843 /* ------------------------------ */ 7844 .balign 128 7845 .L_ALT_op_aget_char: /* 0x49 */ 7846 /* File: x86_64/alt_stub.S */ 7847 /* 7848 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7849 * any interesting requests and then jump to the real instruction 7850 * handler. Unlike the Arm handler, we can't do this as a tail call 7851 * because rIBASE is caller save and we need to reload it. 7852 * 7853 * Note that unlike in the Arm implementation, we should never arrive 7854 * here with a zero breakFlag because we always refresh rIBASE on 7855 * return. 7856 */ 7857 .extern MterpCheckBefore 7858 REFRESH_IBASE 7859 movq rSELF, OUT_ARG0 7860 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7861 movq rPC, OUT_ARG2 7862 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7863 jmp .L_op_nop+(73*128) 7864 7865 /* ------------------------------ */ 7866 .balign 128 7867 .L_ALT_op_aget_short: /* 0x4a */ 7868 /* File: x86_64/alt_stub.S */ 7869 /* 7870 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7871 * any interesting requests and then jump to the real instruction 7872 * handler. Unlike the Arm handler, we can't do this as a tail call 7873 * because rIBASE is caller save and we need to reload it. 7874 * 7875 * Note that unlike in the Arm implementation, we should never arrive 7876 * here with a zero breakFlag because we always refresh rIBASE on 7877 * return. 7878 */ 7879 .extern MterpCheckBefore 7880 REFRESH_IBASE 7881 movq rSELF, OUT_ARG0 7882 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7883 movq rPC, OUT_ARG2 7884 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7885 jmp .L_op_nop+(74*128) 7886 7887 /* ------------------------------ */ 7888 .balign 128 7889 .L_ALT_op_aput: /* 0x4b */ 7890 /* File: x86_64/alt_stub.S */ 7891 /* 7892 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7893 * any interesting requests and then jump to the real instruction 7894 * handler. Unlike the Arm handler, we can't do this as a tail call 7895 * because rIBASE is caller save and we need to reload it. 7896 * 7897 * Note that unlike in the Arm implementation, we should never arrive 7898 * here with a zero breakFlag because we always refresh rIBASE on 7899 * return. 7900 */ 7901 .extern MterpCheckBefore 7902 REFRESH_IBASE 7903 movq rSELF, OUT_ARG0 7904 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7905 movq rPC, OUT_ARG2 7906 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7907 jmp .L_op_nop+(75*128) 7908 7909 /* ------------------------------ */ 7910 .balign 128 7911 .L_ALT_op_aput_wide: /* 0x4c */ 7912 /* File: x86_64/alt_stub.S */ 7913 /* 7914 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7915 * any interesting requests and then jump to the real instruction 7916 * handler. Unlike the Arm handler, we can't do this as a tail call 7917 * because rIBASE is caller save and we need to reload it. 7918 * 7919 * Note that unlike in the Arm implementation, we should never arrive 7920 * here with a zero breakFlag because we always refresh rIBASE on 7921 * return. 7922 */ 7923 .extern MterpCheckBefore 7924 REFRESH_IBASE 7925 movq rSELF, OUT_ARG0 7926 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7927 movq rPC, OUT_ARG2 7928 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7929 jmp .L_op_nop+(76*128) 7930 7931 /* ------------------------------ */ 7932 .balign 128 7933 .L_ALT_op_aput_object: /* 0x4d */ 7934 /* File: x86_64/alt_stub.S */ 7935 /* 7936 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7937 * any interesting requests and then jump to the real instruction 7938 * handler. Unlike the Arm handler, we can't do this as a tail call 7939 * because rIBASE is caller save and we need to reload it. 7940 * 7941 * Note that unlike in the Arm implementation, we should never arrive 7942 * here with a zero breakFlag because we always refresh rIBASE on 7943 * return. 7944 */ 7945 .extern MterpCheckBefore 7946 REFRESH_IBASE 7947 movq rSELF, OUT_ARG0 7948 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7949 movq rPC, OUT_ARG2 7950 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7951 jmp .L_op_nop+(77*128) 7952 7953 /* ------------------------------ */ 7954 .balign 128 7955 .L_ALT_op_aput_boolean: /* 0x4e */ 7956 /* File: x86_64/alt_stub.S */ 7957 /* 7958 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7959 * any interesting requests and then jump to the real instruction 7960 * handler. Unlike the Arm handler, we can't do this as a tail call 7961 * because rIBASE is caller save and we need to reload it. 7962 * 7963 * Note that unlike in the Arm implementation, we should never arrive 7964 * here with a zero breakFlag because we always refresh rIBASE on 7965 * return. 7966 */ 7967 .extern MterpCheckBefore 7968 REFRESH_IBASE 7969 movq rSELF, OUT_ARG0 7970 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7971 movq rPC, OUT_ARG2 7972 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7973 jmp .L_op_nop+(78*128) 7974 7975 /* ------------------------------ */ 7976 .balign 128 7977 .L_ALT_op_aput_byte: /* 0x4f */ 7978 /* File: x86_64/alt_stub.S */ 7979 /* 7980 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7981 * any interesting requests and then jump to the real instruction 7982 * handler. Unlike the Arm handler, we can't do this as a tail call 7983 * because rIBASE is caller save and we need to reload it. 7984 * 7985 * Note that unlike in the Arm implementation, we should never arrive 7986 * here with a zero breakFlag because we always refresh rIBASE on 7987 * return. 7988 */ 7989 .extern MterpCheckBefore 7990 REFRESH_IBASE 7991 movq rSELF, OUT_ARG0 7992 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 7993 movq rPC, OUT_ARG2 7994 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7995 jmp .L_op_nop+(79*128) 7996 7997 /* ------------------------------ */ 7998 .balign 128 7999 .L_ALT_op_aput_char: /* 0x50 */ 8000 /* File: x86_64/alt_stub.S */ 8001 /* 8002 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8003 * any interesting requests and then jump to the real instruction 8004 * handler. Unlike the Arm handler, we can't do this as a tail call 8005 * because rIBASE is caller save and we need to reload it. 8006 * 8007 * Note that unlike in the Arm implementation, we should never arrive 8008 * here with a zero breakFlag because we always refresh rIBASE on 8009 * return. 8010 */ 8011 .extern MterpCheckBefore 8012 REFRESH_IBASE 8013 movq rSELF, OUT_ARG0 8014 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8015 movq rPC, OUT_ARG2 8016 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8017 jmp .L_op_nop+(80*128) 8018 8019 /* ------------------------------ */ 8020 .balign 128 8021 .L_ALT_op_aput_short: /* 0x51 */ 8022 /* File: x86_64/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. Unlike the Arm handler, we can't do this as a tail call 8027 * because rIBASE is caller save and we need to reload it. 8028 * 8029 * Note that unlike in the Arm implementation, we should never arrive 8030 * here with a zero breakFlag because we always refresh rIBASE on 8031 * return. 8032 */ 8033 .extern MterpCheckBefore 8034 REFRESH_IBASE 8035 movq rSELF, OUT_ARG0 8036 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8037 movq rPC, OUT_ARG2 8038 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8039 jmp .L_op_nop+(81*128) 8040 8041 /* ------------------------------ */ 8042 .balign 128 8043 .L_ALT_op_iget: /* 0x52 */ 8044 /* File: x86_64/alt_stub.S */ 8045 /* 8046 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8047 * any interesting requests and then jump to the real instruction 8048 * handler. Unlike the Arm handler, we can't do this as a tail call 8049 * because rIBASE is caller save and we need to reload it. 8050 * 8051 * Note that unlike in the Arm implementation, we should never arrive 8052 * here with a zero breakFlag because we always refresh rIBASE on 8053 * return. 8054 */ 8055 .extern MterpCheckBefore 8056 REFRESH_IBASE 8057 movq rSELF, OUT_ARG0 8058 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8059 movq rPC, OUT_ARG2 8060 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8061 jmp .L_op_nop+(82*128) 8062 8063 /* ------------------------------ */ 8064 .balign 128 8065 .L_ALT_op_iget_wide: /* 0x53 */ 8066 /* File: x86_64/alt_stub.S */ 8067 /* 8068 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8069 * any interesting requests and then jump to the real instruction 8070 * handler. Unlike the Arm handler, we can't do this as a tail call 8071 * because rIBASE is caller save and we need to reload it. 8072 * 8073 * Note that unlike in the Arm implementation, we should never arrive 8074 * here with a zero breakFlag because we always refresh rIBASE on 8075 * return. 8076 */ 8077 .extern MterpCheckBefore 8078 REFRESH_IBASE 8079 movq rSELF, OUT_ARG0 8080 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8081 movq rPC, OUT_ARG2 8082 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8083 jmp .L_op_nop+(83*128) 8084 8085 /* ------------------------------ */ 8086 .balign 128 8087 .L_ALT_op_iget_object: /* 0x54 */ 8088 /* File: x86_64/alt_stub.S */ 8089 /* 8090 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8091 * any interesting requests and then jump to the real instruction 8092 * handler. Unlike the Arm handler, we can't do this as a tail call 8093 * because rIBASE is caller save and we need to reload it. 8094 * 8095 * Note that unlike in the Arm implementation, we should never arrive 8096 * here with a zero breakFlag because we always refresh rIBASE on 8097 * return. 8098 */ 8099 .extern MterpCheckBefore 8100 REFRESH_IBASE 8101 movq rSELF, OUT_ARG0 8102 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8103 movq rPC, OUT_ARG2 8104 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8105 jmp .L_op_nop+(84*128) 8106 8107 /* ------------------------------ */ 8108 .balign 128 8109 .L_ALT_op_iget_boolean: /* 0x55 */ 8110 /* File: x86_64/alt_stub.S */ 8111 /* 8112 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8113 * any interesting requests and then jump to the real instruction 8114 * handler. Unlike the Arm handler, we can't do this as a tail call 8115 * because rIBASE is caller save and we need to reload it. 8116 * 8117 * Note that unlike in the Arm implementation, we should never arrive 8118 * here with a zero breakFlag because we always refresh rIBASE on 8119 * return. 8120 */ 8121 .extern MterpCheckBefore 8122 REFRESH_IBASE 8123 movq rSELF, OUT_ARG0 8124 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8125 movq rPC, OUT_ARG2 8126 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8127 jmp .L_op_nop+(85*128) 8128 8129 /* ------------------------------ */ 8130 .balign 128 8131 .L_ALT_op_iget_byte: /* 0x56 */ 8132 /* File: x86_64/alt_stub.S */ 8133 /* 8134 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8135 * any interesting requests and then jump to the real instruction 8136 * handler. Unlike the Arm handler, we can't do this as a tail call 8137 * because rIBASE is caller save and we need to reload it. 8138 * 8139 * Note that unlike in the Arm implementation, we should never arrive 8140 * here with a zero breakFlag because we always refresh rIBASE on 8141 * return. 8142 */ 8143 .extern MterpCheckBefore 8144 REFRESH_IBASE 8145 movq rSELF, OUT_ARG0 8146 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8147 movq rPC, OUT_ARG2 8148 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8149 jmp .L_op_nop+(86*128) 8150 8151 /* ------------------------------ */ 8152 .balign 128 8153 .L_ALT_op_iget_char: /* 0x57 */ 8154 /* File: x86_64/alt_stub.S */ 8155 /* 8156 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8157 * any interesting requests and then jump to the real instruction 8158 * handler. Unlike the Arm handler, we can't do this as a tail call 8159 * because rIBASE is caller save and we need to reload it. 8160 * 8161 * Note that unlike in the Arm implementation, we should never arrive 8162 * here with a zero breakFlag because we always refresh rIBASE on 8163 * return. 8164 */ 8165 .extern MterpCheckBefore 8166 REFRESH_IBASE 8167 movq rSELF, OUT_ARG0 8168 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8169 movq rPC, OUT_ARG2 8170 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8171 jmp .L_op_nop+(87*128) 8172 8173 /* ------------------------------ */ 8174 .balign 128 8175 .L_ALT_op_iget_short: /* 0x58 */ 8176 /* File: x86_64/alt_stub.S */ 8177 /* 8178 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8179 * any interesting requests and then jump to the real instruction 8180 * handler. Unlike the Arm handler, we can't do this as a tail call 8181 * because rIBASE is caller save and we need to reload it. 8182 * 8183 * Note that unlike in the Arm implementation, we should never arrive 8184 * here with a zero breakFlag because we always refresh rIBASE on 8185 * return. 8186 */ 8187 .extern MterpCheckBefore 8188 REFRESH_IBASE 8189 movq rSELF, OUT_ARG0 8190 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8191 movq rPC, OUT_ARG2 8192 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8193 jmp .L_op_nop+(88*128) 8194 8195 /* ------------------------------ */ 8196 .balign 128 8197 .L_ALT_op_iput: /* 0x59 */ 8198 /* File: x86_64/alt_stub.S */ 8199 /* 8200 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8201 * any interesting requests and then jump to the real instruction 8202 * handler. Unlike the Arm handler, we can't do this as a tail call 8203 * because rIBASE is caller save and we need to reload it. 8204 * 8205 * Note that unlike in the Arm implementation, we should never arrive 8206 * here with a zero breakFlag because we always refresh rIBASE on 8207 * return. 8208 */ 8209 .extern MterpCheckBefore 8210 REFRESH_IBASE 8211 movq rSELF, OUT_ARG0 8212 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8213 movq rPC, OUT_ARG2 8214 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8215 jmp .L_op_nop+(89*128) 8216 8217 /* ------------------------------ */ 8218 .balign 128 8219 .L_ALT_op_iput_wide: /* 0x5a */ 8220 /* File: x86_64/alt_stub.S */ 8221 /* 8222 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8223 * any interesting requests and then jump to the real instruction 8224 * handler. Unlike the Arm handler, we can't do this as a tail call 8225 * because rIBASE is caller save and we need to reload it. 8226 * 8227 * Note that unlike in the Arm implementation, we should never arrive 8228 * here with a zero breakFlag because we always refresh rIBASE on 8229 * return. 8230 */ 8231 .extern MterpCheckBefore 8232 REFRESH_IBASE 8233 movq rSELF, OUT_ARG0 8234 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8235 movq rPC, OUT_ARG2 8236 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8237 jmp .L_op_nop+(90*128) 8238 8239 /* ------------------------------ */ 8240 .balign 128 8241 .L_ALT_op_iput_object: /* 0x5b */ 8242 /* File: x86_64/alt_stub.S */ 8243 /* 8244 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8245 * any interesting requests and then jump to the real instruction 8246 * handler. Unlike the Arm handler, we can't do this as a tail call 8247 * because rIBASE is caller save and we need to reload it. 8248 * 8249 * Note that unlike in the Arm implementation, we should never arrive 8250 * here with a zero breakFlag because we always refresh rIBASE on 8251 * return. 8252 */ 8253 .extern MterpCheckBefore 8254 REFRESH_IBASE 8255 movq rSELF, OUT_ARG0 8256 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8257 movq rPC, OUT_ARG2 8258 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8259 jmp .L_op_nop+(91*128) 8260 8261 /* ------------------------------ */ 8262 .balign 128 8263 .L_ALT_op_iput_boolean: /* 0x5c */ 8264 /* File: x86_64/alt_stub.S */ 8265 /* 8266 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8267 * any interesting requests and then jump to the real instruction 8268 * handler. Unlike the Arm handler, we can't do this as a tail call 8269 * because rIBASE is caller save and we need to reload it. 8270 * 8271 * Note that unlike in the Arm implementation, we should never arrive 8272 * here with a zero breakFlag because we always refresh rIBASE on 8273 * return. 8274 */ 8275 .extern MterpCheckBefore 8276 REFRESH_IBASE 8277 movq rSELF, OUT_ARG0 8278 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8279 movq rPC, OUT_ARG2 8280 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8281 jmp .L_op_nop+(92*128) 8282 8283 /* ------------------------------ */ 8284 .balign 128 8285 .L_ALT_op_iput_byte: /* 0x5d */ 8286 /* File: x86_64/alt_stub.S */ 8287 /* 8288 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8289 * any interesting requests and then jump to the real instruction 8290 * handler. Unlike the Arm handler, we can't do this as a tail call 8291 * because rIBASE is caller save and we need to reload it. 8292 * 8293 * Note that unlike in the Arm implementation, we should never arrive 8294 * here with a zero breakFlag because we always refresh rIBASE on 8295 * return. 8296 */ 8297 .extern MterpCheckBefore 8298 REFRESH_IBASE 8299 movq rSELF, OUT_ARG0 8300 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8301 movq rPC, OUT_ARG2 8302 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8303 jmp .L_op_nop+(93*128) 8304 8305 /* ------------------------------ */ 8306 .balign 128 8307 .L_ALT_op_iput_char: /* 0x5e */ 8308 /* File: x86_64/alt_stub.S */ 8309 /* 8310 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8311 * any interesting requests and then jump to the real instruction 8312 * handler. Unlike the Arm handler, we can't do this as a tail call 8313 * because rIBASE is caller save and we need to reload it. 8314 * 8315 * Note that unlike in the Arm implementation, we should never arrive 8316 * here with a zero breakFlag because we always refresh rIBASE on 8317 * return. 8318 */ 8319 .extern MterpCheckBefore 8320 REFRESH_IBASE 8321 movq rSELF, OUT_ARG0 8322 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8323 movq rPC, OUT_ARG2 8324 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8325 jmp .L_op_nop+(94*128) 8326 8327 /* ------------------------------ */ 8328 .balign 128 8329 .L_ALT_op_iput_short: /* 0x5f */ 8330 /* File: x86_64/alt_stub.S */ 8331 /* 8332 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8333 * any interesting requests and then jump to the real instruction 8334 * handler. Unlike the Arm handler, we can't do this as a tail call 8335 * because rIBASE is caller save and we need to reload it. 8336 * 8337 * Note that unlike in the Arm implementation, we should never arrive 8338 * here with a zero breakFlag because we always refresh rIBASE on 8339 * return. 8340 */ 8341 .extern MterpCheckBefore 8342 REFRESH_IBASE 8343 movq rSELF, OUT_ARG0 8344 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8345 movq rPC, OUT_ARG2 8346 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8347 jmp .L_op_nop+(95*128) 8348 8349 /* ------------------------------ */ 8350 .balign 128 8351 .L_ALT_op_sget: /* 0x60 */ 8352 /* File: x86_64/alt_stub.S */ 8353 /* 8354 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8355 * any interesting requests and then jump to the real instruction 8356 * handler. Unlike the Arm handler, we can't do this as a tail call 8357 * because rIBASE is caller save and we need to reload it. 8358 * 8359 * Note that unlike in the Arm implementation, we should never arrive 8360 * here with a zero breakFlag because we always refresh rIBASE on 8361 * return. 8362 */ 8363 .extern MterpCheckBefore 8364 REFRESH_IBASE 8365 movq rSELF, OUT_ARG0 8366 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8367 movq rPC, OUT_ARG2 8368 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8369 jmp .L_op_nop+(96*128) 8370 8371 /* ------------------------------ */ 8372 .balign 128 8373 .L_ALT_op_sget_wide: /* 0x61 */ 8374 /* File: x86_64/alt_stub.S */ 8375 /* 8376 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8377 * any interesting requests and then jump to the real instruction 8378 * handler. Unlike the Arm handler, we can't do this as a tail call 8379 * because rIBASE is caller save and we need to reload it. 8380 * 8381 * Note that unlike in the Arm implementation, we should never arrive 8382 * here with a zero breakFlag because we always refresh rIBASE on 8383 * return. 8384 */ 8385 .extern MterpCheckBefore 8386 REFRESH_IBASE 8387 movq rSELF, OUT_ARG0 8388 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8389 movq rPC, OUT_ARG2 8390 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8391 jmp .L_op_nop+(97*128) 8392 8393 /* ------------------------------ */ 8394 .balign 128 8395 .L_ALT_op_sget_object: /* 0x62 */ 8396 /* File: x86_64/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. Unlike the Arm handler, we can't do this as a tail call 8401 * because rIBASE is caller save and we need to reload it. 8402 * 8403 * Note that unlike in the Arm implementation, we should never arrive 8404 * here with a zero breakFlag because we always refresh rIBASE on 8405 * return. 8406 */ 8407 .extern MterpCheckBefore 8408 REFRESH_IBASE 8409 movq rSELF, OUT_ARG0 8410 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8411 movq rPC, OUT_ARG2 8412 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8413 jmp .L_op_nop+(98*128) 8414 8415 /* ------------------------------ */ 8416 .balign 128 8417 .L_ALT_op_sget_boolean: /* 0x63 */ 8418 /* File: x86_64/alt_stub.S */ 8419 /* 8420 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8421 * any interesting requests and then jump to the real instruction 8422 * handler. Unlike the Arm handler, we can't do this as a tail call 8423 * because rIBASE is caller save and we need to reload it. 8424 * 8425 * Note that unlike in the Arm implementation, we should never arrive 8426 * here with a zero breakFlag because we always refresh rIBASE on 8427 * return. 8428 */ 8429 .extern MterpCheckBefore 8430 REFRESH_IBASE 8431 movq rSELF, OUT_ARG0 8432 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8433 movq rPC, OUT_ARG2 8434 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8435 jmp .L_op_nop+(99*128) 8436 8437 /* ------------------------------ */ 8438 .balign 128 8439 .L_ALT_op_sget_byte: /* 0x64 */ 8440 /* File: x86_64/alt_stub.S */ 8441 /* 8442 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8443 * any interesting requests and then jump to the real instruction 8444 * handler. Unlike the Arm handler, we can't do this as a tail call 8445 * because rIBASE is caller save and we need to reload it. 8446 * 8447 * Note that unlike in the Arm implementation, we should never arrive 8448 * here with a zero breakFlag because we always refresh rIBASE on 8449 * return. 8450 */ 8451 .extern MterpCheckBefore 8452 REFRESH_IBASE 8453 movq rSELF, OUT_ARG0 8454 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8455 movq rPC, OUT_ARG2 8456 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8457 jmp .L_op_nop+(100*128) 8458 8459 /* ------------------------------ */ 8460 .balign 128 8461 .L_ALT_op_sget_char: /* 0x65 */ 8462 /* File: x86_64/alt_stub.S */ 8463 /* 8464 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8465 * any interesting requests and then jump to the real instruction 8466 * handler. Unlike the Arm handler, we can't do this as a tail call 8467 * because rIBASE is caller save and we need to reload it. 8468 * 8469 * Note that unlike in the Arm implementation, we should never arrive 8470 * here with a zero breakFlag because we always refresh rIBASE on 8471 * return. 8472 */ 8473 .extern MterpCheckBefore 8474 REFRESH_IBASE 8475 movq rSELF, OUT_ARG0 8476 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8477 movq rPC, OUT_ARG2 8478 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8479 jmp .L_op_nop+(101*128) 8480 8481 /* ------------------------------ */ 8482 .balign 128 8483 .L_ALT_op_sget_short: /* 0x66 */ 8484 /* File: x86_64/alt_stub.S */ 8485 /* 8486 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8487 * any interesting requests and then jump to the real instruction 8488 * handler. Unlike the Arm handler, we can't do this as a tail call 8489 * because rIBASE is caller save and we need to reload it. 8490 * 8491 * Note that unlike in the Arm implementation, we should never arrive 8492 * here with a zero breakFlag because we always refresh rIBASE on 8493 * return. 8494 */ 8495 .extern MterpCheckBefore 8496 REFRESH_IBASE 8497 movq rSELF, OUT_ARG0 8498 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8499 movq rPC, OUT_ARG2 8500 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8501 jmp .L_op_nop+(102*128) 8502 8503 /* ------------------------------ */ 8504 .balign 128 8505 .L_ALT_op_sput: /* 0x67 */ 8506 /* File: x86_64/alt_stub.S */ 8507 /* 8508 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8509 * any interesting requests and then jump to the real instruction 8510 * handler. Unlike the Arm handler, we can't do this as a tail call 8511 * because rIBASE is caller save and we need to reload it. 8512 * 8513 * Note that unlike in the Arm implementation, we should never arrive 8514 * here with a zero breakFlag because we always refresh rIBASE on 8515 * return. 8516 */ 8517 .extern MterpCheckBefore 8518 REFRESH_IBASE 8519 movq rSELF, OUT_ARG0 8520 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8521 movq rPC, OUT_ARG2 8522 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8523 jmp .L_op_nop+(103*128) 8524 8525 /* ------------------------------ */ 8526 .balign 128 8527 .L_ALT_op_sput_wide: /* 0x68 */ 8528 /* File: x86_64/alt_stub.S */ 8529 /* 8530 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8531 * any interesting requests and then jump to the real instruction 8532 * handler. Unlike the Arm handler, we can't do this as a tail call 8533 * because rIBASE is caller save and we need to reload it. 8534 * 8535 * Note that unlike in the Arm implementation, we should never arrive 8536 * here with a zero breakFlag because we always refresh rIBASE on 8537 * return. 8538 */ 8539 .extern MterpCheckBefore 8540 REFRESH_IBASE 8541 movq rSELF, OUT_ARG0 8542 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8543 movq rPC, OUT_ARG2 8544 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8545 jmp .L_op_nop+(104*128) 8546 8547 /* ------------------------------ */ 8548 .balign 128 8549 .L_ALT_op_sput_object: /* 0x69 */ 8550 /* File: x86_64/alt_stub.S */ 8551 /* 8552 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8553 * any interesting requests and then jump to the real instruction 8554 * handler. Unlike the Arm handler, we can't do this as a tail call 8555 * because rIBASE is caller save and we need to reload it. 8556 * 8557 * Note that unlike in the Arm implementation, we should never arrive 8558 * here with a zero breakFlag because we always refresh rIBASE on 8559 * return. 8560 */ 8561 .extern MterpCheckBefore 8562 REFRESH_IBASE 8563 movq rSELF, OUT_ARG0 8564 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8565 movq rPC, OUT_ARG2 8566 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8567 jmp .L_op_nop+(105*128) 8568 8569 /* ------------------------------ */ 8570 .balign 128 8571 .L_ALT_op_sput_boolean: /* 0x6a */ 8572 /* File: x86_64/alt_stub.S */ 8573 /* 8574 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8575 * any interesting requests and then jump to the real instruction 8576 * handler. Unlike the Arm handler, we can't do this as a tail call 8577 * because rIBASE is caller save and we need to reload it. 8578 * 8579 * Note that unlike in the Arm implementation, we should never arrive 8580 * here with a zero breakFlag because we always refresh rIBASE on 8581 * return. 8582 */ 8583 .extern MterpCheckBefore 8584 REFRESH_IBASE 8585 movq rSELF, OUT_ARG0 8586 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8587 movq rPC, OUT_ARG2 8588 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8589 jmp .L_op_nop+(106*128) 8590 8591 /* ------------------------------ */ 8592 .balign 128 8593 .L_ALT_op_sput_byte: /* 0x6b */ 8594 /* File: x86_64/alt_stub.S */ 8595 /* 8596 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8597 * any interesting requests and then jump to the real instruction 8598 * handler. Unlike the Arm handler, we can't do this as a tail call 8599 * because rIBASE is caller save and we need to reload it. 8600 * 8601 * Note that unlike in the Arm implementation, we should never arrive 8602 * here with a zero breakFlag because we always refresh rIBASE on 8603 * return. 8604 */ 8605 .extern MterpCheckBefore 8606 REFRESH_IBASE 8607 movq rSELF, OUT_ARG0 8608 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8609 movq rPC, OUT_ARG2 8610 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8611 jmp .L_op_nop+(107*128) 8612 8613 /* ------------------------------ */ 8614 .balign 128 8615 .L_ALT_op_sput_char: /* 0x6c */ 8616 /* File: x86_64/alt_stub.S */ 8617 /* 8618 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8619 * any interesting requests and then jump to the real instruction 8620 * handler. Unlike the Arm handler, we can't do this as a tail call 8621 * because rIBASE is caller save and we need to reload it. 8622 * 8623 * Note that unlike in the Arm implementation, we should never arrive 8624 * here with a zero breakFlag because we always refresh rIBASE on 8625 * return. 8626 */ 8627 .extern MterpCheckBefore 8628 REFRESH_IBASE 8629 movq rSELF, OUT_ARG0 8630 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8631 movq rPC, OUT_ARG2 8632 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8633 jmp .L_op_nop+(108*128) 8634 8635 /* ------------------------------ */ 8636 .balign 128 8637 .L_ALT_op_sput_short: /* 0x6d */ 8638 /* File: x86_64/alt_stub.S */ 8639 /* 8640 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8641 * any interesting requests and then jump to the real instruction 8642 * handler. Unlike the Arm handler, we can't do this as a tail call 8643 * because rIBASE is caller save and we need to reload it. 8644 * 8645 * Note that unlike in the Arm implementation, we should never arrive 8646 * here with a zero breakFlag because we always refresh rIBASE on 8647 * return. 8648 */ 8649 .extern MterpCheckBefore 8650 REFRESH_IBASE 8651 movq rSELF, OUT_ARG0 8652 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8653 movq rPC, OUT_ARG2 8654 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8655 jmp .L_op_nop+(109*128) 8656 8657 /* ------------------------------ */ 8658 .balign 128 8659 .L_ALT_op_invoke_virtual: /* 0x6e */ 8660 /* File: x86_64/alt_stub.S */ 8661 /* 8662 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8663 * any interesting requests and then jump to the real instruction 8664 * handler. Unlike the Arm handler, we can't do this as a tail call 8665 * because rIBASE is caller save and we need to reload it. 8666 * 8667 * Note that unlike in the Arm implementation, we should never arrive 8668 * here with a zero breakFlag because we always refresh rIBASE on 8669 * return. 8670 */ 8671 .extern MterpCheckBefore 8672 REFRESH_IBASE 8673 movq rSELF, OUT_ARG0 8674 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8675 movq rPC, OUT_ARG2 8676 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8677 jmp .L_op_nop+(110*128) 8678 8679 /* ------------------------------ */ 8680 .balign 128 8681 .L_ALT_op_invoke_super: /* 0x6f */ 8682 /* File: x86_64/alt_stub.S */ 8683 /* 8684 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8685 * any interesting requests and then jump to the real instruction 8686 * handler. Unlike the Arm handler, we can't do this as a tail call 8687 * because rIBASE is caller save and we need to reload it. 8688 * 8689 * Note that unlike in the Arm implementation, we should never arrive 8690 * here with a zero breakFlag because we always refresh rIBASE on 8691 * return. 8692 */ 8693 .extern MterpCheckBefore 8694 REFRESH_IBASE 8695 movq rSELF, OUT_ARG0 8696 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8697 movq rPC, OUT_ARG2 8698 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8699 jmp .L_op_nop+(111*128) 8700 8701 /* ------------------------------ */ 8702 .balign 128 8703 .L_ALT_op_invoke_direct: /* 0x70 */ 8704 /* File: x86_64/alt_stub.S */ 8705 /* 8706 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8707 * any interesting requests and then jump to the real instruction 8708 * handler. Unlike the Arm handler, we can't do this as a tail call 8709 * because rIBASE is caller save and we need to reload it. 8710 * 8711 * Note that unlike in the Arm implementation, we should never arrive 8712 * here with a zero breakFlag because we always refresh rIBASE on 8713 * return. 8714 */ 8715 .extern MterpCheckBefore 8716 REFRESH_IBASE 8717 movq rSELF, OUT_ARG0 8718 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8719 movq rPC, OUT_ARG2 8720 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8721 jmp .L_op_nop+(112*128) 8722 8723 /* ------------------------------ */ 8724 .balign 128 8725 .L_ALT_op_invoke_static: /* 0x71 */ 8726 /* File: x86_64/alt_stub.S */ 8727 /* 8728 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8729 * any interesting requests and then jump to the real instruction 8730 * handler. Unlike the Arm handler, we can't do this as a tail call 8731 * because rIBASE is caller save and we need to reload it. 8732 * 8733 * Note that unlike in the Arm implementation, we should never arrive 8734 * here with a zero breakFlag because we always refresh rIBASE on 8735 * return. 8736 */ 8737 .extern MterpCheckBefore 8738 REFRESH_IBASE 8739 movq rSELF, OUT_ARG0 8740 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8741 movq rPC, OUT_ARG2 8742 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8743 jmp .L_op_nop+(113*128) 8744 8745 /* ------------------------------ */ 8746 .balign 128 8747 .L_ALT_op_invoke_interface: /* 0x72 */ 8748 /* File: x86_64/alt_stub.S */ 8749 /* 8750 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8751 * any interesting requests and then jump to the real instruction 8752 * handler. Unlike the Arm handler, we can't do this as a tail call 8753 * because rIBASE is caller save and we need to reload it. 8754 * 8755 * Note that unlike in the Arm implementation, we should never arrive 8756 * here with a zero breakFlag because we always refresh rIBASE on 8757 * return. 8758 */ 8759 .extern MterpCheckBefore 8760 REFRESH_IBASE 8761 movq rSELF, OUT_ARG0 8762 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8763 movq rPC, OUT_ARG2 8764 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8765 jmp .L_op_nop+(114*128) 8766 8767 /* ------------------------------ */ 8768 .balign 128 8769 .L_ALT_op_return_void_no_barrier: /* 0x73 */ 8770 /* File: x86_64/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. Unlike the Arm handler, we can't do this as a tail call 8775 * because rIBASE is caller save and we need to reload it. 8776 * 8777 * Note that unlike in the Arm implementation, we should never arrive 8778 * here with a zero breakFlag because we always refresh rIBASE on 8779 * return. 8780 */ 8781 .extern MterpCheckBefore 8782 REFRESH_IBASE 8783 movq rSELF, OUT_ARG0 8784 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8785 movq rPC, OUT_ARG2 8786 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8787 jmp .L_op_nop+(115*128) 8788 8789 /* ------------------------------ */ 8790 .balign 128 8791 .L_ALT_op_invoke_virtual_range: /* 0x74 */ 8792 /* File: x86_64/alt_stub.S */ 8793 /* 8794 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8795 * any interesting requests and then jump to the real instruction 8796 * handler. Unlike the Arm handler, we can't do this as a tail call 8797 * because rIBASE is caller save and we need to reload it. 8798 * 8799 * Note that unlike in the Arm implementation, we should never arrive 8800 * here with a zero breakFlag because we always refresh rIBASE on 8801 * return. 8802 */ 8803 .extern MterpCheckBefore 8804 REFRESH_IBASE 8805 movq rSELF, OUT_ARG0 8806 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8807 movq rPC, OUT_ARG2 8808 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8809 jmp .L_op_nop+(116*128) 8810 8811 /* ------------------------------ */ 8812 .balign 128 8813 .L_ALT_op_invoke_super_range: /* 0x75 */ 8814 /* File: x86_64/alt_stub.S */ 8815 /* 8816 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8817 * any interesting requests and then jump to the real instruction 8818 * handler. Unlike the Arm handler, we can't do this as a tail call 8819 * because rIBASE is caller save and we need to reload it. 8820 * 8821 * Note that unlike in the Arm implementation, we should never arrive 8822 * here with a zero breakFlag because we always refresh rIBASE on 8823 * return. 8824 */ 8825 .extern MterpCheckBefore 8826 REFRESH_IBASE 8827 movq rSELF, OUT_ARG0 8828 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8829 movq rPC, OUT_ARG2 8830 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8831 jmp .L_op_nop+(117*128) 8832 8833 /* ------------------------------ */ 8834 .balign 128 8835 .L_ALT_op_invoke_direct_range: /* 0x76 */ 8836 /* File: x86_64/alt_stub.S */ 8837 /* 8838 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8839 * any interesting requests and then jump to the real instruction 8840 * handler. Unlike the Arm handler, we can't do this as a tail call 8841 * because rIBASE is caller save and we need to reload it. 8842 * 8843 * Note that unlike in the Arm implementation, we should never arrive 8844 * here with a zero breakFlag because we always refresh rIBASE on 8845 * return. 8846 */ 8847 .extern MterpCheckBefore 8848 REFRESH_IBASE 8849 movq rSELF, OUT_ARG0 8850 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8851 movq rPC, OUT_ARG2 8852 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8853 jmp .L_op_nop+(118*128) 8854 8855 /* ------------------------------ */ 8856 .balign 128 8857 .L_ALT_op_invoke_static_range: /* 0x77 */ 8858 /* File: x86_64/alt_stub.S */ 8859 /* 8860 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8861 * any interesting requests and then jump to the real instruction 8862 * handler. Unlike the Arm handler, we can't do this as a tail call 8863 * because rIBASE is caller save and we need to reload it. 8864 * 8865 * Note that unlike in the Arm implementation, we should never arrive 8866 * here with a zero breakFlag because we always refresh rIBASE on 8867 * return. 8868 */ 8869 .extern MterpCheckBefore 8870 REFRESH_IBASE 8871 movq rSELF, OUT_ARG0 8872 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8873 movq rPC, OUT_ARG2 8874 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8875 jmp .L_op_nop+(119*128) 8876 8877 /* ------------------------------ */ 8878 .balign 128 8879 .L_ALT_op_invoke_interface_range: /* 0x78 */ 8880 /* File: x86_64/alt_stub.S */ 8881 /* 8882 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8883 * any interesting requests and then jump to the real instruction 8884 * handler. Unlike the Arm handler, we can't do this as a tail call 8885 * because rIBASE is caller save and we need to reload it. 8886 * 8887 * Note that unlike in the Arm implementation, we should never arrive 8888 * here with a zero breakFlag because we always refresh rIBASE on 8889 * return. 8890 */ 8891 .extern MterpCheckBefore 8892 REFRESH_IBASE 8893 movq rSELF, OUT_ARG0 8894 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8895 movq rPC, OUT_ARG2 8896 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8897 jmp .L_op_nop+(120*128) 8898 8899 /* ------------------------------ */ 8900 .balign 128 8901 .L_ALT_op_unused_79: /* 0x79 */ 8902 /* File: x86_64/alt_stub.S */ 8903 /* 8904 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8905 * any interesting requests and then jump to the real instruction 8906 * handler. Unlike the Arm handler, we can't do this as a tail call 8907 * because rIBASE is caller save and we need to reload it. 8908 * 8909 * Note that unlike in the Arm implementation, we should never arrive 8910 * here with a zero breakFlag because we always refresh rIBASE on 8911 * return. 8912 */ 8913 .extern MterpCheckBefore 8914 REFRESH_IBASE 8915 movq rSELF, OUT_ARG0 8916 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8917 movq rPC, OUT_ARG2 8918 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8919 jmp .L_op_nop+(121*128) 8920 8921 /* ------------------------------ */ 8922 .balign 128 8923 .L_ALT_op_unused_7a: /* 0x7a */ 8924 /* File: x86_64/alt_stub.S */ 8925 /* 8926 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8927 * any interesting requests and then jump to the real instruction 8928 * handler. Unlike the Arm handler, we can't do this as a tail call 8929 * because rIBASE is caller save and we need to reload it. 8930 * 8931 * Note that unlike in the Arm implementation, we should never arrive 8932 * here with a zero breakFlag because we always refresh rIBASE on 8933 * return. 8934 */ 8935 .extern MterpCheckBefore 8936 REFRESH_IBASE 8937 movq rSELF, OUT_ARG0 8938 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8939 movq rPC, OUT_ARG2 8940 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8941 jmp .L_op_nop+(122*128) 8942 8943 /* ------------------------------ */ 8944 .balign 128 8945 .L_ALT_op_neg_int: /* 0x7b */ 8946 /* File: x86_64/alt_stub.S */ 8947 /* 8948 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8949 * any interesting requests and then jump to the real instruction 8950 * handler. Unlike the Arm handler, we can't do this as a tail call 8951 * because rIBASE is caller save and we need to reload it. 8952 * 8953 * Note that unlike in the Arm implementation, we should never arrive 8954 * here with a zero breakFlag because we always refresh rIBASE on 8955 * return. 8956 */ 8957 .extern MterpCheckBefore 8958 REFRESH_IBASE 8959 movq rSELF, OUT_ARG0 8960 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8961 movq rPC, OUT_ARG2 8962 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8963 jmp .L_op_nop+(123*128) 8964 8965 /* ------------------------------ */ 8966 .balign 128 8967 .L_ALT_op_not_int: /* 0x7c */ 8968 /* File: x86_64/alt_stub.S */ 8969 /* 8970 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8971 * any interesting requests and then jump to the real instruction 8972 * handler. Unlike the Arm handler, we can't do this as a tail call 8973 * because rIBASE is caller save and we need to reload it. 8974 * 8975 * Note that unlike in the Arm implementation, we should never arrive 8976 * here with a zero breakFlag because we always refresh rIBASE on 8977 * return. 8978 */ 8979 .extern MterpCheckBefore 8980 REFRESH_IBASE 8981 movq rSELF, OUT_ARG0 8982 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 8983 movq rPC, OUT_ARG2 8984 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8985 jmp .L_op_nop+(124*128) 8986 8987 /* ------------------------------ */ 8988 .balign 128 8989 .L_ALT_op_neg_long: /* 0x7d */ 8990 /* File: x86_64/alt_stub.S */ 8991 /* 8992 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8993 * any interesting requests and then jump to the real instruction 8994 * handler. Unlike the Arm handler, we can't do this as a tail call 8995 * because rIBASE is caller save and we need to reload it. 8996 * 8997 * Note that unlike in the Arm implementation, we should never arrive 8998 * here with a zero breakFlag because we always refresh rIBASE on 8999 * return. 9000 */ 9001 .extern MterpCheckBefore 9002 REFRESH_IBASE 9003 movq rSELF, OUT_ARG0 9004 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9005 movq rPC, OUT_ARG2 9006 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9007 jmp .L_op_nop+(125*128) 9008 9009 /* ------------------------------ */ 9010 .balign 128 9011 .L_ALT_op_not_long: /* 0x7e */ 9012 /* File: x86_64/alt_stub.S */ 9013 /* 9014 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9015 * any interesting requests and then jump to the real instruction 9016 * handler. Unlike the Arm handler, we can't do this as a tail call 9017 * because rIBASE is caller save and we need to reload it. 9018 * 9019 * Note that unlike in the Arm implementation, we should never arrive 9020 * here with a zero breakFlag because we always refresh rIBASE on 9021 * return. 9022 */ 9023 .extern MterpCheckBefore 9024 REFRESH_IBASE 9025 movq rSELF, OUT_ARG0 9026 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9027 movq rPC, OUT_ARG2 9028 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9029 jmp .L_op_nop+(126*128) 9030 9031 /* ------------------------------ */ 9032 .balign 128 9033 .L_ALT_op_neg_float: /* 0x7f */ 9034 /* File: x86_64/alt_stub.S */ 9035 /* 9036 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9037 * any interesting requests and then jump to the real instruction 9038 * handler. Unlike the Arm handler, we can't do this as a tail call 9039 * because rIBASE is caller save and we need to reload it. 9040 * 9041 * Note that unlike in the Arm implementation, we should never arrive 9042 * here with a zero breakFlag because we always refresh rIBASE on 9043 * return. 9044 */ 9045 .extern MterpCheckBefore 9046 REFRESH_IBASE 9047 movq rSELF, OUT_ARG0 9048 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9049 movq rPC, OUT_ARG2 9050 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9051 jmp .L_op_nop+(127*128) 9052 9053 /* ------------------------------ */ 9054 .balign 128 9055 .L_ALT_op_neg_double: /* 0x80 */ 9056 /* File: x86_64/alt_stub.S */ 9057 /* 9058 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9059 * any interesting requests and then jump to the real instruction 9060 * handler. Unlike the Arm handler, we can't do this as a tail call 9061 * because rIBASE is caller save and we need to reload it. 9062 * 9063 * Note that unlike in the Arm implementation, we should never arrive 9064 * here with a zero breakFlag because we always refresh rIBASE on 9065 * return. 9066 */ 9067 .extern MterpCheckBefore 9068 REFRESH_IBASE 9069 movq rSELF, OUT_ARG0 9070 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9071 movq rPC, OUT_ARG2 9072 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9073 jmp .L_op_nop+(128*128) 9074 9075 /* ------------------------------ */ 9076 .balign 128 9077 .L_ALT_op_int_to_long: /* 0x81 */ 9078 /* File: x86_64/alt_stub.S */ 9079 /* 9080 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9081 * any interesting requests and then jump to the real instruction 9082 * handler. Unlike the Arm handler, we can't do this as a tail call 9083 * because rIBASE is caller save and we need to reload it. 9084 * 9085 * Note that unlike in the Arm implementation, we should never arrive 9086 * here with a zero breakFlag because we always refresh rIBASE on 9087 * return. 9088 */ 9089 .extern MterpCheckBefore 9090 REFRESH_IBASE 9091 movq rSELF, OUT_ARG0 9092 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9093 movq rPC, OUT_ARG2 9094 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9095 jmp .L_op_nop+(129*128) 9096 9097 /* ------------------------------ */ 9098 .balign 128 9099 .L_ALT_op_int_to_float: /* 0x82 */ 9100 /* File: x86_64/alt_stub.S */ 9101 /* 9102 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9103 * any interesting requests and then jump to the real instruction 9104 * handler. Unlike the Arm handler, we can't do this as a tail call 9105 * because rIBASE is caller save and we need to reload it. 9106 * 9107 * Note that unlike in the Arm implementation, we should never arrive 9108 * here with a zero breakFlag because we always refresh rIBASE on 9109 * return. 9110 */ 9111 .extern MterpCheckBefore 9112 REFRESH_IBASE 9113 movq rSELF, OUT_ARG0 9114 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9115 movq rPC, OUT_ARG2 9116 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9117 jmp .L_op_nop+(130*128) 9118 9119 /* ------------------------------ */ 9120 .balign 128 9121 .L_ALT_op_int_to_double: /* 0x83 */ 9122 /* File: x86_64/alt_stub.S */ 9123 /* 9124 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9125 * any interesting requests and then jump to the real instruction 9126 * handler. Unlike the Arm handler, we can't do this as a tail call 9127 * because rIBASE is caller save and we need to reload it. 9128 * 9129 * Note that unlike in the Arm implementation, we should never arrive 9130 * here with a zero breakFlag because we always refresh rIBASE on 9131 * return. 9132 */ 9133 .extern MterpCheckBefore 9134 REFRESH_IBASE 9135 movq rSELF, OUT_ARG0 9136 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9137 movq rPC, OUT_ARG2 9138 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9139 jmp .L_op_nop+(131*128) 9140 9141 /* ------------------------------ */ 9142 .balign 128 9143 .L_ALT_op_long_to_int: /* 0x84 */ 9144 /* File: x86_64/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. Unlike the Arm handler, we can't do this as a tail call 9149 * because rIBASE is caller save and we need to reload it. 9150 * 9151 * Note that unlike in the Arm implementation, we should never arrive 9152 * here with a zero breakFlag because we always refresh rIBASE on 9153 * return. 9154 */ 9155 .extern MterpCheckBefore 9156 REFRESH_IBASE 9157 movq rSELF, OUT_ARG0 9158 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9159 movq rPC, OUT_ARG2 9160 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9161 jmp .L_op_nop+(132*128) 9162 9163 /* ------------------------------ */ 9164 .balign 128 9165 .L_ALT_op_long_to_float: /* 0x85 */ 9166 /* File: x86_64/alt_stub.S */ 9167 /* 9168 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9169 * any interesting requests and then jump to the real instruction 9170 * handler. Unlike the Arm handler, we can't do this as a tail call 9171 * because rIBASE is caller save and we need to reload it. 9172 * 9173 * Note that unlike in the Arm implementation, we should never arrive 9174 * here with a zero breakFlag because we always refresh rIBASE on 9175 * return. 9176 */ 9177 .extern MterpCheckBefore 9178 REFRESH_IBASE 9179 movq rSELF, OUT_ARG0 9180 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9181 movq rPC, OUT_ARG2 9182 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9183 jmp .L_op_nop+(133*128) 9184 9185 /* ------------------------------ */ 9186 .balign 128 9187 .L_ALT_op_long_to_double: /* 0x86 */ 9188 /* File: x86_64/alt_stub.S */ 9189 /* 9190 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9191 * any interesting requests and then jump to the real instruction 9192 * handler. Unlike the Arm handler, we can't do this as a tail call 9193 * because rIBASE is caller save and we need to reload it. 9194 * 9195 * Note that unlike in the Arm implementation, we should never arrive 9196 * here with a zero breakFlag because we always refresh rIBASE on 9197 * return. 9198 */ 9199 .extern MterpCheckBefore 9200 REFRESH_IBASE 9201 movq rSELF, OUT_ARG0 9202 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9203 movq rPC, OUT_ARG2 9204 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9205 jmp .L_op_nop+(134*128) 9206 9207 /* ------------------------------ */ 9208 .balign 128 9209 .L_ALT_op_float_to_int: /* 0x87 */ 9210 /* File: x86_64/alt_stub.S */ 9211 /* 9212 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9213 * any interesting requests and then jump to the real instruction 9214 * handler. Unlike the Arm handler, we can't do this as a tail call 9215 * because rIBASE is caller save and we need to reload it. 9216 * 9217 * Note that unlike in the Arm implementation, we should never arrive 9218 * here with a zero breakFlag because we always refresh rIBASE on 9219 * return. 9220 */ 9221 .extern MterpCheckBefore 9222 REFRESH_IBASE 9223 movq rSELF, OUT_ARG0 9224 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9225 movq rPC, OUT_ARG2 9226 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9227 jmp .L_op_nop+(135*128) 9228 9229 /* ------------------------------ */ 9230 .balign 128 9231 .L_ALT_op_float_to_long: /* 0x88 */ 9232 /* File: x86_64/alt_stub.S */ 9233 /* 9234 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9235 * any interesting requests and then jump to the real instruction 9236 * handler. Unlike the Arm handler, we can't do this as a tail call 9237 * because rIBASE is caller save and we need to reload it. 9238 * 9239 * Note that unlike in the Arm implementation, we should never arrive 9240 * here with a zero breakFlag because we always refresh rIBASE on 9241 * return. 9242 */ 9243 .extern MterpCheckBefore 9244 REFRESH_IBASE 9245 movq rSELF, OUT_ARG0 9246 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9247 movq rPC, OUT_ARG2 9248 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9249 jmp .L_op_nop+(136*128) 9250 9251 /* ------------------------------ */ 9252 .balign 128 9253 .L_ALT_op_float_to_double: /* 0x89 */ 9254 /* File: x86_64/alt_stub.S */ 9255 /* 9256 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9257 * any interesting requests and then jump to the real instruction 9258 * handler. Unlike the Arm handler, we can't do this as a tail call 9259 * because rIBASE is caller save and we need to reload it. 9260 * 9261 * Note that unlike in the Arm implementation, we should never arrive 9262 * here with a zero breakFlag because we always refresh rIBASE on 9263 * return. 9264 */ 9265 .extern MterpCheckBefore 9266 REFRESH_IBASE 9267 movq rSELF, OUT_ARG0 9268 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9269 movq rPC, OUT_ARG2 9270 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9271 jmp .L_op_nop+(137*128) 9272 9273 /* ------------------------------ */ 9274 .balign 128 9275 .L_ALT_op_double_to_int: /* 0x8a */ 9276 /* File: x86_64/alt_stub.S */ 9277 /* 9278 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9279 * any interesting requests and then jump to the real instruction 9280 * handler. Unlike the Arm handler, we can't do this as a tail call 9281 * because rIBASE is caller save and we need to reload it. 9282 * 9283 * Note that unlike in the Arm implementation, we should never arrive 9284 * here with a zero breakFlag because we always refresh rIBASE on 9285 * return. 9286 */ 9287 .extern MterpCheckBefore 9288 REFRESH_IBASE 9289 movq rSELF, OUT_ARG0 9290 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9291 movq rPC, OUT_ARG2 9292 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9293 jmp .L_op_nop+(138*128) 9294 9295 /* ------------------------------ */ 9296 .balign 128 9297 .L_ALT_op_double_to_long: /* 0x8b */ 9298 /* File: x86_64/alt_stub.S */ 9299 /* 9300 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9301 * any interesting requests and then jump to the real instruction 9302 * handler. Unlike the Arm handler, we can't do this as a tail call 9303 * because rIBASE is caller save and we need to reload it. 9304 * 9305 * Note that unlike in the Arm implementation, we should never arrive 9306 * here with a zero breakFlag because we always refresh rIBASE on 9307 * return. 9308 */ 9309 .extern MterpCheckBefore 9310 REFRESH_IBASE 9311 movq rSELF, OUT_ARG0 9312 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9313 movq rPC, OUT_ARG2 9314 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9315 jmp .L_op_nop+(139*128) 9316 9317 /* ------------------------------ */ 9318 .balign 128 9319 .L_ALT_op_double_to_float: /* 0x8c */ 9320 /* File: x86_64/alt_stub.S */ 9321 /* 9322 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9323 * any interesting requests and then jump to the real instruction 9324 * handler. Unlike the Arm handler, we can't do this as a tail call 9325 * because rIBASE is caller save and we need to reload it. 9326 * 9327 * Note that unlike in the Arm implementation, we should never arrive 9328 * here with a zero breakFlag because we always refresh rIBASE on 9329 * return. 9330 */ 9331 .extern MterpCheckBefore 9332 REFRESH_IBASE 9333 movq rSELF, OUT_ARG0 9334 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9335 movq rPC, OUT_ARG2 9336 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9337 jmp .L_op_nop+(140*128) 9338 9339 /* ------------------------------ */ 9340 .balign 128 9341 .L_ALT_op_int_to_byte: /* 0x8d */ 9342 /* File: x86_64/alt_stub.S */ 9343 /* 9344 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9345 * any interesting requests and then jump to the real instruction 9346 * handler. Unlike the Arm handler, we can't do this as a tail call 9347 * because rIBASE is caller save and we need to reload it. 9348 * 9349 * Note that unlike in the Arm implementation, we should never arrive 9350 * here with a zero breakFlag because we always refresh rIBASE on 9351 * return. 9352 */ 9353 .extern MterpCheckBefore 9354 REFRESH_IBASE 9355 movq rSELF, OUT_ARG0 9356 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9357 movq rPC, OUT_ARG2 9358 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9359 jmp .L_op_nop+(141*128) 9360 9361 /* ------------------------------ */ 9362 .balign 128 9363 .L_ALT_op_int_to_char: /* 0x8e */ 9364 /* File: x86_64/alt_stub.S */ 9365 /* 9366 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9367 * any interesting requests and then jump to the real instruction 9368 * handler. Unlike the Arm handler, we can't do this as a tail call 9369 * because rIBASE is caller save and we need to reload it. 9370 * 9371 * Note that unlike in the Arm implementation, we should never arrive 9372 * here with a zero breakFlag because we always refresh rIBASE on 9373 * return. 9374 */ 9375 .extern MterpCheckBefore 9376 REFRESH_IBASE 9377 movq rSELF, OUT_ARG0 9378 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9379 movq rPC, OUT_ARG2 9380 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9381 jmp .L_op_nop+(142*128) 9382 9383 /* ------------------------------ */ 9384 .balign 128 9385 .L_ALT_op_int_to_short: /* 0x8f */ 9386 /* File: x86_64/alt_stub.S */ 9387 /* 9388 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9389 * any interesting requests and then jump to the real instruction 9390 * handler. Unlike the Arm handler, we can't do this as a tail call 9391 * because rIBASE is caller save and we need to reload it. 9392 * 9393 * Note that unlike in the Arm implementation, we should never arrive 9394 * here with a zero breakFlag because we always refresh rIBASE on 9395 * return. 9396 */ 9397 .extern MterpCheckBefore 9398 REFRESH_IBASE 9399 movq rSELF, OUT_ARG0 9400 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9401 movq rPC, OUT_ARG2 9402 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9403 jmp .L_op_nop+(143*128) 9404 9405 /* ------------------------------ */ 9406 .balign 128 9407 .L_ALT_op_add_int: /* 0x90 */ 9408 /* File: x86_64/alt_stub.S */ 9409 /* 9410 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9411 * any interesting requests and then jump to the real instruction 9412 * handler. Unlike the Arm handler, we can't do this as a tail call 9413 * because rIBASE is caller save and we need to reload it. 9414 * 9415 * Note that unlike in the Arm implementation, we should never arrive 9416 * here with a zero breakFlag because we always refresh rIBASE on 9417 * return. 9418 */ 9419 .extern MterpCheckBefore 9420 REFRESH_IBASE 9421 movq rSELF, OUT_ARG0 9422 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9423 movq rPC, OUT_ARG2 9424 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9425 jmp .L_op_nop+(144*128) 9426 9427 /* ------------------------------ */ 9428 .balign 128 9429 .L_ALT_op_sub_int: /* 0x91 */ 9430 /* File: x86_64/alt_stub.S */ 9431 /* 9432 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9433 * any interesting requests and then jump to the real instruction 9434 * handler. Unlike the Arm handler, we can't do this as a tail call 9435 * because rIBASE is caller save and we need to reload it. 9436 * 9437 * Note that unlike in the Arm implementation, we should never arrive 9438 * here with a zero breakFlag because we always refresh rIBASE on 9439 * return. 9440 */ 9441 .extern MterpCheckBefore 9442 REFRESH_IBASE 9443 movq rSELF, OUT_ARG0 9444 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9445 movq rPC, OUT_ARG2 9446 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9447 jmp .L_op_nop+(145*128) 9448 9449 /* ------------------------------ */ 9450 .balign 128 9451 .L_ALT_op_mul_int: /* 0x92 */ 9452 /* File: x86_64/alt_stub.S */ 9453 /* 9454 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9455 * any interesting requests and then jump to the real instruction 9456 * handler. Unlike the Arm handler, we can't do this as a tail call 9457 * because rIBASE is caller save and we need to reload it. 9458 * 9459 * Note that unlike in the Arm implementation, we should never arrive 9460 * here with a zero breakFlag because we always refresh rIBASE on 9461 * return. 9462 */ 9463 .extern MterpCheckBefore 9464 REFRESH_IBASE 9465 movq rSELF, OUT_ARG0 9466 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9467 movq rPC, OUT_ARG2 9468 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9469 jmp .L_op_nop+(146*128) 9470 9471 /* ------------------------------ */ 9472 .balign 128 9473 .L_ALT_op_div_int: /* 0x93 */ 9474 /* File: x86_64/alt_stub.S */ 9475 /* 9476 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9477 * any interesting requests and then jump to the real instruction 9478 * handler. Unlike the Arm handler, we can't do this as a tail call 9479 * because rIBASE is caller save and we need to reload it. 9480 * 9481 * Note that unlike in the Arm implementation, we should never arrive 9482 * here with a zero breakFlag because we always refresh rIBASE on 9483 * return. 9484 */ 9485 .extern MterpCheckBefore 9486 REFRESH_IBASE 9487 movq rSELF, OUT_ARG0 9488 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9489 movq rPC, OUT_ARG2 9490 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9491 jmp .L_op_nop+(147*128) 9492 9493 /* ------------------------------ */ 9494 .balign 128 9495 .L_ALT_op_rem_int: /* 0x94 */ 9496 /* File: x86_64/alt_stub.S */ 9497 /* 9498 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9499 * any interesting requests and then jump to the real instruction 9500 * handler. Unlike the Arm handler, we can't do this as a tail call 9501 * because rIBASE is caller save and we need to reload it. 9502 * 9503 * Note that unlike in the Arm implementation, we should never arrive 9504 * here with a zero breakFlag because we always refresh rIBASE on 9505 * return. 9506 */ 9507 .extern MterpCheckBefore 9508 REFRESH_IBASE 9509 movq rSELF, OUT_ARG0 9510 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9511 movq rPC, OUT_ARG2 9512 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9513 jmp .L_op_nop+(148*128) 9514 9515 /* ------------------------------ */ 9516 .balign 128 9517 .L_ALT_op_and_int: /* 0x95 */ 9518 /* File: x86_64/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. Unlike the Arm handler, we can't do this as a tail call 9523 * because rIBASE is caller save and we need to reload it. 9524 * 9525 * Note that unlike in the Arm implementation, we should never arrive 9526 * here with a zero breakFlag because we always refresh rIBASE on 9527 * return. 9528 */ 9529 .extern MterpCheckBefore 9530 REFRESH_IBASE 9531 movq rSELF, OUT_ARG0 9532 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9533 movq rPC, OUT_ARG2 9534 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9535 jmp .L_op_nop+(149*128) 9536 9537 /* ------------------------------ */ 9538 .balign 128 9539 .L_ALT_op_or_int: /* 0x96 */ 9540 /* File: x86_64/alt_stub.S */ 9541 /* 9542 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9543 * any interesting requests and then jump to the real instruction 9544 * handler. Unlike the Arm handler, we can't do this as a tail call 9545 * because rIBASE is caller save and we need to reload it. 9546 * 9547 * Note that unlike in the Arm implementation, we should never arrive 9548 * here with a zero breakFlag because we always refresh rIBASE on 9549 * return. 9550 */ 9551 .extern MterpCheckBefore 9552 REFRESH_IBASE 9553 movq rSELF, OUT_ARG0 9554 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9555 movq rPC, OUT_ARG2 9556 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9557 jmp .L_op_nop+(150*128) 9558 9559 /* ------------------------------ */ 9560 .balign 128 9561 .L_ALT_op_xor_int: /* 0x97 */ 9562 /* File: x86_64/alt_stub.S */ 9563 /* 9564 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9565 * any interesting requests and then jump to the real instruction 9566 * handler. Unlike the Arm handler, we can't do this as a tail call 9567 * because rIBASE is caller save and we need to reload it. 9568 * 9569 * Note that unlike in the Arm implementation, we should never arrive 9570 * here with a zero breakFlag because we always refresh rIBASE on 9571 * return. 9572 */ 9573 .extern MterpCheckBefore 9574 REFRESH_IBASE 9575 movq rSELF, OUT_ARG0 9576 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9577 movq rPC, OUT_ARG2 9578 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9579 jmp .L_op_nop+(151*128) 9580 9581 /* ------------------------------ */ 9582 .balign 128 9583 .L_ALT_op_shl_int: /* 0x98 */ 9584 /* File: x86_64/alt_stub.S */ 9585 /* 9586 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9587 * any interesting requests and then jump to the real instruction 9588 * handler. Unlike the Arm handler, we can't do this as a tail call 9589 * because rIBASE is caller save and we need to reload it. 9590 * 9591 * Note that unlike in the Arm implementation, we should never arrive 9592 * here with a zero breakFlag because we always refresh rIBASE on 9593 * return. 9594 */ 9595 .extern MterpCheckBefore 9596 REFRESH_IBASE 9597 movq rSELF, OUT_ARG0 9598 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9599 movq rPC, OUT_ARG2 9600 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9601 jmp .L_op_nop+(152*128) 9602 9603 /* ------------------------------ */ 9604 .balign 128 9605 .L_ALT_op_shr_int: /* 0x99 */ 9606 /* File: x86_64/alt_stub.S */ 9607 /* 9608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9609 * any interesting requests and then jump to the real instruction 9610 * handler. Unlike the Arm handler, we can't do this as a tail call 9611 * because rIBASE is caller save and we need to reload it. 9612 * 9613 * Note that unlike in the Arm implementation, we should never arrive 9614 * here with a zero breakFlag because we always refresh rIBASE on 9615 * return. 9616 */ 9617 .extern MterpCheckBefore 9618 REFRESH_IBASE 9619 movq rSELF, OUT_ARG0 9620 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9621 movq rPC, OUT_ARG2 9622 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9623 jmp .L_op_nop+(153*128) 9624 9625 /* ------------------------------ */ 9626 .balign 128 9627 .L_ALT_op_ushr_int: /* 0x9a */ 9628 /* File: x86_64/alt_stub.S */ 9629 /* 9630 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9631 * any interesting requests and then jump to the real instruction 9632 * handler. Unlike the Arm handler, we can't do this as a tail call 9633 * because rIBASE is caller save and we need to reload it. 9634 * 9635 * Note that unlike in the Arm implementation, we should never arrive 9636 * here with a zero breakFlag because we always refresh rIBASE on 9637 * return. 9638 */ 9639 .extern MterpCheckBefore 9640 REFRESH_IBASE 9641 movq rSELF, OUT_ARG0 9642 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9643 movq rPC, OUT_ARG2 9644 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9645 jmp .L_op_nop+(154*128) 9646 9647 /* ------------------------------ */ 9648 .balign 128 9649 .L_ALT_op_add_long: /* 0x9b */ 9650 /* File: x86_64/alt_stub.S */ 9651 /* 9652 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9653 * any interesting requests and then jump to the real instruction 9654 * handler. Unlike the Arm handler, we can't do this as a tail call 9655 * because rIBASE is caller save and we need to reload it. 9656 * 9657 * Note that unlike in the Arm implementation, we should never arrive 9658 * here with a zero breakFlag because we always refresh rIBASE on 9659 * return. 9660 */ 9661 .extern MterpCheckBefore 9662 REFRESH_IBASE 9663 movq rSELF, OUT_ARG0 9664 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9665 movq rPC, OUT_ARG2 9666 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9667 jmp .L_op_nop+(155*128) 9668 9669 /* ------------------------------ */ 9670 .balign 128 9671 .L_ALT_op_sub_long: /* 0x9c */ 9672 /* File: x86_64/alt_stub.S */ 9673 /* 9674 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9675 * any interesting requests and then jump to the real instruction 9676 * handler. Unlike the Arm handler, we can't do this as a tail call 9677 * because rIBASE is caller save and we need to reload it. 9678 * 9679 * Note that unlike in the Arm implementation, we should never arrive 9680 * here with a zero breakFlag because we always refresh rIBASE on 9681 * return. 9682 */ 9683 .extern MterpCheckBefore 9684 REFRESH_IBASE 9685 movq rSELF, OUT_ARG0 9686 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9687 movq rPC, OUT_ARG2 9688 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9689 jmp .L_op_nop+(156*128) 9690 9691 /* ------------------------------ */ 9692 .balign 128 9693 .L_ALT_op_mul_long: /* 0x9d */ 9694 /* File: x86_64/alt_stub.S */ 9695 /* 9696 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9697 * any interesting requests and then jump to the real instruction 9698 * handler. Unlike the Arm handler, we can't do this as a tail call 9699 * because rIBASE is caller save and we need to reload it. 9700 * 9701 * Note that unlike in the Arm implementation, we should never arrive 9702 * here with a zero breakFlag because we always refresh rIBASE on 9703 * return. 9704 */ 9705 .extern MterpCheckBefore 9706 REFRESH_IBASE 9707 movq rSELF, OUT_ARG0 9708 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9709 movq rPC, OUT_ARG2 9710 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9711 jmp .L_op_nop+(157*128) 9712 9713 /* ------------------------------ */ 9714 .balign 128 9715 .L_ALT_op_div_long: /* 0x9e */ 9716 /* File: x86_64/alt_stub.S */ 9717 /* 9718 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9719 * any interesting requests and then jump to the real instruction 9720 * handler. Unlike the Arm handler, we can't do this as a tail call 9721 * because rIBASE is caller save and we need to reload it. 9722 * 9723 * Note that unlike in the Arm implementation, we should never arrive 9724 * here with a zero breakFlag because we always refresh rIBASE on 9725 * return. 9726 */ 9727 .extern MterpCheckBefore 9728 REFRESH_IBASE 9729 movq rSELF, OUT_ARG0 9730 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9731 movq rPC, OUT_ARG2 9732 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9733 jmp .L_op_nop+(158*128) 9734 9735 /* ------------------------------ */ 9736 .balign 128 9737 .L_ALT_op_rem_long: /* 0x9f */ 9738 /* File: x86_64/alt_stub.S */ 9739 /* 9740 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9741 * any interesting requests and then jump to the real instruction 9742 * handler. Unlike the Arm handler, we can't do this as a tail call 9743 * because rIBASE is caller save and we need to reload it. 9744 * 9745 * Note that unlike in the Arm implementation, we should never arrive 9746 * here with a zero breakFlag because we always refresh rIBASE on 9747 * return. 9748 */ 9749 .extern MterpCheckBefore 9750 REFRESH_IBASE 9751 movq rSELF, OUT_ARG0 9752 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9753 movq rPC, OUT_ARG2 9754 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9755 jmp .L_op_nop+(159*128) 9756 9757 /* ------------------------------ */ 9758 .balign 128 9759 .L_ALT_op_and_long: /* 0xa0 */ 9760 /* File: x86_64/alt_stub.S */ 9761 /* 9762 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9763 * any interesting requests and then jump to the real instruction 9764 * handler. Unlike the Arm handler, we can't do this as a tail call 9765 * because rIBASE is caller save and we need to reload it. 9766 * 9767 * Note that unlike in the Arm implementation, we should never arrive 9768 * here with a zero breakFlag because we always refresh rIBASE on 9769 * return. 9770 */ 9771 .extern MterpCheckBefore 9772 REFRESH_IBASE 9773 movq rSELF, OUT_ARG0 9774 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9775 movq rPC, OUT_ARG2 9776 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9777 jmp .L_op_nop+(160*128) 9778 9779 /* ------------------------------ */ 9780 .balign 128 9781 .L_ALT_op_or_long: /* 0xa1 */ 9782 /* File: x86_64/alt_stub.S */ 9783 /* 9784 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9785 * any interesting requests and then jump to the real instruction 9786 * handler. Unlike the Arm handler, we can't do this as a tail call 9787 * because rIBASE is caller save and we need to reload it. 9788 * 9789 * Note that unlike in the Arm implementation, we should never arrive 9790 * here with a zero breakFlag because we always refresh rIBASE on 9791 * return. 9792 */ 9793 .extern MterpCheckBefore 9794 REFRESH_IBASE 9795 movq rSELF, OUT_ARG0 9796 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9797 movq rPC, OUT_ARG2 9798 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9799 jmp .L_op_nop+(161*128) 9800 9801 /* ------------------------------ */ 9802 .balign 128 9803 .L_ALT_op_xor_long: /* 0xa2 */ 9804 /* File: x86_64/alt_stub.S */ 9805 /* 9806 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9807 * any interesting requests and then jump to the real instruction 9808 * handler. Unlike the Arm handler, we can't do this as a tail call 9809 * because rIBASE is caller save and we need to reload it. 9810 * 9811 * Note that unlike in the Arm implementation, we should never arrive 9812 * here with a zero breakFlag because we always refresh rIBASE on 9813 * return. 9814 */ 9815 .extern MterpCheckBefore 9816 REFRESH_IBASE 9817 movq rSELF, OUT_ARG0 9818 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9819 movq rPC, OUT_ARG2 9820 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9821 jmp .L_op_nop+(162*128) 9822 9823 /* ------------------------------ */ 9824 .balign 128 9825 .L_ALT_op_shl_long: /* 0xa3 */ 9826 /* File: x86_64/alt_stub.S */ 9827 /* 9828 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9829 * any interesting requests and then jump to the real instruction 9830 * handler. Unlike the Arm handler, we can't do this as a tail call 9831 * because rIBASE is caller save and we need to reload it. 9832 * 9833 * Note that unlike in the Arm implementation, we should never arrive 9834 * here with a zero breakFlag because we always refresh rIBASE on 9835 * return. 9836 */ 9837 .extern MterpCheckBefore 9838 REFRESH_IBASE 9839 movq rSELF, OUT_ARG0 9840 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9841 movq rPC, OUT_ARG2 9842 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9843 jmp .L_op_nop+(163*128) 9844 9845 /* ------------------------------ */ 9846 .balign 128 9847 .L_ALT_op_shr_long: /* 0xa4 */ 9848 /* File: x86_64/alt_stub.S */ 9849 /* 9850 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9851 * any interesting requests and then jump to the real instruction 9852 * handler. Unlike the Arm handler, we can't do this as a tail call 9853 * because rIBASE is caller save and we need to reload it. 9854 * 9855 * Note that unlike in the Arm implementation, we should never arrive 9856 * here with a zero breakFlag because we always refresh rIBASE on 9857 * return. 9858 */ 9859 .extern MterpCheckBefore 9860 REFRESH_IBASE 9861 movq rSELF, OUT_ARG0 9862 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9863 movq rPC, OUT_ARG2 9864 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9865 jmp .L_op_nop+(164*128) 9866 9867 /* ------------------------------ */ 9868 .balign 128 9869 .L_ALT_op_ushr_long: /* 0xa5 */ 9870 /* File: x86_64/alt_stub.S */ 9871 /* 9872 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9873 * any interesting requests and then jump to the real instruction 9874 * handler. Unlike the Arm handler, we can't do this as a tail call 9875 * because rIBASE is caller save and we need to reload it. 9876 * 9877 * Note that unlike in the Arm implementation, we should never arrive 9878 * here with a zero breakFlag because we always refresh rIBASE on 9879 * return. 9880 */ 9881 .extern MterpCheckBefore 9882 REFRESH_IBASE 9883 movq rSELF, OUT_ARG0 9884 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9885 movq rPC, OUT_ARG2 9886 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9887 jmp .L_op_nop+(165*128) 9888 9889 /* ------------------------------ */ 9890 .balign 128 9891 .L_ALT_op_add_float: /* 0xa6 */ 9892 /* File: x86_64/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. Unlike the Arm handler, we can't do this as a tail call 9897 * because rIBASE is caller save and we need to reload it. 9898 * 9899 * Note that unlike in the Arm implementation, we should never arrive 9900 * here with a zero breakFlag because we always refresh rIBASE on 9901 * return. 9902 */ 9903 .extern MterpCheckBefore 9904 REFRESH_IBASE 9905 movq rSELF, OUT_ARG0 9906 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9907 movq rPC, OUT_ARG2 9908 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9909 jmp .L_op_nop+(166*128) 9910 9911 /* ------------------------------ */ 9912 .balign 128 9913 .L_ALT_op_sub_float: /* 0xa7 */ 9914 /* File: x86_64/alt_stub.S */ 9915 /* 9916 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9917 * any interesting requests and then jump to the real instruction 9918 * handler. Unlike the Arm handler, we can't do this as a tail call 9919 * because rIBASE is caller save and we need to reload it. 9920 * 9921 * Note that unlike in the Arm implementation, we should never arrive 9922 * here with a zero breakFlag because we always refresh rIBASE on 9923 * return. 9924 */ 9925 .extern MterpCheckBefore 9926 REFRESH_IBASE 9927 movq rSELF, OUT_ARG0 9928 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9929 movq rPC, OUT_ARG2 9930 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9931 jmp .L_op_nop+(167*128) 9932 9933 /* ------------------------------ */ 9934 .balign 128 9935 .L_ALT_op_mul_float: /* 0xa8 */ 9936 /* File: x86_64/alt_stub.S */ 9937 /* 9938 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9939 * any interesting requests and then jump to the real instruction 9940 * handler. Unlike the Arm handler, we can't do this as a tail call 9941 * because rIBASE is caller save and we need to reload it. 9942 * 9943 * Note that unlike in the Arm implementation, we should never arrive 9944 * here with a zero breakFlag because we always refresh rIBASE on 9945 * return. 9946 */ 9947 .extern MterpCheckBefore 9948 REFRESH_IBASE 9949 movq rSELF, OUT_ARG0 9950 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9951 movq rPC, OUT_ARG2 9952 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9953 jmp .L_op_nop+(168*128) 9954 9955 /* ------------------------------ */ 9956 .balign 128 9957 .L_ALT_op_div_float: /* 0xa9 */ 9958 /* File: x86_64/alt_stub.S */ 9959 /* 9960 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9961 * any interesting requests and then jump to the real instruction 9962 * handler. Unlike the Arm handler, we can't do this as a tail call 9963 * because rIBASE is caller save and we need to reload it. 9964 * 9965 * Note that unlike in the Arm implementation, we should never arrive 9966 * here with a zero breakFlag because we always refresh rIBASE on 9967 * return. 9968 */ 9969 .extern MterpCheckBefore 9970 REFRESH_IBASE 9971 movq rSELF, OUT_ARG0 9972 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9973 movq rPC, OUT_ARG2 9974 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9975 jmp .L_op_nop+(169*128) 9976 9977 /* ------------------------------ */ 9978 .balign 128 9979 .L_ALT_op_rem_float: /* 0xaa */ 9980 /* File: x86_64/alt_stub.S */ 9981 /* 9982 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9983 * any interesting requests and then jump to the real instruction 9984 * handler. Unlike the Arm handler, we can't do this as a tail call 9985 * because rIBASE is caller save and we need to reload it. 9986 * 9987 * Note that unlike in the Arm implementation, we should never arrive 9988 * here with a zero breakFlag because we always refresh rIBASE on 9989 * return. 9990 */ 9991 .extern MterpCheckBefore 9992 REFRESH_IBASE 9993 movq rSELF, OUT_ARG0 9994 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 9995 movq rPC, OUT_ARG2 9996 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9997 jmp .L_op_nop+(170*128) 9998 9999 /* ------------------------------ */ 10000 .balign 128 10001 .L_ALT_op_add_double: /* 0xab */ 10002 /* File: x86_64/alt_stub.S */ 10003 /* 10004 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10005 * any interesting requests and then jump to the real instruction 10006 * handler. Unlike the Arm handler, we can't do this as a tail call 10007 * because rIBASE is caller save and we need to reload it. 10008 * 10009 * Note that unlike in the Arm implementation, we should never arrive 10010 * here with a zero breakFlag because we always refresh rIBASE on 10011 * return. 10012 */ 10013 .extern MterpCheckBefore 10014 REFRESH_IBASE 10015 movq rSELF, OUT_ARG0 10016 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10017 movq rPC, OUT_ARG2 10018 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10019 jmp .L_op_nop+(171*128) 10020 10021 /* ------------------------------ */ 10022 .balign 128 10023 .L_ALT_op_sub_double: /* 0xac */ 10024 /* File: x86_64/alt_stub.S */ 10025 /* 10026 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10027 * any interesting requests and then jump to the real instruction 10028 * handler. Unlike the Arm handler, we can't do this as a tail call 10029 * because rIBASE is caller save and we need to reload it. 10030 * 10031 * Note that unlike in the Arm implementation, we should never arrive 10032 * here with a zero breakFlag because we always refresh rIBASE on 10033 * return. 10034 */ 10035 .extern MterpCheckBefore 10036 REFRESH_IBASE 10037 movq rSELF, OUT_ARG0 10038 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10039 movq rPC, OUT_ARG2 10040 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10041 jmp .L_op_nop+(172*128) 10042 10043 /* ------------------------------ */ 10044 .balign 128 10045 .L_ALT_op_mul_double: /* 0xad */ 10046 /* File: x86_64/alt_stub.S */ 10047 /* 10048 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10049 * any interesting requests and then jump to the real instruction 10050 * handler. Unlike the Arm handler, we can't do this as a tail call 10051 * because rIBASE is caller save and we need to reload it. 10052 * 10053 * Note that unlike in the Arm implementation, we should never arrive 10054 * here with a zero breakFlag because we always refresh rIBASE on 10055 * return. 10056 */ 10057 .extern MterpCheckBefore 10058 REFRESH_IBASE 10059 movq rSELF, OUT_ARG0 10060 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10061 movq rPC, OUT_ARG2 10062 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10063 jmp .L_op_nop+(173*128) 10064 10065 /* ------------------------------ */ 10066 .balign 128 10067 .L_ALT_op_div_double: /* 0xae */ 10068 /* File: x86_64/alt_stub.S */ 10069 /* 10070 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10071 * any interesting requests and then jump to the real instruction 10072 * handler. Unlike the Arm handler, we can't do this as a tail call 10073 * because rIBASE is caller save and we need to reload it. 10074 * 10075 * Note that unlike in the Arm implementation, we should never arrive 10076 * here with a zero breakFlag because we always refresh rIBASE on 10077 * return. 10078 */ 10079 .extern MterpCheckBefore 10080 REFRESH_IBASE 10081 movq rSELF, OUT_ARG0 10082 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10083 movq rPC, OUT_ARG2 10084 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10085 jmp .L_op_nop+(174*128) 10086 10087 /* ------------------------------ */ 10088 .balign 128 10089 .L_ALT_op_rem_double: /* 0xaf */ 10090 /* File: x86_64/alt_stub.S */ 10091 /* 10092 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10093 * any interesting requests and then jump to the real instruction 10094 * handler. Unlike the Arm handler, we can't do this as a tail call 10095 * because rIBASE is caller save and we need to reload it. 10096 * 10097 * Note that unlike in the Arm implementation, we should never arrive 10098 * here with a zero breakFlag because we always refresh rIBASE on 10099 * return. 10100 */ 10101 .extern MterpCheckBefore 10102 REFRESH_IBASE 10103 movq rSELF, OUT_ARG0 10104 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10105 movq rPC, OUT_ARG2 10106 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10107 jmp .L_op_nop+(175*128) 10108 10109 /* ------------------------------ */ 10110 .balign 128 10111 .L_ALT_op_add_int_2addr: /* 0xb0 */ 10112 /* File: x86_64/alt_stub.S */ 10113 /* 10114 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10115 * any interesting requests and then jump to the real instruction 10116 * handler. Unlike the Arm handler, we can't do this as a tail call 10117 * because rIBASE is caller save and we need to reload it. 10118 * 10119 * Note that unlike in the Arm implementation, we should never arrive 10120 * here with a zero breakFlag because we always refresh rIBASE on 10121 * return. 10122 */ 10123 .extern MterpCheckBefore 10124 REFRESH_IBASE 10125 movq rSELF, OUT_ARG0 10126 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10127 movq rPC, OUT_ARG2 10128 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10129 jmp .L_op_nop+(176*128) 10130 10131 /* ------------------------------ */ 10132 .balign 128 10133 .L_ALT_op_sub_int_2addr: /* 0xb1 */ 10134 /* File: x86_64/alt_stub.S */ 10135 /* 10136 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10137 * any interesting requests and then jump to the real instruction 10138 * handler. Unlike the Arm handler, we can't do this as a tail call 10139 * because rIBASE is caller save and we need to reload it. 10140 * 10141 * Note that unlike in the Arm implementation, we should never arrive 10142 * here with a zero breakFlag because we always refresh rIBASE on 10143 * return. 10144 */ 10145 .extern MterpCheckBefore 10146 REFRESH_IBASE 10147 movq rSELF, OUT_ARG0 10148 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10149 movq rPC, OUT_ARG2 10150 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10151 jmp .L_op_nop+(177*128) 10152 10153 /* ------------------------------ */ 10154 .balign 128 10155 .L_ALT_op_mul_int_2addr: /* 0xb2 */ 10156 /* File: x86_64/alt_stub.S */ 10157 /* 10158 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10159 * any interesting requests and then jump to the real instruction 10160 * handler. Unlike the Arm handler, we can't do this as a tail call 10161 * because rIBASE is caller save and we need to reload it. 10162 * 10163 * Note that unlike in the Arm implementation, we should never arrive 10164 * here with a zero breakFlag because we always refresh rIBASE on 10165 * return. 10166 */ 10167 .extern MterpCheckBefore 10168 REFRESH_IBASE 10169 movq rSELF, OUT_ARG0 10170 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10171 movq rPC, OUT_ARG2 10172 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10173 jmp .L_op_nop+(178*128) 10174 10175 /* ------------------------------ */ 10176 .balign 128 10177 .L_ALT_op_div_int_2addr: /* 0xb3 */ 10178 /* File: x86_64/alt_stub.S */ 10179 /* 10180 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10181 * any interesting requests and then jump to the real instruction 10182 * handler. Unlike the Arm handler, we can't do this as a tail call 10183 * because rIBASE is caller save and we need to reload it. 10184 * 10185 * Note that unlike in the Arm implementation, we should never arrive 10186 * here with a zero breakFlag because we always refresh rIBASE on 10187 * return. 10188 */ 10189 .extern MterpCheckBefore 10190 REFRESH_IBASE 10191 movq rSELF, OUT_ARG0 10192 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10193 movq rPC, OUT_ARG2 10194 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10195 jmp .L_op_nop+(179*128) 10196 10197 /* ------------------------------ */ 10198 .balign 128 10199 .L_ALT_op_rem_int_2addr: /* 0xb4 */ 10200 /* File: x86_64/alt_stub.S */ 10201 /* 10202 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10203 * any interesting requests and then jump to the real instruction 10204 * handler. Unlike the Arm handler, we can't do this as a tail call 10205 * because rIBASE is caller save and we need to reload it. 10206 * 10207 * Note that unlike in the Arm implementation, we should never arrive 10208 * here with a zero breakFlag because we always refresh rIBASE on 10209 * return. 10210 */ 10211 .extern MterpCheckBefore 10212 REFRESH_IBASE 10213 movq rSELF, OUT_ARG0 10214 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10215 movq rPC, OUT_ARG2 10216 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10217 jmp .L_op_nop+(180*128) 10218 10219 /* ------------------------------ */ 10220 .balign 128 10221 .L_ALT_op_and_int_2addr: /* 0xb5 */ 10222 /* File: x86_64/alt_stub.S */ 10223 /* 10224 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10225 * any interesting requests and then jump to the real instruction 10226 * handler. Unlike the Arm handler, we can't do this as a tail call 10227 * because rIBASE is caller save and we need to reload it. 10228 * 10229 * Note that unlike in the Arm implementation, we should never arrive 10230 * here with a zero breakFlag because we always refresh rIBASE on 10231 * return. 10232 */ 10233 .extern MterpCheckBefore 10234 REFRESH_IBASE 10235 movq rSELF, OUT_ARG0 10236 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10237 movq rPC, OUT_ARG2 10238 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10239 jmp .L_op_nop+(181*128) 10240 10241 /* ------------------------------ */ 10242 .balign 128 10243 .L_ALT_op_or_int_2addr: /* 0xb6 */ 10244 /* File: x86_64/alt_stub.S */ 10245 /* 10246 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10247 * any interesting requests and then jump to the real instruction 10248 * handler. Unlike the Arm handler, we can't do this as a tail call 10249 * because rIBASE is caller save and we need to reload it. 10250 * 10251 * Note that unlike in the Arm implementation, we should never arrive 10252 * here with a zero breakFlag because we always refresh rIBASE on 10253 * return. 10254 */ 10255 .extern MterpCheckBefore 10256 REFRESH_IBASE 10257 movq rSELF, OUT_ARG0 10258 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10259 movq rPC, OUT_ARG2 10260 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10261 jmp .L_op_nop+(182*128) 10262 10263 /* ------------------------------ */ 10264 .balign 128 10265 .L_ALT_op_xor_int_2addr: /* 0xb7 */ 10266 /* File: x86_64/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. Unlike the Arm handler, we can't do this as a tail call 10271 * because rIBASE is caller save and we need to reload it. 10272 * 10273 * Note that unlike in the Arm implementation, we should never arrive 10274 * here with a zero breakFlag because we always refresh rIBASE on 10275 * return. 10276 */ 10277 .extern MterpCheckBefore 10278 REFRESH_IBASE 10279 movq rSELF, OUT_ARG0 10280 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10281 movq rPC, OUT_ARG2 10282 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10283 jmp .L_op_nop+(183*128) 10284 10285 /* ------------------------------ */ 10286 .balign 128 10287 .L_ALT_op_shl_int_2addr: /* 0xb8 */ 10288 /* File: x86_64/alt_stub.S */ 10289 /* 10290 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10291 * any interesting requests and then jump to the real instruction 10292 * handler. Unlike the Arm handler, we can't do this as a tail call 10293 * because rIBASE is caller save and we need to reload it. 10294 * 10295 * Note that unlike in the Arm implementation, we should never arrive 10296 * here with a zero breakFlag because we always refresh rIBASE on 10297 * return. 10298 */ 10299 .extern MterpCheckBefore 10300 REFRESH_IBASE 10301 movq rSELF, OUT_ARG0 10302 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10303 movq rPC, OUT_ARG2 10304 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10305 jmp .L_op_nop+(184*128) 10306 10307 /* ------------------------------ */ 10308 .balign 128 10309 .L_ALT_op_shr_int_2addr: /* 0xb9 */ 10310 /* File: x86_64/alt_stub.S */ 10311 /* 10312 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10313 * any interesting requests and then jump to the real instruction 10314 * handler. Unlike the Arm handler, we can't do this as a tail call 10315 * because rIBASE is caller save and we need to reload it. 10316 * 10317 * Note that unlike in the Arm implementation, we should never arrive 10318 * here with a zero breakFlag because we always refresh rIBASE on 10319 * return. 10320 */ 10321 .extern MterpCheckBefore 10322 REFRESH_IBASE 10323 movq rSELF, OUT_ARG0 10324 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10325 movq rPC, OUT_ARG2 10326 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10327 jmp .L_op_nop+(185*128) 10328 10329 /* ------------------------------ */ 10330 .balign 128 10331 .L_ALT_op_ushr_int_2addr: /* 0xba */ 10332 /* File: x86_64/alt_stub.S */ 10333 /* 10334 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10335 * any interesting requests and then jump to the real instruction 10336 * handler. Unlike the Arm handler, we can't do this as a tail call 10337 * because rIBASE is caller save and we need to reload it. 10338 * 10339 * Note that unlike in the Arm implementation, we should never arrive 10340 * here with a zero breakFlag because we always refresh rIBASE on 10341 * return. 10342 */ 10343 .extern MterpCheckBefore 10344 REFRESH_IBASE 10345 movq rSELF, OUT_ARG0 10346 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10347 movq rPC, OUT_ARG2 10348 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10349 jmp .L_op_nop+(186*128) 10350 10351 /* ------------------------------ */ 10352 .balign 128 10353 .L_ALT_op_add_long_2addr: /* 0xbb */ 10354 /* File: x86_64/alt_stub.S */ 10355 /* 10356 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10357 * any interesting requests and then jump to the real instruction 10358 * handler. Unlike the Arm handler, we can't do this as a tail call 10359 * because rIBASE is caller save and we need to reload it. 10360 * 10361 * Note that unlike in the Arm implementation, we should never arrive 10362 * here with a zero breakFlag because we always refresh rIBASE on 10363 * return. 10364 */ 10365 .extern MterpCheckBefore 10366 REFRESH_IBASE 10367 movq rSELF, OUT_ARG0 10368 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10369 movq rPC, OUT_ARG2 10370 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10371 jmp .L_op_nop+(187*128) 10372 10373 /* ------------------------------ */ 10374 .balign 128 10375 .L_ALT_op_sub_long_2addr: /* 0xbc */ 10376 /* File: x86_64/alt_stub.S */ 10377 /* 10378 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10379 * any interesting requests and then jump to the real instruction 10380 * handler. Unlike the Arm handler, we can't do this as a tail call 10381 * because rIBASE is caller save and we need to reload it. 10382 * 10383 * Note that unlike in the Arm implementation, we should never arrive 10384 * here with a zero breakFlag because we always refresh rIBASE on 10385 * return. 10386 */ 10387 .extern MterpCheckBefore 10388 REFRESH_IBASE 10389 movq rSELF, OUT_ARG0 10390 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10391 movq rPC, OUT_ARG2 10392 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10393 jmp .L_op_nop+(188*128) 10394 10395 /* ------------------------------ */ 10396 .balign 128 10397 .L_ALT_op_mul_long_2addr: /* 0xbd */ 10398 /* File: x86_64/alt_stub.S */ 10399 /* 10400 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10401 * any interesting requests and then jump to the real instruction 10402 * handler. Unlike the Arm handler, we can't do this as a tail call 10403 * because rIBASE is caller save and we need to reload it. 10404 * 10405 * Note that unlike in the Arm implementation, we should never arrive 10406 * here with a zero breakFlag because we always refresh rIBASE on 10407 * return. 10408 */ 10409 .extern MterpCheckBefore 10410 REFRESH_IBASE 10411 movq rSELF, OUT_ARG0 10412 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10413 movq rPC, OUT_ARG2 10414 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10415 jmp .L_op_nop+(189*128) 10416 10417 /* ------------------------------ */ 10418 .balign 128 10419 .L_ALT_op_div_long_2addr: /* 0xbe */ 10420 /* File: x86_64/alt_stub.S */ 10421 /* 10422 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10423 * any interesting requests and then jump to the real instruction 10424 * handler. Unlike the Arm handler, we can't do this as a tail call 10425 * because rIBASE is caller save and we need to reload it. 10426 * 10427 * Note that unlike in the Arm implementation, we should never arrive 10428 * here with a zero breakFlag because we always refresh rIBASE on 10429 * return. 10430 */ 10431 .extern MterpCheckBefore 10432 REFRESH_IBASE 10433 movq rSELF, OUT_ARG0 10434 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10435 movq rPC, OUT_ARG2 10436 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10437 jmp .L_op_nop+(190*128) 10438 10439 /* ------------------------------ */ 10440 .balign 128 10441 .L_ALT_op_rem_long_2addr: /* 0xbf */ 10442 /* File: x86_64/alt_stub.S */ 10443 /* 10444 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10445 * any interesting requests and then jump to the real instruction 10446 * handler. Unlike the Arm handler, we can't do this as a tail call 10447 * because rIBASE is caller save and we need to reload it. 10448 * 10449 * Note that unlike in the Arm implementation, we should never arrive 10450 * here with a zero breakFlag because we always refresh rIBASE on 10451 * return. 10452 */ 10453 .extern MterpCheckBefore 10454 REFRESH_IBASE 10455 movq rSELF, OUT_ARG0 10456 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10457 movq rPC, OUT_ARG2 10458 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10459 jmp .L_op_nop+(191*128) 10460 10461 /* ------------------------------ */ 10462 .balign 128 10463 .L_ALT_op_and_long_2addr: /* 0xc0 */ 10464 /* File: x86_64/alt_stub.S */ 10465 /* 10466 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10467 * any interesting requests and then jump to the real instruction 10468 * handler. Unlike the Arm handler, we can't do this as a tail call 10469 * because rIBASE is caller save and we need to reload it. 10470 * 10471 * Note that unlike in the Arm implementation, we should never arrive 10472 * here with a zero breakFlag because we always refresh rIBASE on 10473 * return. 10474 */ 10475 .extern MterpCheckBefore 10476 REFRESH_IBASE 10477 movq rSELF, OUT_ARG0 10478 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10479 movq rPC, OUT_ARG2 10480 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10481 jmp .L_op_nop+(192*128) 10482 10483 /* ------------------------------ */ 10484 .balign 128 10485 .L_ALT_op_or_long_2addr: /* 0xc1 */ 10486 /* File: x86_64/alt_stub.S */ 10487 /* 10488 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10489 * any interesting requests and then jump to the real instruction 10490 * handler. Unlike the Arm handler, we can't do this as a tail call 10491 * because rIBASE is caller save and we need to reload it. 10492 * 10493 * Note that unlike in the Arm implementation, we should never arrive 10494 * here with a zero breakFlag because we always refresh rIBASE on 10495 * return. 10496 */ 10497 .extern MterpCheckBefore 10498 REFRESH_IBASE 10499 movq rSELF, OUT_ARG0 10500 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10501 movq rPC, OUT_ARG2 10502 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10503 jmp .L_op_nop+(193*128) 10504 10505 /* ------------------------------ */ 10506 .balign 128 10507 .L_ALT_op_xor_long_2addr: /* 0xc2 */ 10508 /* File: x86_64/alt_stub.S */ 10509 /* 10510 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10511 * any interesting requests and then jump to the real instruction 10512 * handler. Unlike the Arm handler, we can't do this as a tail call 10513 * because rIBASE is caller save and we need to reload it. 10514 * 10515 * Note that unlike in the Arm implementation, we should never arrive 10516 * here with a zero breakFlag because we always refresh rIBASE on 10517 * return. 10518 */ 10519 .extern MterpCheckBefore 10520 REFRESH_IBASE 10521 movq rSELF, OUT_ARG0 10522 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10523 movq rPC, OUT_ARG2 10524 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10525 jmp .L_op_nop+(194*128) 10526 10527 /* ------------------------------ */ 10528 .balign 128 10529 .L_ALT_op_shl_long_2addr: /* 0xc3 */ 10530 /* File: x86_64/alt_stub.S */ 10531 /* 10532 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10533 * any interesting requests and then jump to the real instruction 10534 * handler. Unlike the Arm handler, we can't do this as a tail call 10535 * because rIBASE is caller save and we need to reload it. 10536 * 10537 * Note that unlike in the Arm implementation, we should never arrive 10538 * here with a zero breakFlag because we always refresh rIBASE on 10539 * return. 10540 */ 10541 .extern MterpCheckBefore 10542 REFRESH_IBASE 10543 movq rSELF, OUT_ARG0 10544 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10545 movq rPC, OUT_ARG2 10546 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10547 jmp .L_op_nop+(195*128) 10548 10549 /* ------------------------------ */ 10550 .balign 128 10551 .L_ALT_op_shr_long_2addr: /* 0xc4 */ 10552 /* File: x86_64/alt_stub.S */ 10553 /* 10554 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10555 * any interesting requests and then jump to the real instruction 10556 * handler. Unlike the Arm handler, we can't do this as a tail call 10557 * because rIBASE is caller save and we need to reload it. 10558 * 10559 * Note that unlike in the Arm implementation, we should never arrive 10560 * here with a zero breakFlag because we always refresh rIBASE on 10561 * return. 10562 */ 10563 .extern MterpCheckBefore 10564 REFRESH_IBASE 10565 movq rSELF, OUT_ARG0 10566 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10567 movq rPC, OUT_ARG2 10568 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10569 jmp .L_op_nop+(196*128) 10570 10571 /* ------------------------------ */ 10572 .balign 128 10573 .L_ALT_op_ushr_long_2addr: /* 0xc5 */ 10574 /* File: x86_64/alt_stub.S */ 10575 /* 10576 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10577 * any interesting requests and then jump to the real instruction 10578 * handler. Unlike the Arm handler, we can't do this as a tail call 10579 * because rIBASE is caller save and we need to reload it. 10580 * 10581 * Note that unlike in the Arm implementation, we should never arrive 10582 * here with a zero breakFlag because we always refresh rIBASE on 10583 * return. 10584 */ 10585 .extern MterpCheckBefore 10586 REFRESH_IBASE 10587 movq rSELF, OUT_ARG0 10588 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10589 movq rPC, OUT_ARG2 10590 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10591 jmp .L_op_nop+(197*128) 10592 10593 /* ------------------------------ */ 10594 .balign 128 10595 .L_ALT_op_add_float_2addr: /* 0xc6 */ 10596 /* File: x86_64/alt_stub.S */ 10597 /* 10598 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10599 * any interesting requests and then jump to the real instruction 10600 * handler. Unlike the Arm handler, we can't do this as a tail call 10601 * because rIBASE is caller save and we need to reload it. 10602 * 10603 * Note that unlike in the Arm implementation, we should never arrive 10604 * here with a zero breakFlag because we always refresh rIBASE on 10605 * return. 10606 */ 10607 .extern MterpCheckBefore 10608 REFRESH_IBASE 10609 movq rSELF, OUT_ARG0 10610 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10611 movq rPC, OUT_ARG2 10612 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10613 jmp .L_op_nop+(198*128) 10614 10615 /* ------------------------------ */ 10616 .balign 128 10617 .L_ALT_op_sub_float_2addr: /* 0xc7 */ 10618 /* File: x86_64/alt_stub.S */ 10619 /* 10620 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10621 * any interesting requests and then jump to the real instruction 10622 * handler. Unlike the Arm handler, we can't do this as a tail call 10623 * because rIBASE is caller save and we need to reload it. 10624 * 10625 * Note that unlike in the Arm implementation, we should never arrive 10626 * here with a zero breakFlag because we always refresh rIBASE on 10627 * return. 10628 */ 10629 .extern MterpCheckBefore 10630 REFRESH_IBASE 10631 movq rSELF, OUT_ARG0 10632 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10633 movq rPC, OUT_ARG2 10634 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10635 jmp .L_op_nop+(199*128) 10636 10637 /* ------------------------------ */ 10638 .balign 128 10639 .L_ALT_op_mul_float_2addr: /* 0xc8 */ 10640 /* File: x86_64/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. Unlike the Arm handler, we can't do this as a tail call 10645 * because rIBASE is caller save and we need to reload it. 10646 * 10647 * Note that unlike in the Arm implementation, we should never arrive 10648 * here with a zero breakFlag because we always refresh rIBASE on 10649 * return. 10650 */ 10651 .extern MterpCheckBefore 10652 REFRESH_IBASE 10653 movq rSELF, OUT_ARG0 10654 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10655 movq rPC, OUT_ARG2 10656 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10657 jmp .L_op_nop+(200*128) 10658 10659 /* ------------------------------ */ 10660 .balign 128 10661 .L_ALT_op_div_float_2addr: /* 0xc9 */ 10662 /* File: x86_64/alt_stub.S */ 10663 /* 10664 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10665 * any interesting requests and then jump to the real instruction 10666 * handler. Unlike the Arm handler, we can't do this as a tail call 10667 * because rIBASE is caller save and we need to reload it. 10668 * 10669 * Note that unlike in the Arm implementation, we should never arrive 10670 * here with a zero breakFlag because we always refresh rIBASE on 10671 * return. 10672 */ 10673 .extern MterpCheckBefore 10674 REFRESH_IBASE 10675 movq rSELF, OUT_ARG0 10676 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10677 movq rPC, OUT_ARG2 10678 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10679 jmp .L_op_nop+(201*128) 10680 10681 /* ------------------------------ */ 10682 .balign 128 10683 .L_ALT_op_rem_float_2addr: /* 0xca */ 10684 /* File: x86_64/alt_stub.S */ 10685 /* 10686 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10687 * any interesting requests and then jump to the real instruction 10688 * handler. Unlike the Arm handler, we can't do this as a tail call 10689 * because rIBASE is caller save and we need to reload it. 10690 * 10691 * Note that unlike in the Arm implementation, we should never arrive 10692 * here with a zero breakFlag because we always refresh rIBASE on 10693 * return. 10694 */ 10695 .extern MterpCheckBefore 10696 REFRESH_IBASE 10697 movq rSELF, OUT_ARG0 10698 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10699 movq rPC, OUT_ARG2 10700 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10701 jmp .L_op_nop+(202*128) 10702 10703 /* ------------------------------ */ 10704 .balign 128 10705 .L_ALT_op_add_double_2addr: /* 0xcb */ 10706 /* File: x86_64/alt_stub.S */ 10707 /* 10708 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10709 * any interesting requests and then jump to the real instruction 10710 * handler. Unlike the Arm handler, we can't do this as a tail call 10711 * because rIBASE is caller save and we need to reload it. 10712 * 10713 * Note that unlike in the Arm implementation, we should never arrive 10714 * here with a zero breakFlag because we always refresh rIBASE on 10715 * return. 10716 */ 10717 .extern MterpCheckBefore 10718 REFRESH_IBASE 10719 movq rSELF, OUT_ARG0 10720 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10721 movq rPC, OUT_ARG2 10722 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10723 jmp .L_op_nop+(203*128) 10724 10725 /* ------------------------------ */ 10726 .balign 128 10727 .L_ALT_op_sub_double_2addr: /* 0xcc */ 10728 /* File: x86_64/alt_stub.S */ 10729 /* 10730 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10731 * any interesting requests and then jump to the real instruction 10732 * handler. Unlike the Arm handler, we can't do this as a tail call 10733 * because rIBASE is caller save and we need to reload it. 10734 * 10735 * Note that unlike in the Arm implementation, we should never arrive 10736 * here with a zero breakFlag because we always refresh rIBASE on 10737 * return. 10738 */ 10739 .extern MterpCheckBefore 10740 REFRESH_IBASE 10741 movq rSELF, OUT_ARG0 10742 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10743 movq rPC, OUT_ARG2 10744 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10745 jmp .L_op_nop+(204*128) 10746 10747 /* ------------------------------ */ 10748 .balign 128 10749 .L_ALT_op_mul_double_2addr: /* 0xcd */ 10750 /* File: x86_64/alt_stub.S */ 10751 /* 10752 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10753 * any interesting requests and then jump to the real instruction 10754 * handler. Unlike the Arm handler, we can't do this as a tail call 10755 * because rIBASE is caller save and we need to reload it. 10756 * 10757 * Note that unlike in the Arm implementation, we should never arrive 10758 * here with a zero breakFlag because we always refresh rIBASE on 10759 * return. 10760 */ 10761 .extern MterpCheckBefore 10762 REFRESH_IBASE 10763 movq rSELF, OUT_ARG0 10764 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10765 movq rPC, OUT_ARG2 10766 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10767 jmp .L_op_nop+(205*128) 10768 10769 /* ------------------------------ */ 10770 .balign 128 10771 .L_ALT_op_div_double_2addr: /* 0xce */ 10772 /* File: x86_64/alt_stub.S */ 10773 /* 10774 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10775 * any interesting requests and then jump to the real instruction 10776 * handler. Unlike the Arm handler, we can't do this as a tail call 10777 * because rIBASE is caller save and we need to reload it. 10778 * 10779 * Note that unlike in the Arm implementation, we should never arrive 10780 * here with a zero breakFlag because we always refresh rIBASE on 10781 * return. 10782 */ 10783 .extern MterpCheckBefore 10784 REFRESH_IBASE 10785 movq rSELF, OUT_ARG0 10786 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10787 movq rPC, OUT_ARG2 10788 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10789 jmp .L_op_nop+(206*128) 10790 10791 /* ------------------------------ */ 10792 .balign 128 10793 .L_ALT_op_rem_double_2addr: /* 0xcf */ 10794 /* File: x86_64/alt_stub.S */ 10795 /* 10796 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10797 * any interesting requests and then jump to the real instruction 10798 * handler. Unlike the Arm handler, we can't do this as a tail call 10799 * because rIBASE is caller save and we need to reload it. 10800 * 10801 * Note that unlike in the Arm implementation, we should never arrive 10802 * here with a zero breakFlag because we always refresh rIBASE on 10803 * return. 10804 */ 10805 .extern MterpCheckBefore 10806 REFRESH_IBASE 10807 movq rSELF, OUT_ARG0 10808 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10809 movq rPC, OUT_ARG2 10810 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10811 jmp .L_op_nop+(207*128) 10812 10813 /* ------------------------------ */ 10814 .balign 128 10815 .L_ALT_op_add_int_lit16: /* 0xd0 */ 10816 /* File: x86_64/alt_stub.S */ 10817 /* 10818 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10819 * any interesting requests and then jump to the real instruction 10820 * handler. Unlike the Arm handler, we can't do this as a tail call 10821 * because rIBASE is caller save and we need to reload it. 10822 * 10823 * Note that unlike in the Arm implementation, we should never arrive 10824 * here with a zero breakFlag because we always refresh rIBASE on 10825 * return. 10826 */ 10827 .extern MterpCheckBefore 10828 REFRESH_IBASE 10829 movq rSELF, OUT_ARG0 10830 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10831 movq rPC, OUT_ARG2 10832 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10833 jmp .L_op_nop+(208*128) 10834 10835 /* ------------------------------ */ 10836 .balign 128 10837 .L_ALT_op_rsub_int: /* 0xd1 */ 10838 /* File: x86_64/alt_stub.S */ 10839 /* 10840 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10841 * any interesting requests and then jump to the real instruction 10842 * handler. Unlike the Arm handler, we can't do this as a tail call 10843 * because rIBASE is caller save and we need to reload it. 10844 * 10845 * Note that unlike in the Arm implementation, we should never arrive 10846 * here with a zero breakFlag because we always refresh rIBASE on 10847 * return. 10848 */ 10849 .extern MterpCheckBefore 10850 REFRESH_IBASE 10851 movq rSELF, OUT_ARG0 10852 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10853 movq rPC, OUT_ARG2 10854 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10855 jmp .L_op_nop+(209*128) 10856 10857 /* ------------------------------ */ 10858 .balign 128 10859 .L_ALT_op_mul_int_lit16: /* 0xd2 */ 10860 /* File: x86_64/alt_stub.S */ 10861 /* 10862 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10863 * any interesting requests and then jump to the real instruction 10864 * handler. Unlike the Arm handler, we can't do this as a tail call 10865 * because rIBASE is caller save and we need to reload it. 10866 * 10867 * Note that unlike in the Arm implementation, we should never arrive 10868 * here with a zero breakFlag because we always refresh rIBASE on 10869 * return. 10870 */ 10871 .extern MterpCheckBefore 10872 REFRESH_IBASE 10873 movq rSELF, OUT_ARG0 10874 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10875 movq rPC, OUT_ARG2 10876 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10877 jmp .L_op_nop+(210*128) 10878 10879 /* ------------------------------ */ 10880 .balign 128 10881 .L_ALT_op_div_int_lit16: /* 0xd3 */ 10882 /* File: x86_64/alt_stub.S */ 10883 /* 10884 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10885 * any interesting requests and then jump to the real instruction 10886 * handler. Unlike the Arm handler, we can't do this as a tail call 10887 * because rIBASE is caller save and we need to reload it. 10888 * 10889 * Note that unlike in the Arm implementation, we should never arrive 10890 * here with a zero breakFlag because we always refresh rIBASE on 10891 * return. 10892 */ 10893 .extern MterpCheckBefore 10894 REFRESH_IBASE 10895 movq rSELF, OUT_ARG0 10896 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10897 movq rPC, OUT_ARG2 10898 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10899 jmp .L_op_nop+(211*128) 10900 10901 /* ------------------------------ */ 10902 .balign 128 10903 .L_ALT_op_rem_int_lit16: /* 0xd4 */ 10904 /* File: x86_64/alt_stub.S */ 10905 /* 10906 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10907 * any interesting requests and then jump to the real instruction 10908 * handler. Unlike the Arm handler, we can't do this as a tail call 10909 * because rIBASE is caller save and we need to reload it. 10910 * 10911 * Note that unlike in the Arm implementation, we should never arrive 10912 * here with a zero breakFlag because we always refresh rIBASE on 10913 * return. 10914 */ 10915 .extern MterpCheckBefore 10916 REFRESH_IBASE 10917 movq rSELF, OUT_ARG0 10918 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10919 movq rPC, OUT_ARG2 10920 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10921 jmp .L_op_nop+(212*128) 10922 10923 /* ------------------------------ */ 10924 .balign 128 10925 .L_ALT_op_and_int_lit16: /* 0xd5 */ 10926 /* File: x86_64/alt_stub.S */ 10927 /* 10928 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10929 * any interesting requests and then jump to the real instruction 10930 * handler. Unlike the Arm handler, we can't do this as a tail call 10931 * because rIBASE is caller save and we need to reload it. 10932 * 10933 * Note that unlike in the Arm implementation, we should never arrive 10934 * here with a zero breakFlag because we always refresh rIBASE on 10935 * return. 10936 */ 10937 .extern MterpCheckBefore 10938 REFRESH_IBASE 10939 movq rSELF, OUT_ARG0 10940 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10941 movq rPC, OUT_ARG2 10942 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10943 jmp .L_op_nop+(213*128) 10944 10945 /* ------------------------------ */ 10946 .balign 128 10947 .L_ALT_op_or_int_lit16: /* 0xd6 */ 10948 /* File: x86_64/alt_stub.S */ 10949 /* 10950 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10951 * any interesting requests and then jump to the real instruction 10952 * handler. Unlike the Arm handler, we can't do this as a tail call 10953 * because rIBASE is caller save and we need to reload it. 10954 * 10955 * Note that unlike in the Arm implementation, we should never arrive 10956 * here with a zero breakFlag because we always refresh rIBASE on 10957 * return. 10958 */ 10959 .extern MterpCheckBefore 10960 REFRESH_IBASE 10961 movq rSELF, OUT_ARG0 10962 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10963 movq rPC, OUT_ARG2 10964 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10965 jmp .L_op_nop+(214*128) 10966 10967 /* ------------------------------ */ 10968 .balign 128 10969 .L_ALT_op_xor_int_lit16: /* 0xd7 */ 10970 /* File: x86_64/alt_stub.S */ 10971 /* 10972 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10973 * any interesting requests and then jump to the real instruction 10974 * handler. Unlike the Arm handler, we can't do this as a tail call 10975 * because rIBASE is caller save and we need to reload it. 10976 * 10977 * Note that unlike in the Arm implementation, we should never arrive 10978 * here with a zero breakFlag because we always refresh rIBASE on 10979 * return. 10980 */ 10981 .extern MterpCheckBefore 10982 REFRESH_IBASE 10983 movq rSELF, OUT_ARG0 10984 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 10985 movq rPC, OUT_ARG2 10986 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10987 jmp .L_op_nop+(215*128) 10988 10989 /* ------------------------------ */ 10990 .balign 128 10991 .L_ALT_op_add_int_lit8: /* 0xd8 */ 10992 /* File: x86_64/alt_stub.S */ 10993 /* 10994 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10995 * any interesting requests and then jump to the real instruction 10996 * handler. Unlike the Arm handler, we can't do this as a tail call 10997 * because rIBASE is caller save and we need to reload it. 10998 * 10999 * Note that unlike in the Arm implementation, we should never arrive 11000 * here with a zero breakFlag because we always refresh rIBASE on 11001 * return. 11002 */ 11003 .extern MterpCheckBefore 11004 REFRESH_IBASE 11005 movq rSELF, OUT_ARG0 11006 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11007 movq rPC, OUT_ARG2 11008 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11009 jmp .L_op_nop+(216*128) 11010 11011 /* ------------------------------ */ 11012 .balign 128 11013 .L_ALT_op_rsub_int_lit8: /* 0xd9 */ 11014 /* File: x86_64/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. Unlike the Arm handler, we can't do this as a tail call 11019 * because rIBASE is caller save and we need to reload it. 11020 * 11021 * Note that unlike in the Arm implementation, we should never arrive 11022 * here with a zero breakFlag because we always refresh rIBASE on 11023 * return. 11024 */ 11025 .extern MterpCheckBefore 11026 REFRESH_IBASE 11027 movq rSELF, OUT_ARG0 11028 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11029 movq rPC, OUT_ARG2 11030 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11031 jmp .L_op_nop+(217*128) 11032 11033 /* ------------------------------ */ 11034 .balign 128 11035 .L_ALT_op_mul_int_lit8: /* 0xda */ 11036 /* File: x86_64/alt_stub.S */ 11037 /* 11038 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11039 * any interesting requests and then jump to the real instruction 11040 * handler. Unlike the Arm handler, we can't do this as a tail call 11041 * because rIBASE is caller save and we need to reload it. 11042 * 11043 * Note that unlike in the Arm implementation, we should never arrive 11044 * here with a zero breakFlag because we always refresh rIBASE on 11045 * return. 11046 */ 11047 .extern MterpCheckBefore 11048 REFRESH_IBASE 11049 movq rSELF, OUT_ARG0 11050 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11051 movq rPC, OUT_ARG2 11052 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11053 jmp .L_op_nop+(218*128) 11054 11055 /* ------------------------------ */ 11056 .balign 128 11057 .L_ALT_op_div_int_lit8: /* 0xdb */ 11058 /* File: x86_64/alt_stub.S */ 11059 /* 11060 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11061 * any interesting requests and then jump to the real instruction 11062 * handler. Unlike the Arm handler, we can't do this as a tail call 11063 * because rIBASE is caller save and we need to reload it. 11064 * 11065 * Note that unlike in the Arm implementation, we should never arrive 11066 * here with a zero breakFlag because we always refresh rIBASE on 11067 * return. 11068 */ 11069 .extern MterpCheckBefore 11070 REFRESH_IBASE 11071 movq rSELF, OUT_ARG0 11072 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11073 movq rPC, OUT_ARG2 11074 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11075 jmp .L_op_nop+(219*128) 11076 11077 /* ------------------------------ */ 11078 .balign 128 11079 .L_ALT_op_rem_int_lit8: /* 0xdc */ 11080 /* File: x86_64/alt_stub.S */ 11081 /* 11082 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11083 * any interesting requests and then jump to the real instruction 11084 * handler. Unlike the Arm handler, we can't do this as a tail call 11085 * because rIBASE is caller save and we need to reload it. 11086 * 11087 * Note that unlike in the Arm implementation, we should never arrive 11088 * here with a zero breakFlag because we always refresh rIBASE on 11089 * return. 11090 */ 11091 .extern MterpCheckBefore 11092 REFRESH_IBASE 11093 movq rSELF, OUT_ARG0 11094 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11095 movq rPC, OUT_ARG2 11096 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11097 jmp .L_op_nop+(220*128) 11098 11099 /* ------------------------------ */ 11100 .balign 128 11101 .L_ALT_op_and_int_lit8: /* 0xdd */ 11102 /* File: x86_64/alt_stub.S */ 11103 /* 11104 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11105 * any interesting requests and then jump to the real instruction 11106 * handler. Unlike the Arm handler, we can't do this as a tail call 11107 * because rIBASE is caller save and we need to reload it. 11108 * 11109 * Note that unlike in the Arm implementation, we should never arrive 11110 * here with a zero breakFlag because we always refresh rIBASE on 11111 * return. 11112 */ 11113 .extern MterpCheckBefore 11114 REFRESH_IBASE 11115 movq rSELF, OUT_ARG0 11116 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11117 movq rPC, OUT_ARG2 11118 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11119 jmp .L_op_nop+(221*128) 11120 11121 /* ------------------------------ */ 11122 .balign 128 11123 .L_ALT_op_or_int_lit8: /* 0xde */ 11124 /* File: x86_64/alt_stub.S */ 11125 /* 11126 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11127 * any interesting requests and then jump to the real instruction 11128 * handler. Unlike the Arm handler, we can't do this as a tail call 11129 * because rIBASE is caller save and we need to reload it. 11130 * 11131 * Note that unlike in the Arm implementation, we should never arrive 11132 * here with a zero breakFlag because we always refresh rIBASE on 11133 * return. 11134 */ 11135 .extern MterpCheckBefore 11136 REFRESH_IBASE 11137 movq rSELF, OUT_ARG0 11138 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11139 movq rPC, OUT_ARG2 11140 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11141 jmp .L_op_nop+(222*128) 11142 11143 /* ------------------------------ */ 11144 .balign 128 11145 .L_ALT_op_xor_int_lit8: /* 0xdf */ 11146 /* File: x86_64/alt_stub.S */ 11147 /* 11148 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11149 * any interesting requests and then jump to the real instruction 11150 * handler. Unlike the Arm handler, we can't do this as a tail call 11151 * because rIBASE is caller save and we need to reload it. 11152 * 11153 * Note that unlike in the Arm implementation, we should never arrive 11154 * here with a zero breakFlag because we always refresh rIBASE on 11155 * return. 11156 */ 11157 .extern MterpCheckBefore 11158 REFRESH_IBASE 11159 movq rSELF, OUT_ARG0 11160 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11161 movq rPC, OUT_ARG2 11162 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11163 jmp .L_op_nop+(223*128) 11164 11165 /* ------------------------------ */ 11166 .balign 128 11167 .L_ALT_op_shl_int_lit8: /* 0xe0 */ 11168 /* File: x86_64/alt_stub.S */ 11169 /* 11170 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11171 * any interesting requests and then jump to the real instruction 11172 * handler. Unlike the Arm handler, we can't do this as a tail call 11173 * because rIBASE is caller save and we need to reload it. 11174 * 11175 * Note that unlike in the Arm implementation, we should never arrive 11176 * here with a zero breakFlag because we always refresh rIBASE on 11177 * return. 11178 */ 11179 .extern MterpCheckBefore 11180 REFRESH_IBASE 11181 movq rSELF, OUT_ARG0 11182 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11183 movq rPC, OUT_ARG2 11184 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11185 jmp .L_op_nop+(224*128) 11186 11187 /* ------------------------------ */ 11188 .balign 128 11189 .L_ALT_op_shr_int_lit8: /* 0xe1 */ 11190 /* File: x86_64/alt_stub.S */ 11191 /* 11192 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11193 * any interesting requests and then jump to the real instruction 11194 * handler. Unlike the Arm handler, we can't do this as a tail call 11195 * because rIBASE is caller save and we need to reload it. 11196 * 11197 * Note that unlike in the Arm implementation, we should never arrive 11198 * here with a zero breakFlag because we always refresh rIBASE on 11199 * return. 11200 */ 11201 .extern MterpCheckBefore 11202 REFRESH_IBASE 11203 movq rSELF, OUT_ARG0 11204 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11205 movq rPC, OUT_ARG2 11206 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11207 jmp .L_op_nop+(225*128) 11208 11209 /* ------------------------------ */ 11210 .balign 128 11211 .L_ALT_op_ushr_int_lit8: /* 0xe2 */ 11212 /* File: x86_64/alt_stub.S */ 11213 /* 11214 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11215 * any interesting requests and then jump to the real instruction 11216 * handler. Unlike the Arm handler, we can't do this as a tail call 11217 * because rIBASE is caller save and we need to reload it. 11218 * 11219 * Note that unlike in the Arm implementation, we should never arrive 11220 * here with a zero breakFlag because we always refresh rIBASE on 11221 * return. 11222 */ 11223 .extern MterpCheckBefore 11224 REFRESH_IBASE 11225 movq rSELF, OUT_ARG0 11226 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11227 movq rPC, OUT_ARG2 11228 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11229 jmp .L_op_nop+(226*128) 11230 11231 /* ------------------------------ */ 11232 .balign 128 11233 .L_ALT_op_iget_quick: /* 0xe3 */ 11234 /* File: x86_64/alt_stub.S */ 11235 /* 11236 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11237 * any interesting requests and then jump to the real instruction 11238 * handler. Unlike the Arm handler, we can't do this as a tail call 11239 * because rIBASE is caller save and we need to reload it. 11240 * 11241 * Note that unlike in the Arm implementation, we should never arrive 11242 * here with a zero breakFlag because we always refresh rIBASE on 11243 * return. 11244 */ 11245 .extern MterpCheckBefore 11246 REFRESH_IBASE 11247 movq rSELF, OUT_ARG0 11248 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11249 movq rPC, OUT_ARG2 11250 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11251 jmp .L_op_nop+(227*128) 11252 11253 /* ------------------------------ */ 11254 .balign 128 11255 .L_ALT_op_iget_wide_quick: /* 0xe4 */ 11256 /* File: x86_64/alt_stub.S */ 11257 /* 11258 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11259 * any interesting requests and then jump to the real instruction 11260 * handler. Unlike the Arm handler, we can't do this as a tail call 11261 * because rIBASE is caller save and we need to reload it. 11262 * 11263 * Note that unlike in the Arm implementation, we should never arrive 11264 * here with a zero breakFlag because we always refresh rIBASE on 11265 * return. 11266 */ 11267 .extern MterpCheckBefore 11268 REFRESH_IBASE 11269 movq rSELF, OUT_ARG0 11270 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11271 movq rPC, OUT_ARG2 11272 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11273 jmp .L_op_nop+(228*128) 11274 11275 /* ------------------------------ */ 11276 .balign 128 11277 .L_ALT_op_iget_object_quick: /* 0xe5 */ 11278 /* File: x86_64/alt_stub.S */ 11279 /* 11280 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11281 * any interesting requests and then jump to the real instruction 11282 * handler. Unlike the Arm handler, we can't do this as a tail call 11283 * because rIBASE is caller save and we need to reload it. 11284 * 11285 * Note that unlike in the Arm implementation, we should never arrive 11286 * here with a zero breakFlag because we always refresh rIBASE on 11287 * return. 11288 */ 11289 .extern MterpCheckBefore 11290 REFRESH_IBASE 11291 movq rSELF, OUT_ARG0 11292 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11293 movq rPC, OUT_ARG2 11294 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11295 jmp .L_op_nop+(229*128) 11296 11297 /* ------------------------------ */ 11298 .balign 128 11299 .L_ALT_op_iput_quick: /* 0xe6 */ 11300 /* File: x86_64/alt_stub.S */ 11301 /* 11302 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11303 * any interesting requests and then jump to the real instruction 11304 * handler. Unlike the Arm handler, we can't do this as a tail call 11305 * because rIBASE is caller save and we need to reload it. 11306 * 11307 * Note that unlike in the Arm implementation, we should never arrive 11308 * here with a zero breakFlag because we always refresh rIBASE on 11309 * return. 11310 */ 11311 .extern MterpCheckBefore 11312 REFRESH_IBASE 11313 movq rSELF, OUT_ARG0 11314 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11315 movq rPC, OUT_ARG2 11316 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11317 jmp .L_op_nop+(230*128) 11318 11319 /* ------------------------------ */ 11320 .balign 128 11321 .L_ALT_op_iput_wide_quick: /* 0xe7 */ 11322 /* File: x86_64/alt_stub.S */ 11323 /* 11324 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11325 * any interesting requests and then jump to the real instruction 11326 * handler. Unlike the Arm handler, we can't do this as a tail call 11327 * because rIBASE is caller save and we need to reload it. 11328 * 11329 * Note that unlike in the Arm implementation, we should never arrive 11330 * here with a zero breakFlag because we always refresh rIBASE on 11331 * return. 11332 */ 11333 .extern MterpCheckBefore 11334 REFRESH_IBASE 11335 movq rSELF, OUT_ARG0 11336 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11337 movq rPC, OUT_ARG2 11338 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11339 jmp .L_op_nop+(231*128) 11340 11341 /* ------------------------------ */ 11342 .balign 128 11343 .L_ALT_op_iput_object_quick: /* 0xe8 */ 11344 /* File: x86_64/alt_stub.S */ 11345 /* 11346 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11347 * any interesting requests and then jump to the real instruction 11348 * handler. Unlike the Arm handler, we can't do this as a tail call 11349 * because rIBASE is caller save and we need to reload it. 11350 * 11351 * Note that unlike in the Arm implementation, we should never arrive 11352 * here with a zero breakFlag because we always refresh rIBASE on 11353 * return. 11354 */ 11355 .extern MterpCheckBefore 11356 REFRESH_IBASE 11357 movq rSELF, OUT_ARG0 11358 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11359 movq rPC, OUT_ARG2 11360 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11361 jmp .L_op_nop+(232*128) 11362 11363 /* ------------------------------ */ 11364 .balign 128 11365 .L_ALT_op_invoke_virtual_quick: /* 0xe9 */ 11366 /* File: x86_64/alt_stub.S */ 11367 /* 11368 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11369 * any interesting requests and then jump to the real instruction 11370 * handler. Unlike the Arm handler, we can't do this as a tail call 11371 * because rIBASE is caller save and we need to reload it. 11372 * 11373 * Note that unlike in the Arm implementation, we should never arrive 11374 * here with a zero breakFlag because we always refresh rIBASE on 11375 * return. 11376 */ 11377 .extern MterpCheckBefore 11378 REFRESH_IBASE 11379 movq rSELF, OUT_ARG0 11380 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11381 movq rPC, OUT_ARG2 11382 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11383 jmp .L_op_nop+(233*128) 11384 11385 /* ------------------------------ */ 11386 .balign 128 11387 .L_ALT_op_invoke_virtual_range_quick: /* 0xea */ 11388 /* File: x86_64/alt_stub.S */ 11389 /* 11390 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11391 * any interesting requests and then jump to the real instruction 11392 * handler. Unlike the Arm handler, we can't do this as a tail call 11393 * because rIBASE is caller save and we need to reload it. 11394 * 11395 * Note that unlike in the Arm implementation, we should never arrive 11396 * here with a zero breakFlag because we always refresh rIBASE on 11397 * return. 11398 */ 11399 .extern MterpCheckBefore 11400 REFRESH_IBASE 11401 movq rSELF, OUT_ARG0 11402 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11403 movq rPC, OUT_ARG2 11404 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11405 jmp .L_op_nop+(234*128) 11406 11407 /* ------------------------------ */ 11408 .balign 128 11409 .L_ALT_op_iput_boolean_quick: /* 0xeb */ 11410 /* File: x86_64/alt_stub.S */ 11411 /* 11412 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11413 * any interesting requests and then jump to the real instruction 11414 * handler. Unlike the Arm handler, we can't do this as a tail call 11415 * because rIBASE is caller save and we need to reload it. 11416 * 11417 * Note that unlike in the Arm implementation, we should never arrive 11418 * here with a zero breakFlag because we always refresh rIBASE on 11419 * return. 11420 */ 11421 .extern MterpCheckBefore 11422 REFRESH_IBASE 11423 movq rSELF, OUT_ARG0 11424 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11425 movq rPC, OUT_ARG2 11426 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11427 jmp .L_op_nop+(235*128) 11428 11429 /* ------------------------------ */ 11430 .balign 128 11431 .L_ALT_op_iput_byte_quick: /* 0xec */ 11432 /* File: x86_64/alt_stub.S */ 11433 /* 11434 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11435 * any interesting requests and then jump to the real instruction 11436 * handler. Unlike the Arm handler, we can't do this as a tail call 11437 * because rIBASE is caller save and we need to reload it. 11438 * 11439 * Note that unlike in the Arm implementation, we should never arrive 11440 * here with a zero breakFlag because we always refresh rIBASE on 11441 * return. 11442 */ 11443 .extern MterpCheckBefore 11444 REFRESH_IBASE 11445 movq rSELF, OUT_ARG0 11446 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11447 movq rPC, OUT_ARG2 11448 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11449 jmp .L_op_nop+(236*128) 11450 11451 /* ------------------------------ */ 11452 .balign 128 11453 .L_ALT_op_iput_char_quick: /* 0xed */ 11454 /* File: x86_64/alt_stub.S */ 11455 /* 11456 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11457 * any interesting requests and then jump to the real instruction 11458 * handler. Unlike the Arm handler, we can't do this as a tail call 11459 * because rIBASE is caller save and we need to reload it. 11460 * 11461 * Note that unlike in the Arm implementation, we should never arrive 11462 * here with a zero breakFlag because we always refresh rIBASE on 11463 * return. 11464 */ 11465 .extern MterpCheckBefore 11466 REFRESH_IBASE 11467 movq rSELF, OUT_ARG0 11468 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11469 movq rPC, OUT_ARG2 11470 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11471 jmp .L_op_nop+(237*128) 11472 11473 /* ------------------------------ */ 11474 .balign 128 11475 .L_ALT_op_iput_short_quick: /* 0xee */ 11476 /* File: x86_64/alt_stub.S */ 11477 /* 11478 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11479 * any interesting requests and then jump to the real instruction 11480 * handler. Unlike the Arm handler, we can't do this as a tail call 11481 * because rIBASE is caller save and we need to reload it. 11482 * 11483 * Note that unlike in the Arm implementation, we should never arrive 11484 * here with a zero breakFlag because we always refresh rIBASE on 11485 * return. 11486 */ 11487 .extern MterpCheckBefore 11488 REFRESH_IBASE 11489 movq rSELF, OUT_ARG0 11490 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11491 movq rPC, OUT_ARG2 11492 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11493 jmp .L_op_nop+(238*128) 11494 11495 /* ------------------------------ */ 11496 .balign 128 11497 .L_ALT_op_iget_boolean_quick: /* 0xef */ 11498 /* File: x86_64/alt_stub.S */ 11499 /* 11500 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11501 * any interesting requests and then jump to the real instruction 11502 * handler. Unlike the Arm handler, we can't do this as a tail call 11503 * because rIBASE is caller save and we need to reload it. 11504 * 11505 * Note that unlike in the Arm implementation, we should never arrive 11506 * here with a zero breakFlag because we always refresh rIBASE on 11507 * return. 11508 */ 11509 .extern MterpCheckBefore 11510 REFRESH_IBASE 11511 movq rSELF, OUT_ARG0 11512 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11513 movq rPC, OUT_ARG2 11514 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11515 jmp .L_op_nop+(239*128) 11516 11517 /* ------------------------------ */ 11518 .balign 128 11519 .L_ALT_op_iget_byte_quick: /* 0xf0 */ 11520 /* File: x86_64/alt_stub.S */ 11521 /* 11522 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11523 * any interesting requests and then jump to the real instruction 11524 * handler. Unlike the Arm handler, we can't do this as a tail call 11525 * because rIBASE is caller save and we need to reload it. 11526 * 11527 * Note that unlike in the Arm implementation, we should never arrive 11528 * here with a zero breakFlag because we always refresh rIBASE on 11529 * return. 11530 */ 11531 .extern MterpCheckBefore 11532 REFRESH_IBASE 11533 movq rSELF, OUT_ARG0 11534 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11535 movq rPC, OUT_ARG2 11536 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11537 jmp .L_op_nop+(240*128) 11538 11539 /* ------------------------------ */ 11540 .balign 128 11541 .L_ALT_op_iget_char_quick: /* 0xf1 */ 11542 /* File: x86_64/alt_stub.S */ 11543 /* 11544 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11545 * any interesting requests and then jump to the real instruction 11546 * handler. Unlike the Arm handler, we can't do this as a tail call 11547 * because rIBASE is caller save and we need to reload it. 11548 * 11549 * Note that unlike in the Arm implementation, we should never arrive 11550 * here with a zero breakFlag because we always refresh rIBASE on 11551 * return. 11552 */ 11553 .extern MterpCheckBefore 11554 REFRESH_IBASE 11555 movq rSELF, OUT_ARG0 11556 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11557 movq rPC, OUT_ARG2 11558 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11559 jmp .L_op_nop+(241*128) 11560 11561 /* ------------------------------ */ 11562 .balign 128 11563 .L_ALT_op_iget_short_quick: /* 0xf2 */ 11564 /* File: x86_64/alt_stub.S */ 11565 /* 11566 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11567 * any interesting requests and then jump to the real instruction 11568 * handler. Unlike the Arm handler, we can't do this as a tail call 11569 * because rIBASE is caller save and we need to reload it. 11570 * 11571 * Note that unlike in the Arm implementation, we should never arrive 11572 * here with a zero breakFlag because we always refresh rIBASE on 11573 * return. 11574 */ 11575 .extern MterpCheckBefore 11576 REFRESH_IBASE 11577 movq rSELF, OUT_ARG0 11578 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11579 movq rPC, OUT_ARG2 11580 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11581 jmp .L_op_nop+(242*128) 11582 11583 /* ------------------------------ */ 11584 .balign 128 11585 .L_ALT_op_unused_f3: /* 0xf3 */ 11586 /* File: x86_64/alt_stub.S */ 11587 /* 11588 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11589 * any interesting requests and then jump to the real instruction 11590 * handler. Unlike the Arm handler, we can't do this as a tail call 11591 * because rIBASE is caller save and we need to reload it. 11592 * 11593 * Note that unlike in the Arm implementation, we should never arrive 11594 * here with a zero breakFlag because we always refresh rIBASE on 11595 * return. 11596 */ 11597 .extern MterpCheckBefore 11598 REFRESH_IBASE 11599 movq rSELF, OUT_ARG0 11600 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11601 movq rPC, OUT_ARG2 11602 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11603 jmp .L_op_nop+(243*128) 11604 11605 /* ------------------------------ */ 11606 .balign 128 11607 .L_ALT_op_unused_f4: /* 0xf4 */ 11608 /* File: x86_64/alt_stub.S */ 11609 /* 11610 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11611 * any interesting requests and then jump to the real instruction 11612 * handler. Unlike the Arm handler, we can't do this as a tail call 11613 * because rIBASE is caller save and we need to reload it. 11614 * 11615 * Note that unlike in the Arm implementation, we should never arrive 11616 * here with a zero breakFlag because we always refresh rIBASE on 11617 * return. 11618 */ 11619 .extern MterpCheckBefore 11620 REFRESH_IBASE 11621 movq rSELF, OUT_ARG0 11622 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11623 movq rPC, OUT_ARG2 11624 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11625 jmp .L_op_nop+(244*128) 11626 11627 /* ------------------------------ */ 11628 .balign 128 11629 .L_ALT_op_unused_f5: /* 0xf5 */ 11630 /* File: x86_64/alt_stub.S */ 11631 /* 11632 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11633 * any interesting requests and then jump to the real instruction 11634 * handler. Unlike the Arm handler, we can't do this as a tail call 11635 * because rIBASE is caller save and we need to reload it. 11636 * 11637 * Note that unlike in the Arm implementation, we should never arrive 11638 * here with a zero breakFlag because we always refresh rIBASE on 11639 * return. 11640 */ 11641 .extern MterpCheckBefore 11642 REFRESH_IBASE 11643 movq rSELF, OUT_ARG0 11644 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11645 movq rPC, OUT_ARG2 11646 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11647 jmp .L_op_nop+(245*128) 11648 11649 /* ------------------------------ */ 11650 .balign 128 11651 .L_ALT_op_unused_f6: /* 0xf6 */ 11652 /* File: x86_64/alt_stub.S */ 11653 /* 11654 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11655 * any interesting requests and then jump to the real instruction 11656 * handler. Unlike the Arm handler, we can't do this as a tail call 11657 * because rIBASE is caller save and we need to reload it. 11658 * 11659 * Note that unlike in the Arm implementation, we should never arrive 11660 * here with a zero breakFlag because we always refresh rIBASE on 11661 * return. 11662 */ 11663 .extern MterpCheckBefore 11664 REFRESH_IBASE 11665 movq rSELF, OUT_ARG0 11666 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11667 movq rPC, OUT_ARG2 11668 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11669 jmp .L_op_nop+(246*128) 11670 11671 /* ------------------------------ */ 11672 .balign 128 11673 .L_ALT_op_unused_f7: /* 0xf7 */ 11674 /* File: x86_64/alt_stub.S */ 11675 /* 11676 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11677 * any interesting requests and then jump to the real instruction 11678 * handler. Unlike the Arm handler, we can't do this as a tail call 11679 * because rIBASE is caller save and we need to reload it. 11680 * 11681 * Note that unlike in the Arm implementation, we should never arrive 11682 * here with a zero breakFlag because we always refresh rIBASE on 11683 * return. 11684 */ 11685 .extern MterpCheckBefore 11686 REFRESH_IBASE 11687 movq rSELF, OUT_ARG0 11688 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11689 movq rPC, OUT_ARG2 11690 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11691 jmp .L_op_nop+(247*128) 11692 11693 /* ------------------------------ */ 11694 .balign 128 11695 .L_ALT_op_unused_f8: /* 0xf8 */ 11696 /* File: x86_64/alt_stub.S */ 11697 /* 11698 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11699 * any interesting requests and then jump to the real instruction 11700 * handler. Unlike the Arm handler, we can't do this as a tail call 11701 * because rIBASE is caller save and we need to reload it. 11702 * 11703 * Note that unlike in the Arm implementation, we should never arrive 11704 * here with a zero breakFlag because we always refresh rIBASE on 11705 * return. 11706 */ 11707 .extern MterpCheckBefore 11708 REFRESH_IBASE 11709 movq rSELF, OUT_ARG0 11710 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11711 movq rPC, OUT_ARG2 11712 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11713 jmp .L_op_nop+(248*128) 11714 11715 /* ------------------------------ */ 11716 .balign 128 11717 .L_ALT_op_unused_f9: /* 0xf9 */ 11718 /* File: x86_64/alt_stub.S */ 11719 /* 11720 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11721 * any interesting requests and then jump to the real instruction 11722 * handler. Unlike the Arm handler, we can't do this as a tail call 11723 * because rIBASE is caller save and we need to reload it. 11724 * 11725 * Note that unlike in the Arm implementation, we should never arrive 11726 * here with a zero breakFlag because we always refresh rIBASE on 11727 * return. 11728 */ 11729 .extern MterpCheckBefore 11730 REFRESH_IBASE 11731 movq rSELF, OUT_ARG0 11732 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11733 movq rPC, OUT_ARG2 11734 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11735 jmp .L_op_nop+(249*128) 11736 11737 /* ------------------------------ */ 11738 .balign 128 11739 .L_ALT_op_invoke_polymorphic: /* 0xfa */ 11740 /* File: x86_64/alt_stub.S */ 11741 /* 11742 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11743 * any interesting requests and then jump to the real instruction 11744 * handler. Unlike the Arm handler, we can't do this as a tail call 11745 * because rIBASE is caller save and we need to reload it. 11746 * 11747 * Note that unlike in the Arm implementation, we should never arrive 11748 * here with a zero breakFlag because we always refresh rIBASE on 11749 * return. 11750 */ 11751 .extern MterpCheckBefore 11752 REFRESH_IBASE 11753 movq rSELF, OUT_ARG0 11754 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11755 movq rPC, OUT_ARG2 11756 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11757 jmp .L_op_nop+(250*128) 11758 11759 /* ------------------------------ */ 11760 .balign 128 11761 .L_ALT_op_invoke_polymorphic_range: /* 0xfb */ 11762 /* File: x86_64/alt_stub.S */ 11763 /* 11764 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11765 * any interesting requests and then jump to the real instruction 11766 * handler. Unlike the Arm handler, we can't do this as a tail call 11767 * because rIBASE is caller save and we need to reload it. 11768 * 11769 * Note that unlike in the Arm implementation, we should never arrive 11770 * here with a zero breakFlag because we always refresh rIBASE on 11771 * return. 11772 */ 11773 .extern MterpCheckBefore 11774 REFRESH_IBASE 11775 movq rSELF, OUT_ARG0 11776 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11777 movq rPC, OUT_ARG2 11778 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11779 jmp .L_op_nop+(251*128) 11780 11781 /* ------------------------------ */ 11782 .balign 128 11783 .L_ALT_op_invoke_custom: /* 0xfc */ 11784 /* File: x86_64/alt_stub.S */ 11785 /* 11786 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11787 * any interesting requests and then jump to the real instruction 11788 * handler. Unlike the Arm handler, we can't do this as a tail call 11789 * because rIBASE is caller save and we need to reload it. 11790 * 11791 * Note that unlike in the Arm implementation, we should never arrive 11792 * here with a zero breakFlag because we always refresh rIBASE on 11793 * return. 11794 */ 11795 .extern MterpCheckBefore 11796 REFRESH_IBASE 11797 movq rSELF, OUT_ARG0 11798 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11799 movq rPC, OUT_ARG2 11800 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11801 jmp .L_op_nop+(252*128) 11802 11803 /* ------------------------------ */ 11804 .balign 128 11805 .L_ALT_op_invoke_custom_range: /* 0xfd */ 11806 /* File: x86_64/alt_stub.S */ 11807 /* 11808 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11809 * any interesting requests and then jump to the real instruction 11810 * handler. Unlike the Arm handler, we can't do this as a tail call 11811 * because rIBASE is caller save and we need to reload it. 11812 * 11813 * Note that unlike in the Arm implementation, we should never arrive 11814 * here with a zero breakFlag because we always refresh rIBASE on 11815 * return. 11816 */ 11817 .extern MterpCheckBefore 11818 REFRESH_IBASE 11819 movq rSELF, OUT_ARG0 11820 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11821 movq rPC, OUT_ARG2 11822 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11823 jmp .L_op_nop+(253*128) 11824 11825 /* ------------------------------ */ 11826 .balign 128 11827 .L_ALT_op_const_method_handle: /* 0xfe */ 11828 /* File: x86_64/alt_stub.S */ 11829 /* 11830 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11831 * any interesting requests and then jump to the real instruction 11832 * handler. Unlike the Arm handler, we can't do this as a tail call 11833 * because rIBASE is caller save and we need to reload it. 11834 * 11835 * Note that unlike in the Arm implementation, we should never arrive 11836 * here with a zero breakFlag because we always refresh rIBASE on 11837 * return. 11838 */ 11839 .extern MterpCheckBefore 11840 REFRESH_IBASE 11841 movq rSELF, OUT_ARG0 11842 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11843 movq rPC, OUT_ARG2 11844 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11845 jmp .L_op_nop+(254*128) 11846 11847 /* ------------------------------ */ 11848 .balign 128 11849 .L_ALT_op_const_method_type: /* 0xff */ 11850 /* File: x86_64/alt_stub.S */ 11851 /* 11852 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11853 * any interesting requests and then jump to the real instruction 11854 * handler. Unlike the Arm handler, we can't do this as a tail call 11855 * because rIBASE is caller save and we need to reload it. 11856 * 11857 * Note that unlike in the Arm implementation, we should never arrive 11858 * here with a zero breakFlag because we always refresh rIBASE on 11859 * return. 11860 */ 11861 .extern MterpCheckBefore 11862 REFRESH_IBASE 11863 movq rSELF, OUT_ARG0 11864 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11865 movq rPC, OUT_ARG2 11866 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11867 jmp .L_op_nop+(255*128) 11868 11869 .balign 128 11870 .global SYMBOL(artMterpAsmAltInstructionEnd) 11871 SYMBOL(artMterpAsmAltInstructionEnd): 11872 /* File: x86_64/footer.S */ 11873 /* 11874 * =========================================================================== 11875 * Common subroutines and data 11876 * =========================================================================== 11877 */ 11878 11879 .text 11880 .align 2 11881 11882 /* 11883 * We've detected a condition that will result in an exception, but the exception 11884 * has not yet been thrown. Just bail out to the reference interpreter to deal with it. 11885 * TUNING: for consistency, we may want to just go ahead and handle these here. 11886 */ 11887 common_errDivideByZero: 11888 EXPORT_PC 11889 #if MTERP_LOGGING 11890 movq rSELF, OUT_ARG0 11891 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11892 call SYMBOL(MterpLogDivideByZeroException) 11893 #endif 11894 jmp MterpCommonFallback 11895 11896 common_errArrayIndex: 11897 EXPORT_PC 11898 #if MTERP_LOGGING 11899 movq rSELF, OUT_ARG0 11900 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11901 call SYMBOL(MterpLogArrayIndexException) 11902 #endif 11903 jmp MterpCommonFallback 11904 11905 common_errNegativeArraySize: 11906 EXPORT_PC 11907 #if MTERP_LOGGING 11908 movq rSELF, OUT_ARG0 11909 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11910 call SYMBOL(MterpLogNegativeArraySizeException) 11911 #endif 11912 jmp MterpCommonFallback 11913 11914 common_errNoSuchMethod: 11915 EXPORT_PC 11916 #if MTERP_LOGGING 11917 movq rSELF, OUT_ARG0 11918 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11919 call SYMBOL(MterpLogNoSuchMethodException) 11920 #endif 11921 jmp MterpCommonFallback 11922 11923 common_errNullObject: 11924 EXPORT_PC 11925 #if MTERP_LOGGING 11926 movq rSELF, OUT_ARG0 11927 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11928 call SYMBOL(MterpLogNullObjectException) 11929 #endif 11930 jmp MterpCommonFallback 11931 11932 common_exceptionThrown: 11933 EXPORT_PC 11934 #if MTERP_LOGGING 11935 movq rSELF, OUT_ARG0 11936 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11937 call SYMBOL(MterpLogExceptionThrownException) 11938 #endif 11939 jmp MterpCommonFallback 11940 11941 MterpSuspendFallback: 11942 EXPORT_PC 11943 #if MTERP_LOGGING 11944 movq rSELF, OUT_ARG0 11945 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11946 movl THREAD_FLAGS_OFFSET(OUT_ARG0), OUT_32_ARG2 11947 call SYMBOL(MterpLogSuspendFallback) 11948 #endif 11949 jmp MterpCommonFallback 11950 11951 /* 11952 * If we're here, something is out of the ordinary. If there is a pending 11953 * exception, handle it. Otherwise, roll back and retry with the reference 11954 * interpreter. 11955 */ 11956 MterpPossibleException: 11957 movq rSELF, %rcx 11958 cmpq $0, THREAD_EXCEPTION_OFFSET(%rcx) 11959 jz MterpFallback 11960 /* intentional fallthrough - handle pending exception. */ 11961 11962 /* 11963 * On return from a runtime helper routine, we've found a pending exception. 11964 * Can we handle it here - or need to bail out to caller? 11965 * 11966 */ 11967 MterpException: 11968 movq rSELF, OUT_ARG0 11969 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 11970 call SYMBOL(MterpHandleException) 11971 testb %al, %al 11972 jz MterpExceptionReturn 11973 movq OFF_FP_DEX_INSTRUCTIONS(rFP), %rax 11974 mov OFF_FP_DEX_PC(rFP), %ecx 11975 leaq (%rax, %rcx, 2), rPC 11976 movq rPC, OFF_FP_DEX_PC_PTR(rFP) 11977 /* Do we need to switch interpreters? */ 11978 call SYMBOL(MterpShouldSwitchInterpreters) 11979 testb %al, %al 11980 jnz MterpFallback 11981 /* resume execution at catch block */ 11982 REFRESH_IBASE 11983 FETCH_INST 11984 GOTO_NEXT 11985 /* NOTE: no fallthrough */ 11986 11987 /* 11988 * Common handling for branches with support for Jit profiling. 11989 * On entry: 11990 * rINST <= signed offset 11991 * rPROFILE <= signed hotness countdown (expanded to 32 bits) 11992 * condition bits <= set to establish sign of offset (use "NoFlags" entry if not) 11993 * 11994 * We have quite a few different cases for branch profiling, OSR detection and 11995 * suspend check support here. 11996 * 11997 * Taken backward branches: 11998 * If profiling active, do hotness countdown and report if we hit zero. 11999 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so. 12000 * Is there a pending suspend request? If so, suspend. 12001 * 12002 * Taken forward branches and not-taken backward branches: 12003 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so. 12004 * 12005 * Our most common case is expected to be a taken backward branch with active jit profiling, 12006 * but no full OSR check and no pending suspend request. 12007 * Next most common case is not-taken branch with no full OSR check. 12008 * 12009 */ 12010 MterpCommonTakenBranch: 12011 jg .L_forward_branch # don't add forward branches to hotness 12012 /* 12013 * We need to subtract 1 from positive values and we should not see 0 here, 12014 * so we may use the result of the comparison with -1. 12015 */ 12016 #if JIT_CHECK_OSR != -1 12017 # error "JIT_CHECK_OSR must be -1." 12018 #endif 12019 cmpl $JIT_CHECK_OSR, rPROFILE 12020 je .L_osr_check 12021 decl rPROFILE 12022 je .L_add_batch # counted down to zero - report 12023 .L_resume_backward_branch: 12024 movq rSELF, %rax 12025 testl $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%rax) 12026 REFRESH_IBASE_REG %rax 12027 leaq (rPC, rINSTq, 2), rPC 12028 FETCH_INST 12029 jnz .L_suspend_request_pending 12030 GOTO_NEXT 12031 12032 .L_suspend_request_pending: 12033 EXPORT_PC 12034 movq rSELF, OUT_ARG0 12035 call SYMBOL(MterpSuspendCheck) # (self) 12036 testb %al, %al 12037 jnz MterpFallback 12038 REFRESH_IBASE # might have changed during suspend 12039 GOTO_NEXT 12040 12041 .L_no_count_backwards: 12042 cmpl $JIT_CHECK_OSR, rPROFILE # possible OSR re-entry? 12043 jne .L_resume_backward_branch 12044 .L_osr_check: 12045 EXPORT_PC 12046 movq rSELF, OUT_ARG0 12047 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 12048 movq rINSTq, OUT_ARG2 12049 call SYMBOL(MterpMaybeDoOnStackReplacement) # (self, shadow_frame, offset) 12050 testb %al, %al 12051 jz .L_resume_backward_branch 12052 jmp MterpOnStackReplacement 12053 12054 .L_forward_branch: 12055 cmpl $JIT_CHECK_OSR, rPROFILE # possible OSR re-entry? 12056 je .L_check_osr_forward 12057 .L_resume_forward_branch: 12058 leaq (rPC, rINSTq, 2), rPC 12059 FETCH_INST 12060 GOTO_NEXT 12061 12062 .L_check_osr_forward: 12063 EXPORT_PC 12064 movq rSELF, OUT_ARG0 12065 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 12066 movq rINSTq, OUT_ARG2 12067 call SYMBOL(MterpMaybeDoOnStackReplacement) # (self, shadow_frame, offset) 12068 testb %al, %al 12069 jz .L_resume_forward_branch 12070 jmp MterpOnStackReplacement 12071 12072 .L_add_batch: 12073 movl rPROFILE, %eax 12074 movq OFF_FP_METHOD(rFP), OUT_ARG0 12075 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 12076 movw %ax, OFF_FP_COUNTDOWN_OFFSET(rFP) 12077 movq rSELF, OUT_ARG2 12078 call SYMBOL(MterpAddHotnessBatch) # (method, shadow_frame, self) 12079 movswl %ax, rPROFILE 12080 jmp .L_no_count_backwards 12081 12082 /* 12083 * Entered from the conditional branch handlers when OSR check request active on 12084 * not-taken path. All Dalvik not-taken conditional branch offsets are 2. 12085 */ 12086 .L_check_not_taken_osr: 12087 EXPORT_PC 12088 movq rSELF, OUT_ARG0 12089 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 12090 movl $2, OUT_32_ARG2 12091 call SYMBOL(MterpMaybeDoOnStackReplacement) # (self, shadow_frame, offset) 12092 testb %al, %al 12093 jnz MterpOnStackReplacement 12094 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 12095 12096 /* 12097 * On-stack replacement has happened, and now we've returned from the compiled method. 12098 */ 12099 MterpOnStackReplacement: 12100 #if MTERP_LOGGING 12101 movq rSELF, OUT_ARG0 12102 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 12103 movl rINST, OUT_32_ARG2 12104 call SYMBOL(MterpLogOSR) 12105 #endif 12106 movl $1, %eax 12107 jmp MterpDone 12108 12109 /* 12110 * Bail out to reference interpreter. 12111 */ 12112 MterpFallback: 12113 EXPORT_PC 12114 #if MTERP_LOGGING 12115 movq rSELF, OUT_ARG0 12116 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 12117 call SYMBOL(MterpLogFallback) 12118 #endif 12119 MterpCommonFallback: 12120 xorl %eax, %eax 12121 jmp MterpDone 12122 12123 /* 12124 * On entry: 12125 * uint32_t* rFP (should still be live, pointer to base of vregs) 12126 */ 12127 MterpExceptionReturn: 12128 movl $1, %eax 12129 jmp MterpDone 12130 MterpReturn: 12131 movq OFF_FP_RESULT_REGISTER(rFP), %rdx 12132 movq %rax, (%rdx) 12133 movl $1, %eax 12134 MterpDone: 12135 /* 12136 * At this point, we expect rPROFILE to be non-zero. If negative, hotness is disabled or we're 12137 * checking for OSR. If greater than zero, we might have unreported hotness to register 12138 * (the difference between the ending rPROFILE and the cached hotness counter). rPROFILE 12139 * should only reach zero immediately after a hotness decrement, and is then reset to either 12140 * a negative special state or the new non-zero countdown value. 12141 */ 12142 testl rPROFILE, rPROFILE 12143 jle MRestoreFrame # if > 0, we may have some counts to report. 12144 12145 movl %eax, rINST # stash return value 12146 /* Report cached hotness counts */ 12147 movl rPROFILE, %eax 12148 movq OFF_FP_METHOD(rFP), OUT_ARG0 12149 leaq OFF_FP_SHADOWFRAME(rFP), OUT_ARG1 12150 movw %ax, OFF_FP_COUNTDOWN_OFFSET(rFP) 12151 movq rSELF, OUT_ARG2 12152 call SYMBOL(MterpAddHotnessBatch) # (method, shadow_frame, self) 12153 movl rINST, %eax # restore return value 12154 12155 /* pop up frame */ 12156 MRestoreFrame: 12157 addq $FRAME_SIZE, %rsp 12158 .cfi_adjust_cfa_offset -FRAME_SIZE 12159 12160 /* Restore callee save register */ 12161 POP %r15 12162 POP %r14 12163 POP %r13 12164 POP %r12 12165 POP %rbp 12166 POP %rbx 12167 ret 12168 .cfi_endproc 12169 SIZE(ExecuteMterpImpl,ExecuteMterpImpl) 12170 12171