1 /* 2 * This file was generated automatically by gen-mterp.py for 'x86'. 3 * 4 * --> DO NOT EDIT <-- 5 */ 6 7 /* File: x86/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 ABI general notes: 43 44 Caller save set: 45 eax, edx, ecx, st(0)-st(7) 46 Callee save set: 47 ebx, esi, edi, ebp 48 Return regs: 49 32-bit in eax 50 64-bit in edx:eax (low-order 32 in eax) 51 fp on top of fp stack st(0) 52 53 Parameters passed on stack, pushed right-to-left. On entry to target, first 54 parm is at 4(%esp). Traditional entry code is: 55 56 functEntry: 57 push %ebp # save old frame pointer 58 mov %ebp,%esp # establish new frame pointer 59 sub FrameSize,%esp # Allocate storage for spill, locals & outs 60 61 Once past the prologue, arguments are referenced at ((argno + 2)*4)(%ebp) 62 63 Stack must be 16-byte aligned to support SSE in native code. 64 65 If we're not doing variable stack allocation (alloca), the frame pointer can be 66 eliminated and all arg references adjusted to be esp relative. 67 */ 68 69 /* 70 Mterp and x86 notes: 71 72 Some key interpreter variables will be assigned to registers. 73 74 nick reg purpose 75 rPC esi interpreted program counter, used for fetching instructions 76 rFP edi interpreted frame pointer, used for accessing locals and args 77 rINSTw bx first 16-bit code of current instruction 78 rINSTbl bl opcode portion of instruction word 79 rINSTbh bh high byte of inst word, usually contains src/tgt reg names 80 rIBASE edx base of instruction handler table 81 rREFS ebp base of object references in shadow frame. 82 83 Notes: 84 o High order 16 bits of ebx must be zero on entry to handler 85 o rPC, rFP, rINSTw/rINSTbl valid on handler entry and exit 86 o eax and ecx are scratch, rINSTw/ebx sometimes scratch 87 88 Macros are provided for common operations. Each macro MUST emit only 89 one instruction to make instruction-counting easier. They MUST NOT alter 90 unspecified registers or condition codes. 91 */ 92 93 /* 94 * This is a #include, not a %include, because we want the C pre-processor 95 * to expand the macros into assembler assignment statements. 96 */ 97 #include "asm_support.h" 98 99 /* 100 * Handle mac compiler specific 101 */ 102 #if defined(__APPLE__) 103 #define MACRO_LITERAL(value) $(value) 104 #define FUNCTION_TYPE(name) 105 #define SIZE(start,end) 106 // Mac OS' symbols have an _ prefix. 107 #define SYMBOL(name) _ ## name 108 #else 109 #define MACRO_LITERAL(value) $value 110 #define FUNCTION_TYPE(name) .type name, @function 111 #define SIZE(start,end) .size start, .-end 112 #define SYMBOL(name) name 113 #endif 114 115 .macro PUSH _reg 116 pushl \_reg 117 .cfi_adjust_cfa_offset 4 118 .cfi_rel_offset \_reg, 0 119 .endm 120 121 .macro POP _reg 122 popl \_reg 123 .cfi_adjust_cfa_offset -4 124 .cfi_restore \_reg 125 .endm 126 127 /* 128 * Instead of holding a pointer to the shadow frame, we keep rFP at the base of the vregs. So, 129 * to access other shadow frame fields, we need to use a backwards offset. Define those here. 130 */ 131 #define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET) 132 #define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET) 133 #define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET) 134 #define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET) 135 #define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET) 136 #define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET) 137 #define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET) 138 #define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET) 139 #define OFF_FP_COUNTDOWN_OFFSET OFF_FP(SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET) 140 #define OFF_FP_SHADOWFRAME OFF_FP(0) 141 142 /* Frame size must be 16-byte aligned. 143 * Remember about 4 bytes for return address + 4 * 4 for spills 144 */ 145 #define FRAME_SIZE 28 146 147 /* Frame diagram while executing ExecuteMterpImpl, high to low addresses */ 148 #define IN_ARG3 (FRAME_SIZE + 16 + 16) 149 #define IN_ARG2 (FRAME_SIZE + 16 + 12) 150 #define IN_ARG1 (FRAME_SIZE + 16 + 8) 151 #define IN_ARG0 (FRAME_SIZE + 16 + 4) 152 /* Spill offsets relative to %esp */ 153 #define LOCAL0 (FRAME_SIZE - 4) 154 #define LOCAL1 (FRAME_SIZE - 8) 155 #define LOCAL2 (FRAME_SIZE - 12) 156 /* Out Arg offsets, relative to %esp */ 157 #define OUT_ARG3 ( 12) 158 #define OUT_ARG2 ( 8) 159 #define OUT_ARG1 ( 4) 160 #define OUT_ARG0 ( 0) /* <- ExecuteMterpImpl esp + 0 */ 161 162 /* During bringup, we'll use the shadow frame model instead of rFP */ 163 /* single-purpose registers, given names for clarity */ 164 #define rSELF IN_ARG0(%esp) 165 #define rPC %esi 166 #define rFP %edi 167 #define rINST %ebx 168 #define rINSTw %bx 169 #define rINSTbh %bh 170 #define rINSTbl %bl 171 #define rIBASE %edx 172 #define rREFS %ebp 173 #define rPROFILE OFF_FP_COUNTDOWN_OFFSET(rFP) 174 175 #define MTERP_LOGGING 0 176 177 /* 178 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects. Must 179 * be done *before* something throws. 180 * 181 * It's okay to do this more than once. 182 * 183 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped 184 * dex byte codes. However, the rest of the runtime expects dex pc to be an instruction 185 * offset into the code_items_[] array. For effiency, we will "export" the 186 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC 187 * to convert to a dex pc when needed. 188 */ 189 .macro EXPORT_PC 190 movl rPC, OFF_FP_DEX_PC_PTR(rFP) 191 .endm 192 193 /* 194 * Refresh handler table. 195 */ 196 .macro REFRESH_IBASE 197 movl rSELF, rIBASE 198 movl THREAD_CURRENT_IBASE_OFFSET(rIBASE), rIBASE 199 .endm 200 201 /* 202 * Refresh handler table. 203 * IBase handles uses the caller save register so we must restore it after each call. 204 * Also it is used as a result of some 64-bit operations (like imul) and we should 205 * restore it in such cases also. 206 * 207 * TODO: Consider spilling the IBase instead of restoring it from Thread structure. 208 */ 209 .macro RESTORE_IBASE 210 movl rSELF, rIBASE 211 movl THREAD_CURRENT_IBASE_OFFSET(rIBASE), rIBASE 212 .endm 213 214 /* 215 * If rSELF is already loaded then we can use it from known reg. 216 */ 217 .macro RESTORE_IBASE_FROM_SELF _reg 218 movl THREAD_CURRENT_IBASE_OFFSET(\_reg), rIBASE 219 .endm 220 221 /* 222 * Refresh rINST. 223 * At enter to handler rINST does not contain the opcode number. 224 * However some utilities require the full value, so this macro 225 * restores the opcode number. 226 */ 227 .macro REFRESH_INST _opnum 228 movb rINSTbl, rINSTbh 229 movb MACRO_LITERAL(\_opnum), rINSTbl 230 .endm 231 232 /* 233 * Fetch the next instruction from rPC into rINSTw. Does not advance rPC. 234 */ 235 .macro FETCH_INST 236 movzwl (rPC), rINST 237 .endm 238 239 /* 240 * Remove opcode from rINST, compute the address of handler and jump to it. 241 */ 242 .macro GOTO_NEXT 243 movzx rINSTbl,%eax 244 movzbl rINSTbh,rINST 245 shll MACRO_LITERAL(7), %eax 246 addl rIBASE, %eax 247 jmp *%eax 248 .endm 249 250 /* 251 * Advance rPC by instruction count. 252 */ 253 .macro ADVANCE_PC _count 254 leal 2*\_count(rPC), rPC 255 .endm 256 257 /* 258 * Advance rPC by instruction count, fetch instruction and jump to handler. 259 */ 260 .macro ADVANCE_PC_FETCH_AND_GOTO_NEXT _count 261 ADVANCE_PC \_count 262 FETCH_INST 263 GOTO_NEXT 264 .endm 265 266 /* 267 * Get/set the 32-bit value from a Dalvik register. 268 */ 269 #define VREG_ADDRESS(_vreg) (rFP,_vreg,4) 270 #define VREG_HIGH_ADDRESS(_vreg) 4(rFP,_vreg,4) 271 #define VREG_REF_ADDRESS(_vreg) (rREFS,_vreg,4) 272 #define VREG_REF_HIGH_ADDRESS(_vreg) 4(rREFS,_vreg,4) 273 274 .macro GET_VREG _reg _vreg 275 movl (rFP,\_vreg,4), \_reg 276 .endm 277 278 /* Read wide value to xmm. */ 279 .macro GET_WIDE_FP_VREG _reg _vreg 280 movq (rFP,\_vreg,4), \_reg 281 .endm 282 283 .macro SET_VREG _reg _vreg 284 movl \_reg, (rFP,\_vreg,4) 285 movl MACRO_LITERAL(0), (rREFS,\_vreg,4) 286 .endm 287 288 /* Write wide value from xmm. xmm is clobbered. */ 289 .macro SET_WIDE_FP_VREG _reg _vreg 290 movq \_reg, (rFP,\_vreg,4) 291 pxor \_reg, \_reg 292 movq \_reg, (rREFS,\_vreg,4) 293 .endm 294 295 .macro SET_VREG_OBJECT _reg _vreg 296 movl \_reg, (rFP,\_vreg,4) 297 movl \_reg, (rREFS,\_vreg,4) 298 .endm 299 300 .macro GET_VREG_HIGH _reg _vreg 301 movl 4(rFP,\_vreg,4), \_reg 302 .endm 303 304 .macro SET_VREG_HIGH _reg _vreg 305 movl \_reg, 4(rFP,\_vreg,4) 306 movl MACRO_LITERAL(0), 4(rREFS,\_vreg,4) 307 .endm 308 309 .macro CLEAR_REF _vreg 310 movl MACRO_LITERAL(0), (rREFS,\_vreg,4) 311 .endm 312 313 .macro CLEAR_WIDE_REF _vreg 314 movl MACRO_LITERAL(0), (rREFS,\_vreg,4) 315 movl MACRO_LITERAL(0), 4(rREFS,\_vreg,4) 316 .endm 317 318 /* File: x86/entry.S */ 319 /* 320 * Copyright (C) 2016 The Android Open Source Project 321 * 322 * Licensed under the Apache License, Version 2.0 (the "License"); 323 * you may not use this file except in compliance with the License. 324 * You may obtain a copy of the License at 325 * 326 * http://www.apache.org/licenses/LICENSE-2.0 327 * 328 * Unless required by applicable law or agreed to in writing, software 329 * distributed under the License is distributed on an "AS IS" BASIS, 330 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 331 * See the License for the specific language governing permissions and 332 * limitations under the License. 333 */ 334 /* 335 * Interpreter entry point. 336 */ 337 338 .text 339 .global SYMBOL(ExecuteMterpImpl) 340 FUNCTION_TYPE(ExecuteMterpImpl) 341 342 /* 343 * On entry: 344 * 0 Thread* self 345 * 1 code_item 346 * 2 ShadowFrame 347 * 3 JValue* result_register 348 * 349 */ 350 351 SYMBOL(ExecuteMterpImpl): 352 .cfi_startproc 353 .cfi_def_cfa esp, 4 354 355 /* Spill callee save regs */ 356 PUSH %ebp 357 PUSH %edi 358 PUSH %esi 359 PUSH %ebx 360 361 /* Allocate frame */ 362 subl $FRAME_SIZE, %esp 363 .cfi_adjust_cfa_offset FRAME_SIZE 364 365 /* Load ShadowFrame pointer */ 366 movl IN_ARG2(%esp), %edx 367 368 /* Remember the return register */ 369 movl IN_ARG3(%esp), %eax 370 movl %eax, SHADOWFRAME_RESULT_REGISTER_OFFSET(%edx) 371 372 /* Remember the code_item */ 373 movl IN_ARG1(%esp), %ecx 374 movl %ecx, SHADOWFRAME_CODE_ITEM_OFFSET(%edx) 375 376 /* set up "named" registers */ 377 movl SHADOWFRAME_NUMBER_OF_VREGS_OFFSET(%edx), %eax 378 leal SHADOWFRAME_VREGS_OFFSET(%edx), rFP 379 leal (rFP, %eax, 4), rREFS 380 movl SHADOWFRAME_DEX_PC_OFFSET(%edx), %eax 381 lea CODEITEM_INSNS_OFFSET(%ecx), rPC 382 lea (rPC, %eax, 2), rPC 383 EXPORT_PC 384 385 /* Set up for backwards branches & osr profiling */ 386 movl OFF_FP_METHOD(rFP), %eax 387 movl %eax, OUT_ARG0(%esp) 388 leal OFF_FP_SHADOWFRAME(rFP), %ecx 389 movl %ecx, OUT_ARG1(%esp) 390 call SYMBOL(MterpSetUpHotnessCountdown) 391 392 /* Starting ibase */ 393 REFRESH_IBASE 394 395 /* start executing the instruction at rPC */ 396 FETCH_INST 397 GOTO_NEXT 398 /* NOTE: no fallthrough */ 399 400 401 .global SYMBOL(artMterpAsmInstructionStart) 402 FUNCTION_TYPE(SYMBOL(artMterpAsmInstructionStart)) 403 SYMBOL(artMterpAsmInstructionStart) = .L_op_nop 404 .text 405 406 /* ------------------------------ */ 407 .balign 128 408 .L_op_nop: /* 0x00 */ 409 /* File: x86/op_nop.S */ 410 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 411 412 /* ------------------------------ */ 413 .balign 128 414 .L_op_move: /* 0x01 */ 415 /* File: x86/op_move.S */ 416 /* for move, move-object, long-to-int */ 417 /* op vA, vB */ 418 movzbl rINSTbl, %eax # eax <- BA 419 andb $0xf, %al # eax <- A 420 shrl $4, rINST # rINST <- B 421 GET_VREG rINST, rINST 422 .if 0 423 SET_VREG_OBJECT rINST, %eax # fp[A] <- fp[B] 424 .else 425 SET_VREG rINST, %eax # fp[A] <- fp[B] 426 .endif 427 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 428 429 /* ------------------------------ */ 430 .balign 128 431 .L_op_move_from16: /* 0x02 */ 432 /* File: x86/op_move_from16.S */ 433 /* for: move/from16, move-object/from16 */ 434 /* op vAA, vBBBB */ 435 movzx rINSTbl, %eax # eax <- AA 436 movw 2(rPC), rINSTw # rINSTw <- BBBB 437 GET_VREG rINST, rINST # rINST <- fp[BBBB] 438 .if 0 439 SET_VREG_OBJECT rINST, %eax # fp[A] <- fp[B] 440 .else 441 SET_VREG rINST, %eax # fp[A] <- fp[B] 442 .endif 443 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 444 445 /* ------------------------------ */ 446 .balign 128 447 .L_op_move_16: /* 0x03 */ 448 /* File: x86/op_move_16.S */ 449 /* for: move/16, move-object/16 */ 450 /* op vAAAA, vBBBB */ 451 movzwl 4(rPC), %ecx # ecx <- BBBB 452 movzwl 2(rPC), %eax # eax <- AAAA 453 GET_VREG rINST, %ecx 454 .if 0 455 SET_VREG_OBJECT rINST, %eax # fp[A] <- fp[B] 456 .else 457 SET_VREG rINST, %eax # fp[A] <- fp[B] 458 .endif 459 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 460 461 /* ------------------------------ */ 462 .balign 128 463 .L_op_move_wide: /* 0x04 */ 464 /* File: x86/op_move_wide.S */ 465 /* move-wide vA, vB */ 466 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 467 movzbl rINSTbl, %ecx # ecx <- BA 468 sarl $4, rINST # rINST <- B 469 andb $0xf, %cl # ecx <- A 470 GET_WIDE_FP_VREG %xmm0, rINST # xmm0 <- v[B] 471 SET_WIDE_FP_VREG %xmm0, %ecx # v[A] <- xmm0 472 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 473 474 /* ------------------------------ */ 475 .balign 128 476 .L_op_move_wide_from16: /* 0x05 */ 477 /* File: x86/op_move_wide_from16.S */ 478 /* move-wide/from16 vAA, vBBBB */ 479 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 480 movzwl 2(rPC), %ecx # ecx <- BBBB 481 movzbl rINSTbl, %eax # eax <- AAAA 482 GET_WIDE_FP_VREG %xmm0, %ecx # xmm0 <- v[B] 483 SET_WIDE_FP_VREG %xmm0, %eax # v[A] <- xmm0 484 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 485 486 /* ------------------------------ */ 487 .balign 128 488 .L_op_move_wide_16: /* 0x06 */ 489 /* File: x86/op_move_wide_16.S */ 490 /* move-wide/16 vAAAA, vBBBB */ 491 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ 492 movzwl 4(rPC), %ecx # ecx<- BBBB 493 movzwl 2(rPC), %eax # eax<- AAAA 494 GET_WIDE_FP_VREG %xmm0, %ecx # xmm0 <- v[B] 495 SET_WIDE_FP_VREG %xmm0, %eax # v[A] <- xmm0 496 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 497 498 /* ------------------------------ */ 499 .balign 128 500 .L_op_move_object: /* 0x07 */ 501 /* File: x86/op_move_object.S */ 502 /* File: x86/op_move.S */ 503 /* for move, move-object, long-to-int */ 504 /* op vA, vB */ 505 movzbl rINSTbl, %eax # eax <- BA 506 andb $0xf, %al # eax <- A 507 shrl $4, rINST # rINST <- B 508 GET_VREG rINST, rINST 509 .if 1 510 SET_VREG_OBJECT rINST, %eax # fp[A] <- fp[B] 511 .else 512 SET_VREG rINST, %eax # fp[A] <- fp[B] 513 .endif 514 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 515 516 517 /* ------------------------------ */ 518 .balign 128 519 .L_op_move_object_from16: /* 0x08 */ 520 /* File: x86/op_move_object_from16.S */ 521 /* File: x86/op_move_from16.S */ 522 /* for: move/from16, move-object/from16 */ 523 /* op vAA, vBBBB */ 524 movzx rINSTbl, %eax # eax <- AA 525 movw 2(rPC), rINSTw # rINSTw <- BBBB 526 GET_VREG rINST, rINST # rINST <- fp[BBBB] 527 .if 1 528 SET_VREG_OBJECT rINST, %eax # fp[A] <- fp[B] 529 .else 530 SET_VREG rINST, %eax # fp[A] <- fp[B] 531 .endif 532 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 533 534 535 /* ------------------------------ */ 536 .balign 128 537 .L_op_move_object_16: /* 0x09 */ 538 /* File: x86/op_move_object_16.S */ 539 /* File: x86/op_move_16.S */ 540 /* for: move/16, move-object/16 */ 541 /* op vAAAA, vBBBB */ 542 movzwl 4(rPC), %ecx # ecx <- BBBB 543 movzwl 2(rPC), %eax # eax <- AAAA 544 GET_VREG rINST, %ecx 545 .if 1 546 SET_VREG_OBJECT rINST, %eax # fp[A] <- fp[B] 547 .else 548 SET_VREG rINST, %eax # fp[A] <- fp[B] 549 .endif 550 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 551 552 553 /* ------------------------------ */ 554 .balign 128 555 .L_op_move_result: /* 0x0a */ 556 /* File: x86/op_move_result.S */ 557 /* for: move-result, move-result-object */ 558 /* op vAA */ 559 movl OFF_FP_RESULT_REGISTER(rFP), %eax # get pointer to result JType. 560 movl (%eax), %eax # r0 <- result.i. 561 .if 0 562 SET_VREG_OBJECT %eax, rINST # fp[A] <- fp[B] 563 .else 564 SET_VREG %eax, rINST # fp[A] <- fp[B] 565 .endif 566 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 567 568 /* ------------------------------ */ 569 .balign 128 570 .L_op_move_result_wide: /* 0x0b */ 571 /* File: x86/op_move_result_wide.S */ 572 /* move-result-wide vAA */ 573 movl OFF_FP_RESULT_REGISTER(rFP), %eax # get pointer to result JType. 574 movl 4(%eax), %ecx # Get high 575 movl (%eax), %eax # Get low 576 SET_VREG %eax, rINST # v[AA+0] <- eax 577 SET_VREG_HIGH %ecx, rINST # v[AA+1] <- ecx 578 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 579 580 /* ------------------------------ */ 581 .balign 128 582 .L_op_move_result_object: /* 0x0c */ 583 /* File: x86/op_move_result_object.S */ 584 /* File: x86/op_move_result.S */ 585 /* for: move-result, move-result-object */ 586 /* op vAA */ 587 movl OFF_FP_RESULT_REGISTER(rFP), %eax # get pointer to result JType. 588 movl (%eax), %eax # r0 <- result.i. 589 .if 1 590 SET_VREG_OBJECT %eax, rINST # fp[A] <- fp[B] 591 .else 592 SET_VREG %eax, rINST # fp[A] <- fp[B] 593 .endif 594 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 595 596 597 /* ------------------------------ */ 598 .balign 128 599 .L_op_move_exception: /* 0x0d */ 600 /* File: x86/op_move_exception.S */ 601 /* move-exception vAA */ 602 movl rSELF, %ecx 603 movl THREAD_EXCEPTION_OFFSET(%ecx), %eax 604 SET_VREG_OBJECT %eax, rINST # fp[AA] <- exception object 605 movl $0, THREAD_EXCEPTION_OFFSET(%ecx) 606 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 607 608 /* ------------------------------ */ 609 .balign 128 610 .L_op_return_void: /* 0x0e */ 611 /* File: x86/op_return_void.S */ 612 .extern MterpThreadFenceForConstructor 613 call SYMBOL(MterpThreadFenceForConstructor) 614 movl rSELF, %eax 615 testl $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax) 616 jz 1f 617 movl %eax, OUT_ARG0(%esp) 618 call SYMBOL(MterpSuspendCheck) 619 1: 620 xorl %eax, %eax 621 xorl %ecx, %ecx 622 jmp MterpReturn 623 624 /* ------------------------------ */ 625 .balign 128 626 .L_op_return: /* 0x0f */ 627 /* File: x86/op_return.S */ 628 /* 629 * Return a 32-bit value. 630 * 631 * for: return, return-object 632 */ 633 /* op vAA */ 634 .extern MterpThreadFenceForConstructor 635 call SYMBOL(MterpThreadFenceForConstructor) 636 movl rSELF, %eax 637 testl $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax) 638 jz 1f 639 movl %eax, OUT_ARG0(%esp) 640 call SYMBOL(MterpSuspendCheck) 641 1: 642 GET_VREG %eax, rINST # eax <- vAA 643 xorl %ecx, %ecx 644 jmp MterpReturn 645 646 /* ------------------------------ */ 647 .balign 128 648 .L_op_return_wide: /* 0x10 */ 649 /* File: x86/op_return_wide.S */ 650 /* 651 * Return a 64-bit value. 652 */ 653 /* return-wide vAA */ 654 .extern MterpThreadFenceForConstructor 655 call SYMBOL(MterpThreadFenceForConstructor) 656 movl rSELF, %eax 657 testl $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax) 658 jz 1f 659 movl %eax, OUT_ARG0(%esp) 660 call SYMBOL(MterpSuspendCheck) 661 1: 662 GET_VREG %eax, rINST # eax <- v[AA+0] 663 GET_VREG_HIGH %ecx, rINST # ecx <- v[AA+1] 664 jmp MterpReturn 665 666 /* ------------------------------ */ 667 .balign 128 668 .L_op_return_object: /* 0x11 */ 669 /* File: x86/op_return_object.S */ 670 /* File: x86/op_return.S */ 671 /* 672 * Return a 32-bit value. 673 * 674 * for: return, return-object 675 */ 676 /* op vAA */ 677 .extern MterpThreadFenceForConstructor 678 call SYMBOL(MterpThreadFenceForConstructor) 679 movl rSELF, %eax 680 testl $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax) 681 jz 1f 682 movl %eax, OUT_ARG0(%esp) 683 call SYMBOL(MterpSuspendCheck) 684 1: 685 GET_VREG %eax, rINST # eax <- vAA 686 xorl %ecx, %ecx 687 jmp MterpReturn 688 689 690 /* ------------------------------ */ 691 .balign 128 692 .L_op_const_4: /* 0x12 */ 693 /* File: x86/op_const_4.S */ 694 /* const/4 vA, #+B */ 695 movsx rINSTbl, %eax # eax <-ssssssBx 696 movl $0xf, rINST 697 andl %eax, rINST # rINST <- A 698 sarl $4, %eax 699 SET_VREG %eax, rINST 700 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 701 702 /* ------------------------------ */ 703 .balign 128 704 .L_op_const_16: /* 0x13 */ 705 /* File: x86/op_const_16.S */ 706 /* const/16 vAA, #+BBBB */ 707 movswl 2(rPC), %ecx # ecx <- ssssBBBB 708 SET_VREG %ecx, rINST # vAA <- ssssBBBB 709 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 710 711 /* ------------------------------ */ 712 .balign 128 713 .L_op_const: /* 0x14 */ 714 /* File: x86/op_const.S */ 715 /* const vAA, #+BBBBbbbb */ 716 movl 2(rPC), %eax # grab all 32 bits at once 717 SET_VREG %eax, rINST # vAA<- eax 718 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 719 720 /* ------------------------------ */ 721 .balign 128 722 .L_op_const_high16: /* 0x15 */ 723 /* File: x86/op_const_high16.S */ 724 /* const/high16 vAA, #+BBBB0000 */ 725 movzwl 2(rPC), %eax # eax <- 0000BBBB 726 sall $16, %eax # eax <- BBBB0000 727 SET_VREG %eax, rINST # vAA <- eax 728 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 729 730 /* ------------------------------ */ 731 .balign 128 732 .L_op_const_wide_16: /* 0x16 */ 733 /* File: x86/op_const_wide_16.S */ 734 /* const-wide/16 vAA, #+BBBB */ 735 movswl 2(rPC), %eax # eax <- ssssBBBB 736 movl rIBASE, %ecx # preserve rIBASE (cltd trashes it) 737 cltd # rIBASE:eax <- ssssssssssssBBBB 738 SET_VREG_HIGH rIBASE, rINST # store msw 739 SET_VREG %eax, rINST # store lsw 740 movl %ecx, rIBASE # restore rIBASE 741 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 742 743 /* ------------------------------ */ 744 .balign 128 745 .L_op_const_wide_32: /* 0x17 */ 746 /* File: x86/op_const_wide_32.S */ 747 /* const-wide/32 vAA, #+BBBBbbbb */ 748 movl 2(rPC), %eax # eax <- BBBBbbbb 749 movl rIBASE, %ecx # preserve rIBASE (cltd trashes it) 750 cltd # rIBASE:eax <- ssssssssssssBBBB 751 SET_VREG_HIGH rIBASE, rINST # store msw 752 SET_VREG %eax, rINST # store lsw 753 movl %ecx, rIBASE # restore rIBASE 754 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 755 756 /* ------------------------------ */ 757 .balign 128 758 .L_op_const_wide: /* 0x18 */ 759 /* File: x86/op_const_wide.S */ 760 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */ 761 movl 2(rPC), %eax # eax <- lsw 762 movzbl rINSTbl, %ecx # ecx <- AA 763 movl 6(rPC), rINST # rINST <- msw 764 SET_VREG %eax, %ecx 765 SET_VREG_HIGH rINST, %ecx 766 ADVANCE_PC_FETCH_AND_GOTO_NEXT 5 767 768 /* ------------------------------ */ 769 .balign 128 770 .L_op_const_wide_high16: /* 0x19 */ 771 /* File: x86/op_const_wide_high16.S */ 772 /* const-wide/high16 vAA, #+BBBB000000000000 */ 773 movzwl 2(rPC), %eax # eax <- 0000BBBB 774 sall $16, %eax # eax <- BBBB0000 775 SET_VREG_HIGH %eax, rINST # v[AA+1] <- eax 776 xorl %eax, %eax 777 SET_VREG %eax, rINST # v[AA+0] <- eax 778 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 779 780 /* ------------------------------ */ 781 .balign 128 782 .L_op_const_string: /* 0x1a */ 783 /* File: x86/op_const_string.S */ 784 /* const/string vAA, String@BBBB */ 785 EXPORT_PC 786 movzwl 2(rPC), %eax # eax <- BBBB 787 movl %eax, OUT_ARG0(%esp) 788 movl rINST, OUT_ARG1(%esp) 789 leal OFF_FP_SHADOWFRAME(rFP), %eax 790 movl %eax, OUT_ARG2(%esp) 791 movl rSELF, %eax 792 movl %eax, OUT_ARG3(%esp) 793 call SYMBOL(MterpConstString) # (index, tgt_reg, shadow_frame, self) 794 RESTORE_IBASE 795 testb %al, %al 796 jnz MterpPossibleException 797 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 798 799 /* ------------------------------ */ 800 .balign 128 801 .L_op_const_string_jumbo: /* 0x1b */ 802 /* File: x86/op_const_string_jumbo.S */ 803 /* const/string vAA, String@BBBBBBBB */ 804 EXPORT_PC 805 movl 2(rPC), %eax # eax <- BBBB 806 movl %eax, OUT_ARG0(%esp) 807 movl rINST, OUT_ARG1(%esp) 808 leal OFF_FP_SHADOWFRAME(rFP), %eax 809 movl %eax, OUT_ARG2(%esp) 810 movl rSELF, %eax 811 movl %eax, OUT_ARG3(%esp) 812 call SYMBOL(MterpConstString) # (index, tgt_reg, shadow_frame, self) 813 RESTORE_IBASE 814 testb %al, %al 815 jnz MterpPossibleException 816 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 817 818 /* ------------------------------ */ 819 .balign 128 820 .L_op_const_class: /* 0x1c */ 821 /* File: x86/op_const_class.S */ 822 /* const/class vAA, Class@BBBB */ 823 EXPORT_PC 824 movzwl 2(rPC), %eax # eax<- BBBB 825 movl %eax, OUT_ARG0(%esp) 826 movl rINST, OUT_ARG1(%esp) 827 leal OFF_FP_SHADOWFRAME(rFP), %eax 828 movl %eax, OUT_ARG2(%esp) 829 movl rSELF, %eax 830 movl %eax, OUT_ARG3(%esp) 831 call SYMBOL(MterpConstClass) # (index, tgt_reg, shadow_frame, self) 832 RESTORE_IBASE 833 testb %al, %al 834 jnz MterpPossibleException 835 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 836 837 /* ------------------------------ */ 838 .balign 128 839 .L_op_monitor_enter: /* 0x1d */ 840 /* File: x86/op_monitor_enter.S */ 841 /* 842 * Synchronize on an object. 843 */ 844 /* monitor-enter vAA */ 845 EXPORT_PC 846 GET_VREG %ecx, rINST 847 movl %ecx, OUT_ARG0(%esp) 848 movl rSELF, %eax 849 movl %eax, OUT_ARG1(%esp) 850 call SYMBOL(artLockObjectFromCode) # (object, self) 851 RESTORE_IBASE 852 testb %al, %al 853 jnz MterpException 854 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 855 856 /* ------------------------------ */ 857 .balign 128 858 .L_op_monitor_exit: /* 0x1e */ 859 /* File: x86/op_monitor_exit.S */ 860 /* 861 * Unlock an object. 862 * 863 * Exceptions that occur when unlocking a monitor need to appear as 864 * if they happened at the following instruction. See the Dalvik 865 * instruction spec. 866 */ 867 /* monitor-exit vAA */ 868 EXPORT_PC 869 GET_VREG %ecx, rINST 870 movl %ecx, OUT_ARG0(%esp) 871 movl rSELF, %eax 872 movl %eax, OUT_ARG1(%esp) 873 call SYMBOL(artUnlockObjectFromCode) # (object, self) 874 RESTORE_IBASE 875 testb %al, %al 876 jnz MterpException 877 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 878 879 /* ------------------------------ */ 880 .balign 128 881 .L_op_check_cast: /* 0x1f */ 882 /* File: x86/op_check_cast.S */ 883 /* 884 * Check to see if a cast from one class to another is allowed. 885 */ 886 /* check-cast vAA, class@BBBB */ 887 EXPORT_PC 888 movzwl 2(rPC), %eax # eax <- BBBB 889 movl %eax, OUT_ARG0(%esp) 890 leal VREG_ADDRESS(rINST), %ecx 891 movl %ecx, OUT_ARG1(%esp) 892 movl OFF_FP_METHOD(rFP),%eax 893 movl %eax, OUT_ARG2(%esp) 894 movl rSELF, %ecx 895 movl %ecx, OUT_ARG3(%esp) 896 call SYMBOL(MterpCheckCast) # (index, &obj, method, self) 897 RESTORE_IBASE 898 testb %al, %al 899 jnz MterpPossibleException 900 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 901 902 /* ------------------------------ */ 903 .balign 128 904 .L_op_instance_of: /* 0x20 */ 905 /* File: x86/op_instance_of.S */ 906 /* 907 * Check to see if an object reference is an instance of a class. 908 * 909 * Most common situation is a non-null object, being compared against 910 * an already-resolved class. 911 */ 912 /* instance-of vA, vB, class@CCCC */ 913 EXPORT_PC 914 movzwl 2(rPC), %eax # eax <- BBBB 915 movl %eax, OUT_ARG0(%esp) 916 movl rINST, %eax # eax <- BA 917 sarl $4, %eax # eax <- B 918 leal VREG_ADDRESS(%eax), %ecx # Get object address 919 movl %ecx, OUT_ARG1(%esp) 920 movl OFF_FP_METHOD(rFP),%eax 921 movl %eax, OUT_ARG2(%esp) 922 movl rSELF, %ecx 923 movl %ecx, OUT_ARG3(%esp) 924 call SYMBOL(MterpInstanceOf) # (index, &obj, method, self) 925 movl rSELF, %ecx 926 RESTORE_IBASE_FROM_SELF %ecx 927 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 928 jnz MterpException 929 andb $0xf, rINSTbl # rINSTbl <- A 930 SET_VREG %eax, rINST 931 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 932 933 /* ------------------------------ */ 934 .balign 128 935 .L_op_array_length: /* 0x21 */ 936 /* File: x86/op_array_length.S */ 937 /* 938 * Return the length of an array. 939 */ 940 mov rINST, %eax # eax <- BA 941 sarl $4, rINST # rINST <- B 942 GET_VREG %ecx, rINST # ecx <- vB (object ref) 943 testl %ecx, %ecx # is null? 944 je common_errNullObject 945 andb $0xf, %al # eax <- A 946 movl MIRROR_ARRAY_LENGTH_OFFSET(%ecx), rINST 947 SET_VREG rINST, %eax 948 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 949 950 /* ------------------------------ */ 951 .balign 128 952 .L_op_new_instance: /* 0x22 */ 953 /* File: x86/op_new_instance.S */ 954 /* 955 * Create a new instance of a class. 956 */ 957 /* new-instance vAA, class@BBBB */ 958 EXPORT_PC 959 leal OFF_FP_SHADOWFRAME(rFP), %eax 960 movl %eax, OUT_ARG0(%esp) 961 movl rSELF, %ecx 962 movl %ecx, OUT_ARG1(%esp) 963 REFRESH_INST 34 964 movl rINST, OUT_ARG2(%esp) 965 call SYMBOL(MterpNewInstance) 966 RESTORE_IBASE 967 testb %al, %al # 0 means an exception is thrown 968 jz MterpPossibleException 969 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 970 971 /* ------------------------------ */ 972 .balign 128 973 .L_op_new_array: /* 0x23 */ 974 /* File: x86/op_new_array.S */ 975 /* 976 * Allocate an array of objects, specified with the array class 977 * and a count. 978 * 979 * The verifier guarantees that this is an array class, so we don't 980 * check for it here. 981 */ 982 /* new-array vA, vB, class@CCCC */ 983 EXPORT_PC 984 leal OFF_FP_SHADOWFRAME(rFP), %eax 985 movl %eax, OUT_ARG0(%esp) 986 movl rPC, OUT_ARG1(%esp) 987 REFRESH_INST 35 988 movl rINST, OUT_ARG2(%esp) 989 movl rSELF, %ecx 990 movl %ecx, OUT_ARG3(%esp) 991 call SYMBOL(MterpNewArray) 992 RESTORE_IBASE 993 testb %al, %al # 0 means an exception is thrown 994 jz MterpPossibleException 995 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 996 997 /* ------------------------------ */ 998 .balign 128 999 .L_op_filled_new_array: /* 0x24 */ 1000 /* File: x86/op_filled_new_array.S */ 1001 /* 1002 * Create a new array with elements filled from registers. 1003 * 1004 * for: filled-new-array, filled-new-array/range 1005 */ 1006 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 1007 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */ 1008 .extern MterpFilledNewArray 1009 EXPORT_PC 1010 leal OFF_FP_SHADOWFRAME(rFP), %eax 1011 movl %eax, OUT_ARG0(%esp) 1012 movl rPC, OUT_ARG1(%esp) 1013 movl rSELF, %ecx 1014 movl %ecx, OUT_ARG2(%esp) 1015 call SYMBOL(MterpFilledNewArray) 1016 REFRESH_IBASE 1017 testb %al, %al # 0 means an exception is thrown 1018 jz MterpPossibleException 1019 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 1020 1021 /* ------------------------------ */ 1022 .balign 128 1023 .L_op_filled_new_array_range: /* 0x25 */ 1024 /* File: x86/op_filled_new_array_range.S */ 1025 /* File: x86/op_filled_new_array.S */ 1026 /* 1027 * Create a new array with elements filled from registers. 1028 * 1029 * for: filled-new-array, filled-new-array/range 1030 */ 1031 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 1032 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */ 1033 .extern MterpFilledNewArrayRange 1034 EXPORT_PC 1035 leal OFF_FP_SHADOWFRAME(rFP), %eax 1036 movl %eax, OUT_ARG0(%esp) 1037 movl rPC, OUT_ARG1(%esp) 1038 movl rSELF, %ecx 1039 movl %ecx, OUT_ARG2(%esp) 1040 call SYMBOL(MterpFilledNewArrayRange) 1041 REFRESH_IBASE 1042 testb %al, %al # 0 means an exception is thrown 1043 jz MterpPossibleException 1044 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 1045 1046 1047 /* ------------------------------ */ 1048 .balign 128 1049 .L_op_fill_array_data: /* 0x26 */ 1050 /* File: x86/op_fill_array_data.S */ 1051 /* fill-array-data vAA, +BBBBBBBB */ 1052 EXPORT_PC 1053 movl 2(rPC), %ecx # ecx <- BBBBbbbb 1054 leal (rPC,%ecx,2), %ecx # ecx <- PC + BBBBbbbb*2 1055 GET_VREG %eax, rINST # eax <- vAA (array object) 1056 movl %eax, OUT_ARG0(%esp) 1057 movl %ecx, OUT_ARG1(%esp) 1058 call SYMBOL(MterpFillArrayData) # (obj, payload) 1059 REFRESH_IBASE 1060 testb %al, %al # 0 means an exception is thrown 1061 jz MterpPossibleException 1062 ADVANCE_PC_FETCH_AND_GOTO_NEXT 3 1063 1064 /* ------------------------------ */ 1065 .balign 128 1066 .L_op_throw: /* 0x27 */ 1067 /* File: x86/op_throw.S */ 1068 /* 1069 * Throw an exception object in the current thread. 1070 */ 1071 /* throw vAA */ 1072 EXPORT_PC 1073 GET_VREG %eax, rINST # eax<- vAA (exception object) 1074 testl %eax, %eax 1075 jz common_errNullObject 1076 movl rSELF,%ecx 1077 movl %eax, THREAD_EXCEPTION_OFFSET(%ecx) 1078 jmp MterpException 1079 1080 /* ------------------------------ */ 1081 .balign 128 1082 .L_op_goto: /* 0x28 */ 1083 /* File: x86/op_goto.S */ 1084 /* 1085 * Unconditional branch, 8-bit offset. 1086 * 1087 * The branch distance is a signed code-unit offset, which we need to 1088 * double to get a byte offset. 1089 */ 1090 /* goto +AA */ 1091 movsbl rINSTbl, rINST # rINST <- ssssssAA 1092 testl rINST, rINST 1093 jmp MterpCommonTakenBranch 1094 1095 /* ------------------------------ */ 1096 .balign 128 1097 .L_op_goto_16: /* 0x29 */ 1098 /* File: x86/op_goto_16.S */ 1099 /* 1100 * Unconditional branch, 16-bit offset. 1101 * 1102 * The branch distance is a signed code-unit offset, which we need to 1103 * double to get a byte offset. 1104 */ 1105 /* goto/16 +AAAA */ 1106 movswl 2(rPC), rINST # rINST <- ssssAAAA 1107 testl rINST, rINST 1108 jmp MterpCommonTakenBranch 1109 1110 /* ------------------------------ */ 1111 .balign 128 1112 .L_op_goto_32: /* 0x2a */ 1113 /* File: x86/op_goto_32.S */ 1114 /* 1115 * Unconditional branch, 32-bit offset. 1116 * 1117 * The branch distance is a signed code-unit offset, which we need to 1118 * double to get a byte offset. 1119 * 1120 * Unlike most opcodes, this one is allowed to branch to itself, so 1121 * our "backward branch" test must be "<=0" instead of "<0". Because 1122 * we need the V bit set, we'll use an adds to convert from Dalvik 1123 * offset to byte offset. 1124 */ 1125 /* goto/32 +AAAAAAAA */ 1126 movl 2(rPC), rINST # rINST <- AAAAAAAA 1127 testl rINST, rINST 1128 jmp MterpCommonTakenBranch 1129 1130 /* ------------------------------ */ 1131 .balign 128 1132 .L_op_packed_switch: /* 0x2b */ 1133 /* File: x86/op_packed_switch.S */ 1134 /* 1135 * Handle a packed-switch or sparse-switch instruction. In both cases 1136 * we decode it and hand it off to a helper function. 1137 * 1138 * We don't really expect backward branches in a switch statement, but 1139 * they're perfectly legal, so we check for them here. 1140 * 1141 * for: packed-switch, sparse-switch 1142 */ 1143 /* op vAA, +BBBB */ 1144 movl 2(rPC), %ecx # ecx <- BBBBbbbb 1145 GET_VREG %eax, rINST # eax <- vAA 1146 leal (rPC,%ecx,2), %ecx # ecx <- PC + BBBBbbbb*2 1147 movl %eax, OUT_ARG1(%esp) # ARG1 <- vAA 1148 movl %ecx, OUT_ARG0(%esp) # ARG0 <- switchData 1149 call SYMBOL(MterpDoPackedSwitch) 1150 REFRESH_IBASE 1151 testl %eax, %eax 1152 movl %eax, rINST 1153 jmp MterpCommonTakenBranch 1154 1155 /* ------------------------------ */ 1156 .balign 128 1157 .L_op_sparse_switch: /* 0x2c */ 1158 /* File: x86/op_sparse_switch.S */ 1159 /* File: x86/op_packed_switch.S */ 1160 /* 1161 * Handle a packed-switch or sparse-switch instruction. In both cases 1162 * we decode it and hand it off to a helper function. 1163 * 1164 * We don't really expect backward branches in a switch statement, but 1165 * they're perfectly legal, so we check for them here. 1166 * 1167 * for: packed-switch, sparse-switch 1168 */ 1169 /* op vAA, +BBBB */ 1170 movl 2(rPC), %ecx # ecx <- BBBBbbbb 1171 GET_VREG %eax, rINST # eax <- vAA 1172 leal (rPC,%ecx,2), %ecx # ecx <- PC + BBBBbbbb*2 1173 movl %eax, OUT_ARG1(%esp) # ARG1 <- vAA 1174 movl %ecx, OUT_ARG0(%esp) # ARG0 <- switchData 1175 call SYMBOL(MterpDoSparseSwitch) 1176 REFRESH_IBASE 1177 testl %eax, %eax 1178 movl %eax, rINST 1179 jmp MterpCommonTakenBranch 1180 1181 1182 /* ------------------------------ */ 1183 .balign 128 1184 .L_op_cmpl_float: /* 0x2d */ 1185 /* File: x86/op_cmpl_float.S */ 1186 /* File: x86/fpcmp.S */ 1187 /* 1188 * Compare two floating-point values. Puts 0, 1, or -1 into the 1189 * destination register based on the results of the comparison. 1190 * 1191 * int compare(x, y) { 1192 * if (x == y) { 1193 * return 0; 1194 * } else if (x < y) { 1195 * return -1; 1196 * } else if (x > y) { 1197 * return 1; 1198 * } else { 1199 * return nanval ? 1 : -1; 1200 * } 1201 * } 1202 */ 1203 /* op vAA, vBB, vCC */ 1204 movzbl 3(rPC), %ecx # ecx<- CC 1205 movzbl 2(rPC), %eax # eax<- BB 1206 movss VREG_ADDRESS(%eax), %xmm0 1207 xor %eax, %eax 1208 ucomiss VREG_ADDRESS(%ecx), %xmm0 1209 jp .Lop_cmpl_float_nan_is_neg 1210 je .Lop_cmpl_float_finish 1211 jb .Lop_cmpl_float_less 1212 .Lop_cmpl_float_nan_is_pos: 1213 incl %eax 1214 jmp .Lop_cmpl_float_finish 1215 .Lop_cmpl_float_nan_is_neg: 1216 .Lop_cmpl_float_less: 1217 decl %eax 1218 .Lop_cmpl_float_finish: 1219 SET_VREG %eax, rINST 1220 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1221 1222 1223 /* ------------------------------ */ 1224 .balign 128 1225 .L_op_cmpg_float: /* 0x2e */ 1226 /* File: x86/op_cmpg_float.S */ 1227 /* File: x86/fpcmp.S */ 1228 /* 1229 * Compare two floating-point values. Puts 0, 1, or -1 into the 1230 * destination register based on the results of the comparison. 1231 * 1232 * int compare(x, y) { 1233 * if (x == y) { 1234 * return 0; 1235 * } else if (x < y) { 1236 * return -1; 1237 * } else if (x > y) { 1238 * return 1; 1239 * } else { 1240 * return nanval ? 1 : -1; 1241 * } 1242 * } 1243 */ 1244 /* op vAA, vBB, vCC */ 1245 movzbl 3(rPC), %ecx # ecx<- CC 1246 movzbl 2(rPC), %eax # eax<- BB 1247 movss VREG_ADDRESS(%eax), %xmm0 1248 xor %eax, %eax 1249 ucomiss VREG_ADDRESS(%ecx), %xmm0 1250 jp .Lop_cmpg_float_nan_is_pos 1251 je .Lop_cmpg_float_finish 1252 jb .Lop_cmpg_float_less 1253 .Lop_cmpg_float_nan_is_pos: 1254 incl %eax 1255 jmp .Lop_cmpg_float_finish 1256 .Lop_cmpg_float_nan_is_neg: 1257 .Lop_cmpg_float_less: 1258 decl %eax 1259 .Lop_cmpg_float_finish: 1260 SET_VREG %eax, rINST 1261 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1262 1263 1264 /* ------------------------------ */ 1265 .balign 128 1266 .L_op_cmpl_double: /* 0x2f */ 1267 /* File: x86/op_cmpl_double.S */ 1268 /* File: x86/fpcmp.S */ 1269 /* 1270 * Compare two floating-point values. Puts 0, 1, or -1 into the 1271 * destination register based on the results of the comparison. 1272 * 1273 * int compare(x, y) { 1274 * if (x == y) { 1275 * return 0; 1276 * } else if (x < y) { 1277 * return -1; 1278 * } else if (x > y) { 1279 * return 1; 1280 * } else { 1281 * return nanval ? 1 : -1; 1282 * } 1283 * } 1284 */ 1285 /* op vAA, vBB, vCC */ 1286 movzbl 3(rPC), %ecx # ecx<- CC 1287 movzbl 2(rPC), %eax # eax<- BB 1288 movsd VREG_ADDRESS(%eax), %xmm0 1289 xor %eax, %eax 1290 ucomisd VREG_ADDRESS(%ecx), %xmm0 1291 jp .Lop_cmpl_double_nan_is_neg 1292 je .Lop_cmpl_double_finish 1293 jb .Lop_cmpl_double_less 1294 .Lop_cmpl_double_nan_is_pos: 1295 incl %eax 1296 jmp .Lop_cmpl_double_finish 1297 .Lop_cmpl_double_nan_is_neg: 1298 .Lop_cmpl_double_less: 1299 decl %eax 1300 .Lop_cmpl_double_finish: 1301 SET_VREG %eax, rINST 1302 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1303 1304 1305 /* ------------------------------ */ 1306 .balign 128 1307 .L_op_cmpg_double: /* 0x30 */ 1308 /* File: x86/op_cmpg_double.S */ 1309 /* File: x86/fpcmp.S */ 1310 /* 1311 * Compare two floating-point values. Puts 0, 1, or -1 into the 1312 * destination register based on the results of the comparison. 1313 * 1314 * int compare(x, y) { 1315 * if (x == y) { 1316 * return 0; 1317 * } else if (x < y) { 1318 * return -1; 1319 * } else if (x > y) { 1320 * return 1; 1321 * } else { 1322 * return nanval ? 1 : -1; 1323 * } 1324 * } 1325 */ 1326 /* op vAA, vBB, vCC */ 1327 movzbl 3(rPC), %ecx # ecx<- CC 1328 movzbl 2(rPC), %eax # eax<- BB 1329 movsd VREG_ADDRESS(%eax), %xmm0 1330 xor %eax, %eax 1331 ucomisd VREG_ADDRESS(%ecx), %xmm0 1332 jp .Lop_cmpg_double_nan_is_pos 1333 je .Lop_cmpg_double_finish 1334 jb .Lop_cmpg_double_less 1335 .Lop_cmpg_double_nan_is_pos: 1336 incl %eax 1337 jmp .Lop_cmpg_double_finish 1338 .Lop_cmpg_double_nan_is_neg: 1339 .Lop_cmpg_double_less: 1340 decl %eax 1341 .Lop_cmpg_double_finish: 1342 SET_VREG %eax, rINST 1343 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1344 1345 1346 /* ------------------------------ */ 1347 .balign 128 1348 .L_op_cmp_long: /* 0x31 */ 1349 /* File: x86/op_cmp_long.S */ 1350 /* 1351 * Compare two 64-bit values. Puts 0, 1, or -1 into the destination 1352 * register based on the results of the comparison. 1353 */ 1354 /* cmp-long vAA, vBB, vCC */ 1355 movzbl 2(rPC), %eax # eax <- BB 1356 movzbl 3(rPC), %ecx # ecx <- CC 1357 GET_VREG_HIGH %eax, %eax # eax <- v[BB+1], BB is clobbered 1358 cmpl VREG_HIGH_ADDRESS(%ecx), %eax 1359 jl .Lop_cmp_long_smaller 1360 jg .Lop_cmp_long_bigger 1361 movzbl 2(rPC), %eax # eax <- BB, restore BB 1362 GET_VREG %eax, %eax # eax <- v[BB] 1363 sub VREG_ADDRESS(%ecx), %eax 1364 ja .Lop_cmp_long_bigger 1365 jb .Lop_cmp_long_smaller 1366 .Lop_cmp_long_finish: 1367 SET_VREG %eax, rINST 1368 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1369 1370 .Lop_cmp_long_bigger: 1371 movl $1, %eax 1372 jmp .Lop_cmp_long_finish 1373 1374 .Lop_cmp_long_smaller: 1375 movl $-1, %eax 1376 jmp .Lop_cmp_long_finish 1377 1378 /* ------------------------------ */ 1379 .balign 128 1380 .L_op_if_eq: /* 0x32 */ 1381 /* File: x86/op_if_eq.S */ 1382 /* File: x86/bincmp.S */ 1383 /* 1384 * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1385 * fragment that specifies the *reverse* comparison to perform, e.g. 1386 * for "if-le" you would use "gt". 1387 * 1388 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1389 */ 1390 /* if-cmp vA, vB, +CCCC */ 1391 movzx rINSTbl, %ecx # ecx <- A+ 1392 andb $0xf, %cl # ecx <- A 1393 GET_VREG %eax, %ecx # eax <- vA 1394 sarl $4, rINST # rINST <- B 1395 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB) 1396 jne 1f 1397 movswl 2(rPC), rINST # Get signed branch offset 1398 testl rINST, rINST 1399 jmp MterpCommonTakenBranch 1400 1: 1401 cmpw $JIT_CHECK_OSR, rPROFILE 1402 je .L_check_not_taken_osr 1403 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1404 1405 1406 /* ------------------------------ */ 1407 .balign 128 1408 .L_op_if_ne: /* 0x33 */ 1409 /* File: x86/op_if_ne.S */ 1410 /* File: x86/bincmp.S */ 1411 /* 1412 * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1413 * fragment that specifies the *reverse* comparison to perform, e.g. 1414 * for "if-le" you would use "gt". 1415 * 1416 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1417 */ 1418 /* if-cmp vA, vB, +CCCC */ 1419 movzx rINSTbl, %ecx # ecx <- A+ 1420 andb $0xf, %cl # ecx <- A 1421 GET_VREG %eax, %ecx # eax <- vA 1422 sarl $4, rINST # rINST <- B 1423 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB) 1424 je 1f 1425 movswl 2(rPC), rINST # Get signed branch offset 1426 testl rINST, rINST 1427 jmp MterpCommonTakenBranch 1428 1: 1429 cmpw $JIT_CHECK_OSR, rPROFILE 1430 je .L_check_not_taken_osr 1431 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1432 1433 1434 /* ------------------------------ */ 1435 .balign 128 1436 .L_op_if_lt: /* 0x34 */ 1437 /* File: x86/op_if_lt.S */ 1438 /* File: x86/bincmp.S */ 1439 /* 1440 * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1441 * fragment that specifies the *reverse* comparison to perform, e.g. 1442 * for "if-le" you would use "gt". 1443 * 1444 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1445 */ 1446 /* if-cmp vA, vB, +CCCC */ 1447 movzx rINSTbl, %ecx # ecx <- A+ 1448 andb $0xf, %cl # ecx <- A 1449 GET_VREG %eax, %ecx # eax <- vA 1450 sarl $4, rINST # rINST <- B 1451 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB) 1452 jge 1f 1453 movswl 2(rPC), rINST # Get signed branch offset 1454 testl rINST, rINST 1455 jmp MterpCommonTakenBranch 1456 1: 1457 cmpw $JIT_CHECK_OSR, rPROFILE 1458 je .L_check_not_taken_osr 1459 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1460 1461 1462 /* ------------------------------ */ 1463 .balign 128 1464 .L_op_if_ge: /* 0x35 */ 1465 /* File: x86/op_if_ge.S */ 1466 /* File: x86/bincmp.S */ 1467 /* 1468 * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1469 * fragment that specifies the *reverse* comparison to perform, e.g. 1470 * for "if-le" you would use "gt". 1471 * 1472 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1473 */ 1474 /* if-cmp vA, vB, +CCCC */ 1475 movzx rINSTbl, %ecx # ecx <- A+ 1476 andb $0xf, %cl # ecx <- A 1477 GET_VREG %eax, %ecx # eax <- vA 1478 sarl $4, rINST # rINST <- B 1479 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB) 1480 jl 1f 1481 movswl 2(rPC), rINST # Get signed branch offset 1482 testl rINST, rINST 1483 jmp MterpCommonTakenBranch 1484 1: 1485 cmpw $JIT_CHECK_OSR, rPROFILE 1486 je .L_check_not_taken_osr 1487 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1488 1489 1490 /* ------------------------------ */ 1491 .balign 128 1492 .L_op_if_gt: /* 0x36 */ 1493 /* File: x86/op_if_gt.S */ 1494 /* File: x86/bincmp.S */ 1495 /* 1496 * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1497 * fragment that specifies the *reverse* comparison to perform, e.g. 1498 * for "if-le" you would use "gt". 1499 * 1500 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1501 */ 1502 /* if-cmp vA, vB, +CCCC */ 1503 movzx rINSTbl, %ecx # ecx <- A+ 1504 andb $0xf, %cl # ecx <- A 1505 GET_VREG %eax, %ecx # eax <- vA 1506 sarl $4, rINST # rINST <- B 1507 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB) 1508 jle 1f 1509 movswl 2(rPC), rINST # Get signed branch offset 1510 testl rINST, rINST 1511 jmp MterpCommonTakenBranch 1512 1: 1513 cmpw $JIT_CHECK_OSR, rPROFILE 1514 je .L_check_not_taken_osr 1515 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1516 1517 1518 /* ------------------------------ */ 1519 .balign 128 1520 .L_op_if_le: /* 0x37 */ 1521 /* File: x86/op_if_le.S */ 1522 /* File: x86/bincmp.S */ 1523 /* 1524 * Generic two-operand compare-and-branch operation. Provide a "revcmp" 1525 * fragment that specifies the *reverse* comparison to perform, e.g. 1526 * for "if-le" you would use "gt". 1527 * 1528 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le 1529 */ 1530 /* if-cmp vA, vB, +CCCC */ 1531 movzx rINSTbl, %ecx # ecx <- A+ 1532 andb $0xf, %cl # ecx <- A 1533 GET_VREG %eax, %ecx # eax <- vA 1534 sarl $4, rINST # rINST <- B 1535 cmpl VREG_ADDRESS(rINST), %eax # compare (vA, vB) 1536 jg 1f 1537 movswl 2(rPC), rINST # Get signed branch offset 1538 testl rINST, rINST 1539 jmp MterpCommonTakenBranch 1540 1: 1541 cmpw $JIT_CHECK_OSR, rPROFILE 1542 je .L_check_not_taken_osr 1543 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1544 1545 1546 /* ------------------------------ */ 1547 .balign 128 1548 .L_op_if_eqz: /* 0x38 */ 1549 /* File: x86/op_if_eqz.S */ 1550 /* File: x86/zcmp.S */ 1551 /* 1552 * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1553 * fragment that specifies the *reverse* comparison to perform, e.g. 1554 * for "if-le" you would use "gt". 1555 * 1556 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1557 */ 1558 /* if-cmp vAA, +BBBB */ 1559 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0) 1560 jne 1f 1561 movswl 2(rPC), rINST # fetch signed displacement 1562 testl rINST, rINST 1563 jmp MterpCommonTakenBranch 1564 1: 1565 cmpw $JIT_CHECK_OSR, rPROFILE 1566 je .L_check_not_taken_osr 1567 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1568 1569 1570 /* ------------------------------ */ 1571 .balign 128 1572 .L_op_if_nez: /* 0x39 */ 1573 /* File: x86/op_if_nez.S */ 1574 /* File: x86/zcmp.S */ 1575 /* 1576 * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1577 * fragment that specifies the *reverse* comparison to perform, e.g. 1578 * for "if-le" you would use "gt". 1579 * 1580 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1581 */ 1582 /* if-cmp vAA, +BBBB */ 1583 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0) 1584 je 1f 1585 movswl 2(rPC), rINST # fetch signed displacement 1586 testl rINST, rINST 1587 jmp MterpCommonTakenBranch 1588 1: 1589 cmpw $JIT_CHECK_OSR, rPROFILE 1590 je .L_check_not_taken_osr 1591 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1592 1593 1594 /* ------------------------------ */ 1595 .balign 128 1596 .L_op_if_ltz: /* 0x3a */ 1597 /* File: x86/op_if_ltz.S */ 1598 /* File: x86/zcmp.S */ 1599 /* 1600 * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1601 * fragment that specifies the *reverse* comparison to perform, e.g. 1602 * for "if-le" you would use "gt". 1603 * 1604 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1605 */ 1606 /* if-cmp vAA, +BBBB */ 1607 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0) 1608 jge 1f 1609 movswl 2(rPC), rINST # fetch signed displacement 1610 testl rINST, rINST 1611 jmp MterpCommonTakenBranch 1612 1: 1613 cmpw $JIT_CHECK_OSR, rPROFILE 1614 je .L_check_not_taken_osr 1615 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1616 1617 1618 /* ------------------------------ */ 1619 .balign 128 1620 .L_op_if_gez: /* 0x3b */ 1621 /* File: x86/op_if_gez.S */ 1622 /* File: x86/zcmp.S */ 1623 /* 1624 * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1625 * fragment that specifies the *reverse* comparison to perform, e.g. 1626 * for "if-le" you would use "gt". 1627 * 1628 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1629 */ 1630 /* if-cmp vAA, +BBBB */ 1631 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0) 1632 jl 1f 1633 movswl 2(rPC), rINST # fetch signed displacement 1634 testl rINST, rINST 1635 jmp MterpCommonTakenBranch 1636 1: 1637 cmpw $JIT_CHECK_OSR, rPROFILE 1638 je .L_check_not_taken_osr 1639 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1640 1641 1642 /* ------------------------------ */ 1643 .balign 128 1644 .L_op_if_gtz: /* 0x3c */ 1645 /* File: x86/op_if_gtz.S */ 1646 /* File: x86/zcmp.S */ 1647 /* 1648 * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1649 * fragment that specifies the *reverse* comparison to perform, e.g. 1650 * for "if-le" you would use "gt". 1651 * 1652 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1653 */ 1654 /* if-cmp vAA, +BBBB */ 1655 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0) 1656 jle 1f 1657 movswl 2(rPC), rINST # fetch signed displacement 1658 testl rINST, rINST 1659 jmp MterpCommonTakenBranch 1660 1: 1661 cmpw $JIT_CHECK_OSR, rPROFILE 1662 je .L_check_not_taken_osr 1663 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1664 1665 1666 /* ------------------------------ */ 1667 .balign 128 1668 .L_op_if_lez: /* 0x3d */ 1669 /* File: x86/op_if_lez.S */ 1670 /* File: x86/zcmp.S */ 1671 /* 1672 * Generic one-operand compare-and-branch operation. Provide a "revcmp" 1673 * fragment that specifies the *reverse* comparison to perform, e.g. 1674 * for "if-le" you would use "gt". 1675 * 1676 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez 1677 */ 1678 /* if-cmp vAA, +BBBB */ 1679 cmpl $0, VREG_ADDRESS(rINST) # compare (vA, 0) 1680 jg 1f 1681 movswl 2(rPC), rINST # fetch signed displacement 1682 testl rINST, rINST 1683 jmp MterpCommonTakenBranch 1684 1: 1685 cmpw $JIT_CHECK_OSR, rPROFILE 1686 je .L_check_not_taken_osr 1687 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1688 1689 1690 /* ------------------------------ */ 1691 .balign 128 1692 .L_op_unused_3e: /* 0x3e */ 1693 /* File: x86/op_unused_3e.S */ 1694 /* File: x86/unused.S */ 1695 /* 1696 * Bail to reference interpreter to throw. 1697 */ 1698 jmp MterpFallback 1699 1700 1701 /* ------------------------------ */ 1702 .balign 128 1703 .L_op_unused_3f: /* 0x3f */ 1704 /* File: x86/op_unused_3f.S */ 1705 /* File: x86/unused.S */ 1706 /* 1707 * Bail to reference interpreter to throw. 1708 */ 1709 jmp MterpFallback 1710 1711 1712 /* ------------------------------ */ 1713 .balign 128 1714 .L_op_unused_40: /* 0x40 */ 1715 /* File: x86/op_unused_40.S */ 1716 /* File: x86/unused.S */ 1717 /* 1718 * Bail to reference interpreter to throw. 1719 */ 1720 jmp MterpFallback 1721 1722 1723 /* ------------------------------ */ 1724 .balign 128 1725 .L_op_unused_41: /* 0x41 */ 1726 /* File: x86/op_unused_41.S */ 1727 /* File: x86/unused.S */ 1728 /* 1729 * Bail to reference interpreter to throw. 1730 */ 1731 jmp MterpFallback 1732 1733 1734 /* ------------------------------ */ 1735 .balign 128 1736 .L_op_unused_42: /* 0x42 */ 1737 /* File: x86/op_unused_42.S */ 1738 /* File: x86/unused.S */ 1739 /* 1740 * Bail to reference interpreter to throw. 1741 */ 1742 jmp MterpFallback 1743 1744 1745 /* ------------------------------ */ 1746 .balign 128 1747 .L_op_unused_43: /* 0x43 */ 1748 /* File: x86/op_unused_43.S */ 1749 /* File: x86/unused.S */ 1750 /* 1751 * Bail to reference interpreter to throw. 1752 */ 1753 jmp MterpFallback 1754 1755 1756 /* ------------------------------ */ 1757 .balign 128 1758 .L_op_aget: /* 0x44 */ 1759 /* File: x86/op_aget.S */ 1760 /* 1761 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1762 * 1763 * for: aget, aget-boolean, aget-byte, aget-char, aget-short 1764 * 1765 */ 1766 /* op vAA, vBB, vCC */ 1767 movzbl 2(rPC), %eax # eax <- BB 1768 movzbl 3(rPC), %ecx # ecx <- CC 1769 GET_VREG %eax, %eax # eax <- vBB (array object) 1770 GET_VREG %ecx, %ecx # ecx <- vCC (requested index) 1771 testl %eax, %eax # null array object? 1772 je common_errNullObject # bail if so 1773 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1774 jae common_errArrayIndex # index >= length, bail. 1775 movl MIRROR_INT_ARRAY_DATA_OFFSET(%eax,%ecx,4), %eax 1776 SET_VREG %eax, rINST 1777 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1778 1779 /* ------------------------------ */ 1780 .balign 128 1781 .L_op_aget_wide: /* 0x45 */ 1782 /* File: x86/op_aget_wide.S */ 1783 /* 1784 * Array get, 64 bits. vAA <- vBB[vCC]. 1785 */ 1786 /* aget-wide vAA, vBB, vCC */ 1787 movzbl 2(rPC), %eax # eax <- BB 1788 movzbl 3(rPC), %ecx # ecx <- CC 1789 GET_VREG %eax, %eax # eax <- vBB (array object) 1790 GET_VREG %ecx, %ecx # ecx <- vCC (requested index) 1791 testl %eax, %eax # null array object? 1792 je common_errNullObject # bail if so 1793 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1794 jae common_errArrayIndex # index >= length, bail. 1795 leal MIRROR_WIDE_ARRAY_DATA_OFFSET(%eax,%ecx,8), %eax 1796 movq (%eax), %xmm0 # xmm0 <- vBB[vCC] 1797 SET_WIDE_FP_VREG %xmm0, rINST # vAA <- xmm0 1798 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1799 1800 /* ------------------------------ */ 1801 .balign 128 1802 .L_op_aget_object: /* 0x46 */ 1803 /* File: x86/op_aget_object.S */ 1804 /* 1805 * Array object get. vAA <- vBB[vCC]. 1806 * 1807 * for: aget-object 1808 */ 1809 /* op vAA, vBB, vCC */ 1810 movzbl 2(rPC), %eax # eax <- BB 1811 movzbl 3(rPC), %ecx # ecx <- CC 1812 GET_VREG %eax, %eax # eax <- vBB (array object) 1813 GET_VREG %ecx, %ecx # ecs <- vCC (requested index) 1814 EXPORT_PC 1815 movl %eax, OUT_ARG0(%esp) 1816 movl %ecx, OUT_ARG1(%esp) 1817 call SYMBOL(artAGetObjectFromMterp) # (array, index) 1818 movl rSELF, %ecx 1819 RESTORE_IBASE_FROM_SELF %ecx 1820 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 1821 jnz MterpException 1822 SET_VREG_OBJECT %eax, rINST 1823 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1824 1825 /* ------------------------------ */ 1826 .balign 128 1827 .L_op_aget_boolean: /* 0x47 */ 1828 /* File: x86/op_aget_boolean.S */ 1829 /* File: x86/op_aget.S */ 1830 /* 1831 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1832 * 1833 * for: aget, aget-boolean, aget-byte, aget-char, aget-short 1834 * 1835 */ 1836 /* op vAA, vBB, vCC */ 1837 movzbl 2(rPC), %eax # eax <- BB 1838 movzbl 3(rPC), %ecx # ecx <- CC 1839 GET_VREG %eax, %eax # eax <- vBB (array object) 1840 GET_VREG %ecx, %ecx # ecx <- vCC (requested index) 1841 testl %eax, %eax # null array object? 1842 je common_errNullObject # bail if so 1843 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1844 jae common_errArrayIndex # index >= length, bail. 1845 movzbl MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(%eax,%ecx,1), %eax 1846 SET_VREG %eax, rINST 1847 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1848 1849 1850 /* ------------------------------ */ 1851 .balign 128 1852 .L_op_aget_byte: /* 0x48 */ 1853 /* File: x86/op_aget_byte.S */ 1854 /* File: x86/op_aget.S */ 1855 /* 1856 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1857 * 1858 * for: aget, aget-boolean, aget-byte, aget-char, aget-short 1859 * 1860 */ 1861 /* op vAA, vBB, vCC */ 1862 movzbl 2(rPC), %eax # eax <- BB 1863 movzbl 3(rPC), %ecx # ecx <- CC 1864 GET_VREG %eax, %eax # eax <- vBB (array object) 1865 GET_VREG %ecx, %ecx # ecx <- vCC (requested index) 1866 testl %eax, %eax # null array object? 1867 je common_errNullObject # bail if so 1868 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1869 jae common_errArrayIndex # index >= length, bail. 1870 movsbl MIRROR_BYTE_ARRAY_DATA_OFFSET(%eax,%ecx,1), %eax 1871 SET_VREG %eax, rINST 1872 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1873 1874 1875 /* ------------------------------ */ 1876 .balign 128 1877 .L_op_aget_char: /* 0x49 */ 1878 /* File: x86/op_aget_char.S */ 1879 /* File: x86/op_aget.S */ 1880 /* 1881 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1882 * 1883 * for: aget, aget-boolean, aget-byte, aget-char, aget-short 1884 * 1885 */ 1886 /* op vAA, vBB, vCC */ 1887 movzbl 2(rPC), %eax # eax <- BB 1888 movzbl 3(rPC), %ecx # ecx <- CC 1889 GET_VREG %eax, %eax # eax <- vBB (array object) 1890 GET_VREG %ecx, %ecx # ecx <- vCC (requested index) 1891 testl %eax, %eax # null array object? 1892 je common_errNullObject # bail if so 1893 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1894 jae common_errArrayIndex # index >= length, bail. 1895 movzwl MIRROR_CHAR_ARRAY_DATA_OFFSET(%eax,%ecx,2), %eax 1896 SET_VREG %eax, rINST 1897 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1898 1899 1900 /* ------------------------------ */ 1901 .balign 128 1902 .L_op_aget_short: /* 0x4a */ 1903 /* File: x86/op_aget_short.S */ 1904 /* File: x86/op_aget.S */ 1905 /* 1906 * Array get, 32 bits or less. vAA <- vBB[vCC]. 1907 * 1908 * for: aget, aget-boolean, aget-byte, aget-char, aget-short 1909 * 1910 */ 1911 /* op vAA, vBB, vCC */ 1912 movzbl 2(rPC), %eax # eax <- BB 1913 movzbl 3(rPC), %ecx # ecx <- CC 1914 GET_VREG %eax, %eax # eax <- vBB (array object) 1915 GET_VREG %ecx, %ecx # ecx <- vCC (requested index) 1916 testl %eax, %eax # null array object? 1917 je common_errNullObject # bail if so 1918 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1919 jae common_errArrayIndex # index >= length, bail. 1920 movswl MIRROR_SHORT_ARRAY_DATA_OFFSET(%eax,%ecx,2), %eax 1921 SET_VREG %eax, rINST 1922 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1923 1924 1925 /* ------------------------------ */ 1926 .balign 128 1927 .L_op_aput: /* 0x4b */ 1928 /* File: x86/op_aput.S */ 1929 /* 1930 * Array put, 32 bits or less. vBB[vCC] <- vAA. 1931 * 1932 * for: aput, aput-boolean, aput-byte, aput-char, aput-short 1933 * 1934 */ 1935 /* op vAA, vBB, vCC */ 1936 movzbl 2(rPC), %eax # eax <- BB 1937 movzbl 3(rPC), %ecx # ecx <- CC 1938 GET_VREG %eax, %eax # eax <- vBB (array object) 1939 GET_VREG %ecx, %ecx # ecx <- vCC (requested index) 1940 testl %eax, %eax # null array object? 1941 je common_errNullObject # bail if so 1942 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1943 jae common_errArrayIndex # index >= length, bail. 1944 leal MIRROR_INT_ARRAY_DATA_OFFSET(%eax,%ecx,4), %eax 1945 GET_VREG rINST, rINST 1946 movl rINST, (%eax) 1947 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1948 1949 /* ------------------------------ */ 1950 .balign 128 1951 .L_op_aput_wide: /* 0x4c */ 1952 /* File: x86/op_aput_wide.S */ 1953 /* 1954 * Array put, 64 bits. vBB[vCC] <- vAA. 1955 * 1956 */ 1957 /* aput-wide vAA, vBB, vCC */ 1958 movzbl 2(rPC), %eax # eax <- BB 1959 movzbl 3(rPC), %ecx # ecx <- CC 1960 GET_VREG %eax, %eax # eax <- vBB (array object) 1961 GET_VREG %ecx, %ecx # ecx <- vCC (requested index) 1962 testl %eax, %eax # null array object? 1963 je common_errNullObject # bail if so 1964 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 1965 jae common_errArrayIndex # index >= length, bail. 1966 leal MIRROR_WIDE_ARRAY_DATA_OFFSET(%eax,%ecx,8), %eax 1967 GET_WIDE_FP_VREG %xmm0, rINST # xmm0 <- vAA 1968 movq %xmm0, (%eax) # vBB[vCC] <- xmm0 1969 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1970 1971 /* ------------------------------ */ 1972 .balign 128 1973 .L_op_aput_object: /* 0x4d */ 1974 /* File: x86/op_aput_object.S */ 1975 /* 1976 * Store an object into an array. vBB[vCC] <- vAA. 1977 */ 1978 /* op vAA, vBB, vCC */ 1979 EXPORT_PC 1980 leal OFF_FP_SHADOWFRAME(rFP), %eax 1981 movl %eax, OUT_ARG0(%esp) 1982 movl rPC, OUT_ARG1(%esp) 1983 REFRESH_INST 77 1984 movl rINST, OUT_ARG2(%esp) 1985 call SYMBOL(MterpAputObject) # (array, index) 1986 RESTORE_IBASE 1987 testb %al, %al 1988 jz MterpPossibleException 1989 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 1990 1991 /* ------------------------------ */ 1992 .balign 128 1993 .L_op_aput_boolean: /* 0x4e */ 1994 /* File: x86/op_aput_boolean.S */ 1995 /* File: x86/op_aput.S */ 1996 /* 1997 * Array put, 32 bits or less. vBB[vCC] <- vAA. 1998 * 1999 * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2000 * 2001 */ 2002 /* op vAA, vBB, vCC */ 2003 movzbl 2(rPC), %eax # eax <- BB 2004 movzbl 3(rPC), %ecx # ecx <- CC 2005 GET_VREG %eax, %eax # eax <- vBB (array object) 2006 GET_VREG %ecx, %ecx # ecx <- vCC (requested index) 2007 testl %eax, %eax # null array object? 2008 je common_errNullObject # bail if so 2009 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 2010 jae common_errArrayIndex # index >= length, bail. 2011 leal MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(%eax,%ecx,1), %eax 2012 GET_VREG rINST, rINST 2013 movb rINSTbl, (%eax) 2014 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2015 2016 2017 /* ------------------------------ */ 2018 .balign 128 2019 .L_op_aput_byte: /* 0x4f */ 2020 /* File: x86/op_aput_byte.S */ 2021 /* File: x86/op_aput.S */ 2022 /* 2023 * Array put, 32 bits or less. vBB[vCC] <- vAA. 2024 * 2025 * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2026 * 2027 */ 2028 /* op vAA, vBB, vCC */ 2029 movzbl 2(rPC), %eax # eax <- BB 2030 movzbl 3(rPC), %ecx # ecx <- CC 2031 GET_VREG %eax, %eax # eax <- vBB (array object) 2032 GET_VREG %ecx, %ecx # ecx <- vCC (requested index) 2033 testl %eax, %eax # null array object? 2034 je common_errNullObject # bail if so 2035 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 2036 jae common_errArrayIndex # index >= length, bail. 2037 leal MIRROR_BYTE_ARRAY_DATA_OFFSET(%eax,%ecx,1), %eax 2038 GET_VREG rINST, rINST 2039 movb rINSTbl, (%eax) 2040 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2041 2042 2043 /* ------------------------------ */ 2044 .balign 128 2045 .L_op_aput_char: /* 0x50 */ 2046 /* File: x86/op_aput_char.S */ 2047 /* File: x86/op_aput.S */ 2048 /* 2049 * Array put, 32 bits or less. vBB[vCC] <- vAA. 2050 * 2051 * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2052 * 2053 */ 2054 /* op vAA, vBB, vCC */ 2055 movzbl 2(rPC), %eax # eax <- BB 2056 movzbl 3(rPC), %ecx # ecx <- CC 2057 GET_VREG %eax, %eax # eax <- vBB (array object) 2058 GET_VREG %ecx, %ecx # ecx <- vCC (requested index) 2059 testl %eax, %eax # null array object? 2060 je common_errNullObject # bail if so 2061 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 2062 jae common_errArrayIndex # index >= length, bail. 2063 leal MIRROR_CHAR_ARRAY_DATA_OFFSET(%eax,%ecx,2), %eax 2064 GET_VREG rINST, rINST 2065 movw rINSTw, (%eax) 2066 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2067 2068 2069 /* ------------------------------ */ 2070 .balign 128 2071 .L_op_aput_short: /* 0x51 */ 2072 /* File: x86/op_aput_short.S */ 2073 /* File: x86/op_aput.S */ 2074 /* 2075 * Array put, 32 bits or less. vBB[vCC] <- vAA. 2076 * 2077 * for: aput, aput-boolean, aput-byte, aput-char, aput-short 2078 * 2079 */ 2080 /* op vAA, vBB, vCC */ 2081 movzbl 2(rPC), %eax # eax <- BB 2082 movzbl 3(rPC), %ecx # ecx <- CC 2083 GET_VREG %eax, %eax # eax <- vBB (array object) 2084 GET_VREG %ecx, %ecx # ecx <- vCC (requested index) 2085 testl %eax, %eax # null array object? 2086 je common_errNullObject # bail if so 2087 cmpl MIRROR_ARRAY_LENGTH_OFFSET(%eax), %ecx 2088 jae common_errArrayIndex # index >= length, bail. 2089 leal MIRROR_SHORT_ARRAY_DATA_OFFSET(%eax,%ecx,2), %eax 2090 GET_VREG rINST, rINST 2091 movw rINSTw, (%eax) 2092 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2093 2094 2095 /* ------------------------------ */ 2096 .balign 128 2097 .L_op_iget: /* 0x52 */ 2098 /* File: x86/op_iget.S */ 2099 /* 2100 * General instance field get. 2101 * 2102 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2103 */ 2104 EXPORT_PC 2105 movzwl 2(rPC), %eax # eax <- 0000CCCC 2106 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2107 movzbl rINSTbl, %ecx # ecx <- BA 2108 sarl $4, %ecx # ecx <- B 2109 GET_VREG %ecx, %ecx 2110 movl %ecx, OUT_ARG1(%esp) # the object pointer 2111 movl OFF_FP_METHOD(rFP), %eax 2112 movl %eax, OUT_ARG2(%esp) # referrer 2113 mov rSELF, %ecx 2114 movl %ecx, OUT_ARG3(%esp) # self 2115 call SYMBOL(artGet32InstanceFromCode) 2116 movl rSELF, %ecx 2117 RESTORE_IBASE_FROM_SELF %ecx 2118 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 2119 jnz MterpException # bail out 2120 andb $0xf, rINSTbl # rINST <- A 2121 .if 0 2122 SET_VREG_OBJECT %eax, rINST # fp[A] <-value 2123 .else 2124 SET_VREG %eax, rINST # fp[A] <-value 2125 .endif 2126 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2127 2128 /* ------------------------------ */ 2129 .balign 128 2130 .L_op_iget_wide: /* 0x53 */ 2131 /* File: x86/op_iget_wide.S */ 2132 /* 2133 * 64-bit instance field get. 2134 * 2135 * for: iget-wide 2136 */ 2137 EXPORT_PC 2138 movzwl 2(rPC), %eax # eax <- 0000CCCC 2139 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2140 movzbl rINSTbl, %ecx # ecx <- BA 2141 sarl $4, %ecx # ecx <- B 2142 GET_VREG %ecx, %ecx 2143 movl %ecx, OUT_ARG1(%esp) # the object pointer 2144 movl OFF_FP_METHOD(rFP), %eax 2145 movl %eax, OUT_ARG2(%esp) # referrer 2146 mov rSELF, %ecx 2147 movl %ecx, OUT_ARG3(%esp) # self 2148 call SYMBOL(artGet64InstanceFromCode) 2149 mov rSELF, %ecx 2150 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 2151 jnz MterpException # bail out 2152 andb $0xf, rINSTbl # rINST <- A 2153 SET_VREG %eax, rINST 2154 SET_VREG_HIGH %edx, rINST 2155 RESTORE_IBASE_FROM_SELF %ecx 2156 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2157 2158 /* ------------------------------ */ 2159 .balign 128 2160 .L_op_iget_object: /* 0x54 */ 2161 /* File: x86/op_iget_object.S */ 2162 /* File: x86/op_iget.S */ 2163 /* 2164 * General instance field get. 2165 * 2166 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2167 */ 2168 EXPORT_PC 2169 movzwl 2(rPC), %eax # eax <- 0000CCCC 2170 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2171 movzbl rINSTbl, %ecx # ecx <- BA 2172 sarl $4, %ecx # ecx <- B 2173 GET_VREG %ecx, %ecx 2174 movl %ecx, OUT_ARG1(%esp) # the object pointer 2175 movl OFF_FP_METHOD(rFP), %eax 2176 movl %eax, OUT_ARG2(%esp) # referrer 2177 mov rSELF, %ecx 2178 movl %ecx, OUT_ARG3(%esp) # self 2179 call SYMBOL(artGetObjInstanceFromCode) 2180 movl rSELF, %ecx 2181 RESTORE_IBASE_FROM_SELF %ecx 2182 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 2183 jnz MterpException # bail out 2184 andb $0xf, rINSTbl # rINST <- A 2185 .if 1 2186 SET_VREG_OBJECT %eax, rINST # fp[A] <-value 2187 .else 2188 SET_VREG %eax, rINST # fp[A] <-value 2189 .endif 2190 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2191 2192 2193 /* ------------------------------ */ 2194 .balign 128 2195 .L_op_iget_boolean: /* 0x55 */ 2196 /* File: x86/op_iget_boolean.S */ 2197 /* File: x86/op_iget.S */ 2198 /* 2199 * General instance field get. 2200 * 2201 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2202 */ 2203 EXPORT_PC 2204 movzwl 2(rPC), %eax # eax <- 0000CCCC 2205 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2206 movzbl rINSTbl, %ecx # ecx <- BA 2207 sarl $4, %ecx # ecx <- B 2208 GET_VREG %ecx, %ecx 2209 movl %ecx, OUT_ARG1(%esp) # the object pointer 2210 movl OFF_FP_METHOD(rFP), %eax 2211 movl %eax, OUT_ARG2(%esp) # referrer 2212 mov rSELF, %ecx 2213 movl %ecx, OUT_ARG3(%esp) # self 2214 call SYMBOL(artGetBooleanInstanceFromCode) 2215 movl rSELF, %ecx 2216 RESTORE_IBASE_FROM_SELF %ecx 2217 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 2218 jnz MterpException # bail out 2219 andb $0xf, rINSTbl # rINST <- A 2220 .if 0 2221 SET_VREG_OBJECT %eax, rINST # fp[A] <-value 2222 .else 2223 SET_VREG %eax, rINST # fp[A] <-value 2224 .endif 2225 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2226 2227 2228 /* ------------------------------ */ 2229 .balign 128 2230 .L_op_iget_byte: /* 0x56 */ 2231 /* File: x86/op_iget_byte.S */ 2232 /* File: x86/op_iget.S */ 2233 /* 2234 * General instance field get. 2235 * 2236 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2237 */ 2238 EXPORT_PC 2239 movzwl 2(rPC), %eax # eax <- 0000CCCC 2240 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2241 movzbl rINSTbl, %ecx # ecx <- BA 2242 sarl $4, %ecx # ecx <- B 2243 GET_VREG %ecx, %ecx 2244 movl %ecx, OUT_ARG1(%esp) # the object pointer 2245 movl OFF_FP_METHOD(rFP), %eax 2246 movl %eax, OUT_ARG2(%esp) # referrer 2247 mov rSELF, %ecx 2248 movl %ecx, OUT_ARG3(%esp) # self 2249 call SYMBOL(artGetByteInstanceFromCode) 2250 movl rSELF, %ecx 2251 RESTORE_IBASE_FROM_SELF %ecx 2252 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 2253 jnz MterpException # bail out 2254 andb $0xf, rINSTbl # rINST <- A 2255 .if 0 2256 SET_VREG_OBJECT %eax, rINST # fp[A] <-value 2257 .else 2258 SET_VREG %eax, rINST # fp[A] <-value 2259 .endif 2260 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2261 2262 2263 /* ------------------------------ */ 2264 .balign 128 2265 .L_op_iget_char: /* 0x57 */ 2266 /* File: x86/op_iget_char.S */ 2267 /* File: x86/op_iget.S */ 2268 /* 2269 * General instance field get. 2270 * 2271 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2272 */ 2273 EXPORT_PC 2274 movzwl 2(rPC), %eax # eax <- 0000CCCC 2275 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2276 movzbl rINSTbl, %ecx # ecx <- BA 2277 sarl $4, %ecx # ecx <- B 2278 GET_VREG %ecx, %ecx 2279 movl %ecx, OUT_ARG1(%esp) # the object pointer 2280 movl OFF_FP_METHOD(rFP), %eax 2281 movl %eax, OUT_ARG2(%esp) # referrer 2282 mov rSELF, %ecx 2283 movl %ecx, OUT_ARG3(%esp) # self 2284 call SYMBOL(artGetCharInstanceFromCode) 2285 movl rSELF, %ecx 2286 RESTORE_IBASE_FROM_SELF %ecx 2287 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 2288 jnz MterpException # bail out 2289 andb $0xf, rINSTbl # rINST <- A 2290 .if 0 2291 SET_VREG_OBJECT %eax, rINST # fp[A] <-value 2292 .else 2293 SET_VREG %eax, rINST # fp[A] <-value 2294 .endif 2295 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2296 2297 2298 /* ------------------------------ */ 2299 .balign 128 2300 .L_op_iget_short: /* 0x58 */ 2301 /* File: x86/op_iget_short.S */ 2302 /* File: x86/op_iget.S */ 2303 /* 2304 * General instance field get. 2305 * 2306 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short 2307 */ 2308 EXPORT_PC 2309 movzwl 2(rPC), %eax # eax <- 0000CCCC 2310 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2311 movzbl rINSTbl, %ecx # ecx <- BA 2312 sarl $4, %ecx # ecx <- B 2313 GET_VREG %ecx, %ecx 2314 movl %ecx, OUT_ARG1(%esp) # the object pointer 2315 movl OFF_FP_METHOD(rFP), %eax 2316 movl %eax, OUT_ARG2(%esp) # referrer 2317 mov rSELF, %ecx 2318 movl %ecx, OUT_ARG3(%esp) # self 2319 call SYMBOL(artGetShortInstanceFromCode) 2320 movl rSELF, %ecx 2321 RESTORE_IBASE_FROM_SELF %ecx 2322 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 2323 jnz MterpException # bail out 2324 andb $0xf, rINSTbl # rINST <- A 2325 .if 0 2326 SET_VREG_OBJECT %eax, rINST # fp[A] <-value 2327 .else 2328 SET_VREG %eax, rINST # fp[A] <-value 2329 .endif 2330 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2331 2332 2333 /* ------------------------------ */ 2334 .balign 128 2335 .L_op_iput: /* 0x59 */ 2336 /* File: x86/op_iput.S */ 2337 /* 2338 * General 32-bit instance field put. 2339 * 2340 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2341 */ 2342 /* op vA, vB, field@CCCC */ 2343 .extern artSet32InstanceFromMterp 2344 EXPORT_PC 2345 movzwl 2(rPC), %eax # eax<- 0000CCCC 2346 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2347 movzbl rINSTbl, %ecx # ecx<- BA 2348 sarl $4, %ecx # ecx<- B 2349 GET_VREG %ecx, %ecx 2350 movl %ecx, OUT_ARG1(%esp) # the object pointer 2351 andb $0xf, rINSTbl # rINST<- A 2352 GET_VREG %eax, rINST 2353 movl %eax, OUT_ARG2(%esp) # fp[A] 2354 movl OFF_FP_METHOD(rFP), %eax 2355 movl %eax, OUT_ARG3(%esp) # referrer 2356 call SYMBOL(artSet32InstanceFromMterp) 2357 testb %al, %al 2358 jnz MterpPossibleException 2359 RESTORE_IBASE 2360 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2361 2362 /* ------------------------------ */ 2363 .balign 128 2364 .L_op_iput_wide: /* 0x5a */ 2365 /* File: x86/op_iput_wide.S */ 2366 /* iput-wide vA, vB, field@CCCC */ 2367 .extern artSet64InstanceFromMterp 2368 EXPORT_PC 2369 movzwl 2(rPC), %eax # eax <- 0000CCCC 2370 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2371 movzbl rINSTbl,%ecx # ecx <- BA 2372 sarl $4,%ecx # ecx <- B 2373 GET_VREG %ecx, %ecx 2374 movl %ecx, OUT_ARG1(%esp) # the object pointer 2375 andb $0xf,rINSTbl # rINST <- A 2376 leal VREG_ADDRESS(rINST), %eax 2377 movl %eax, OUT_ARG2(%esp) # &fp[A] 2378 movl OFF_FP_METHOD(rFP), %eax 2379 movl %eax, OUT_ARG3(%esp) # referrer 2380 call SYMBOL(artSet64InstanceFromMterp) 2381 testb %al, %al 2382 jnz MterpPossibleException 2383 RESTORE_IBASE 2384 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2385 2386 /* ------------------------------ */ 2387 .balign 128 2388 .L_op_iput_object: /* 0x5b */ 2389 /* File: x86/op_iput_object.S */ 2390 EXPORT_PC 2391 leal OFF_FP_SHADOWFRAME(rFP), %eax 2392 movl %eax, OUT_ARG0(%esp) 2393 movl rPC, OUT_ARG1(%esp) 2394 REFRESH_INST 91 2395 movl rINST, OUT_ARG2(%esp) 2396 movl rSELF, %eax 2397 movl %eax, OUT_ARG3(%esp) 2398 call SYMBOL(MterpIputObject) 2399 testb %al, %al 2400 jz MterpException 2401 RESTORE_IBASE 2402 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2403 2404 /* ------------------------------ */ 2405 .balign 128 2406 .L_op_iput_boolean: /* 0x5c */ 2407 /* File: x86/op_iput_boolean.S */ 2408 /* File: x86/op_iput.S */ 2409 /* 2410 * General 32-bit instance field put. 2411 * 2412 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2413 */ 2414 /* op vA, vB, field@CCCC */ 2415 .extern artSet8InstanceFromMterp 2416 EXPORT_PC 2417 movzwl 2(rPC), %eax # eax<- 0000CCCC 2418 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2419 movzbl rINSTbl, %ecx # ecx<- BA 2420 sarl $4, %ecx # ecx<- B 2421 GET_VREG %ecx, %ecx 2422 movl %ecx, OUT_ARG1(%esp) # the object pointer 2423 andb $0xf, rINSTbl # rINST<- A 2424 GET_VREG %eax, rINST 2425 movl %eax, OUT_ARG2(%esp) # fp[A] 2426 movl OFF_FP_METHOD(rFP), %eax 2427 movl %eax, OUT_ARG3(%esp) # referrer 2428 call SYMBOL(artSet8InstanceFromMterp) 2429 testb %al, %al 2430 jnz MterpPossibleException 2431 RESTORE_IBASE 2432 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2433 2434 2435 /* ------------------------------ */ 2436 .balign 128 2437 .L_op_iput_byte: /* 0x5d */ 2438 /* File: x86/op_iput_byte.S */ 2439 /* File: x86/op_iput.S */ 2440 /* 2441 * General 32-bit instance field put. 2442 * 2443 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2444 */ 2445 /* op vA, vB, field@CCCC */ 2446 .extern artSet8InstanceFromMterp 2447 EXPORT_PC 2448 movzwl 2(rPC), %eax # eax<- 0000CCCC 2449 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2450 movzbl rINSTbl, %ecx # ecx<- BA 2451 sarl $4, %ecx # ecx<- B 2452 GET_VREG %ecx, %ecx 2453 movl %ecx, OUT_ARG1(%esp) # the object pointer 2454 andb $0xf, rINSTbl # rINST<- A 2455 GET_VREG %eax, rINST 2456 movl %eax, OUT_ARG2(%esp) # fp[A] 2457 movl OFF_FP_METHOD(rFP), %eax 2458 movl %eax, OUT_ARG3(%esp) # referrer 2459 call SYMBOL(artSet8InstanceFromMterp) 2460 testb %al, %al 2461 jnz MterpPossibleException 2462 RESTORE_IBASE 2463 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2464 2465 2466 /* ------------------------------ */ 2467 .balign 128 2468 .L_op_iput_char: /* 0x5e */ 2469 /* File: x86/op_iput_char.S */ 2470 /* File: x86/op_iput.S */ 2471 /* 2472 * General 32-bit instance field put. 2473 * 2474 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2475 */ 2476 /* op vA, vB, field@CCCC */ 2477 .extern artSet16InstanceFromMterp 2478 EXPORT_PC 2479 movzwl 2(rPC), %eax # eax<- 0000CCCC 2480 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2481 movzbl rINSTbl, %ecx # ecx<- BA 2482 sarl $4, %ecx # ecx<- B 2483 GET_VREG %ecx, %ecx 2484 movl %ecx, OUT_ARG1(%esp) # the object pointer 2485 andb $0xf, rINSTbl # rINST<- A 2486 GET_VREG %eax, rINST 2487 movl %eax, OUT_ARG2(%esp) # fp[A] 2488 movl OFF_FP_METHOD(rFP), %eax 2489 movl %eax, OUT_ARG3(%esp) # referrer 2490 call SYMBOL(artSet16InstanceFromMterp) 2491 testb %al, %al 2492 jnz MterpPossibleException 2493 RESTORE_IBASE 2494 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2495 2496 2497 /* ------------------------------ */ 2498 .balign 128 2499 .L_op_iput_short: /* 0x5f */ 2500 /* File: x86/op_iput_short.S */ 2501 /* File: x86/op_iput.S */ 2502 /* 2503 * General 32-bit instance field put. 2504 * 2505 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short 2506 */ 2507 /* op vA, vB, field@CCCC */ 2508 .extern artSet16InstanceFromMterp 2509 EXPORT_PC 2510 movzwl 2(rPC), %eax # eax<- 0000CCCC 2511 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2512 movzbl rINSTbl, %ecx # ecx<- BA 2513 sarl $4, %ecx # ecx<- B 2514 GET_VREG %ecx, %ecx 2515 movl %ecx, OUT_ARG1(%esp) # the object pointer 2516 andb $0xf, rINSTbl # rINST<- A 2517 GET_VREG %eax, rINST 2518 movl %eax, OUT_ARG2(%esp) # fp[A] 2519 movl OFF_FP_METHOD(rFP), %eax 2520 movl %eax, OUT_ARG3(%esp) # referrer 2521 call SYMBOL(artSet16InstanceFromMterp) 2522 testb %al, %al 2523 jnz MterpPossibleException 2524 RESTORE_IBASE 2525 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2526 2527 2528 /* ------------------------------ */ 2529 .balign 128 2530 .L_op_sget: /* 0x60 */ 2531 /* File: x86/op_sget.S */ 2532 /* 2533 * General SGET handler wrapper. 2534 * 2535 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2536 */ 2537 /* op vAA, field@BBBB */ 2538 .extern MterpGet32Static 2539 EXPORT_PC 2540 movzwl 2(rPC), %eax 2541 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2542 movl OFF_FP_METHOD(rFP), %eax 2543 movl %eax, OUT_ARG1(%esp) # referrer 2544 movl rSELF, %ecx 2545 movl %ecx, OUT_ARG2(%esp) # self 2546 call SYMBOL(MterpGet32Static) 2547 movl rSELF, %ecx 2548 RESTORE_IBASE_FROM_SELF %ecx 2549 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 2550 jnz MterpException 2551 .if 0 2552 SET_VREG_OBJECT %eax, rINST # fp[A] <- value 2553 .else 2554 SET_VREG %eax, rINST # fp[A] <- value 2555 .endif 2556 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2557 2558 /* ------------------------------ */ 2559 .balign 128 2560 .L_op_sget_wide: /* 0x61 */ 2561 /* File: x86/op_sget_wide.S */ 2562 /* 2563 * SGET_WIDE handler wrapper. 2564 * 2565 */ 2566 /* sget-wide vAA, field@BBBB */ 2567 .extern MterpGet64Static 2568 EXPORT_PC 2569 movzwl 2(rPC), %eax 2570 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2571 movl OFF_FP_METHOD(rFP), %eax 2572 movl %eax, OUT_ARG1(%esp) # referrer 2573 movl rSELF, %ecx 2574 movl %ecx, OUT_ARG2(%esp) # self 2575 call SYMBOL(MterpGet64Static) 2576 movl rSELF, %ecx 2577 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 2578 jnz MterpException 2579 SET_VREG %eax, rINST # fp[A]<- low part 2580 SET_VREG_HIGH %edx, rINST # fp[A+1]<- high part 2581 RESTORE_IBASE_FROM_SELF %ecx 2582 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2583 2584 /* ------------------------------ */ 2585 .balign 128 2586 .L_op_sget_object: /* 0x62 */ 2587 /* File: x86/op_sget_object.S */ 2588 /* File: x86/op_sget.S */ 2589 /* 2590 * General SGET handler wrapper. 2591 * 2592 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2593 */ 2594 /* op vAA, field@BBBB */ 2595 .extern MterpGetObjStatic 2596 EXPORT_PC 2597 movzwl 2(rPC), %eax 2598 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2599 movl OFF_FP_METHOD(rFP), %eax 2600 movl %eax, OUT_ARG1(%esp) # referrer 2601 movl rSELF, %ecx 2602 movl %ecx, OUT_ARG2(%esp) # self 2603 call SYMBOL(MterpGetObjStatic) 2604 movl rSELF, %ecx 2605 RESTORE_IBASE_FROM_SELF %ecx 2606 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 2607 jnz MterpException 2608 .if 1 2609 SET_VREG_OBJECT %eax, rINST # fp[A] <- value 2610 .else 2611 SET_VREG %eax, rINST # fp[A] <- value 2612 .endif 2613 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2614 2615 2616 /* ------------------------------ */ 2617 .balign 128 2618 .L_op_sget_boolean: /* 0x63 */ 2619 /* File: x86/op_sget_boolean.S */ 2620 /* File: x86/op_sget.S */ 2621 /* 2622 * General SGET handler wrapper. 2623 * 2624 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2625 */ 2626 /* op vAA, field@BBBB */ 2627 .extern MterpGetBooleanStatic 2628 EXPORT_PC 2629 movzwl 2(rPC), %eax 2630 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2631 movl OFF_FP_METHOD(rFP), %eax 2632 movl %eax, OUT_ARG1(%esp) # referrer 2633 movl rSELF, %ecx 2634 movl %ecx, OUT_ARG2(%esp) # self 2635 call SYMBOL(MterpGetBooleanStatic) 2636 movl rSELF, %ecx 2637 RESTORE_IBASE_FROM_SELF %ecx 2638 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 2639 jnz MterpException 2640 .if 0 2641 SET_VREG_OBJECT %eax, rINST # fp[A] <- value 2642 .else 2643 SET_VREG %eax, rINST # fp[A] <- value 2644 .endif 2645 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2646 2647 2648 /* ------------------------------ */ 2649 .balign 128 2650 .L_op_sget_byte: /* 0x64 */ 2651 /* File: x86/op_sget_byte.S */ 2652 /* File: x86/op_sget.S */ 2653 /* 2654 * General SGET handler wrapper. 2655 * 2656 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2657 */ 2658 /* op vAA, field@BBBB */ 2659 .extern MterpGetByteStatic 2660 EXPORT_PC 2661 movzwl 2(rPC), %eax 2662 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2663 movl OFF_FP_METHOD(rFP), %eax 2664 movl %eax, OUT_ARG1(%esp) # referrer 2665 movl rSELF, %ecx 2666 movl %ecx, OUT_ARG2(%esp) # self 2667 call SYMBOL(MterpGetByteStatic) 2668 movl rSELF, %ecx 2669 RESTORE_IBASE_FROM_SELF %ecx 2670 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 2671 jnz MterpException 2672 .if 0 2673 SET_VREG_OBJECT %eax, rINST # fp[A] <- value 2674 .else 2675 SET_VREG %eax, rINST # fp[A] <- value 2676 .endif 2677 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2678 2679 2680 /* ------------------------------ */ 2681 .balign 128 2682 .L_op_sget_char: /* 0x65 */ 2683 /* File: x86/op_sget_char.S */ 2684 /* File: x86/op_sget.S */ 2685 /* 2686 * General SGET handler wrapper. 2687 * 2688 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2689 */ 2690 /* op vAA, field@BBBB */ 2691 .extern MterpGetCharStatic 2692 EXPORT_PC 2693 movzwl 2(rPC), %eax 2694 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2695 movl OFF_FP_METHOD(rFP), %eax 2696 movl %eax, OUT_ARG1(%esp) # referrer 2697 movl rSELF, %ecx 2698 movl %ecx, OUT_ARG2(%esp) # self 2699 call SYMBOL(MterpGetCharStatic) 2700 movl rSELF, %ecx 2701 RESTORE_IBASE_FROM_SELF %ecx 2702 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 2703 jnz MterpException 2704 .if 0 2705 SET_VREG_OBJECT %eax, rINST # fp[A] <- value 2706 .else 2707 SET_VREG %eax, rINST # fp[A] <- value 2708 .endif 2709 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2710 2711 2712 /* ------------------------------ */ 2713 .balign 128 2714 .L_op_sget_short: /* 0x66 */ 2715 /* File: x86/op_sget_short.S */ 2716 /* File: x86/op_sget.S */ 2717 /* 2718 * General SGET handler wrapper. 2719 * 2720 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short 2721 */ 2722 /* op vAA, field@BBBB */ 2723 .extern MterpGetShortStatic 2724 EXPORT_PC 2725 movzwl 2(rPC), %eax 2726 movl %eax, OUT_ARG0(%esp) # field ref CCCC 2727 movl OFF_FP_METHOD(rFP), %eax 2728 movl %eax, OUT_ARG1(%esp) # referrer 2729 movl rSELF, %ecx 2730 movl %ecx, OUT_ARG2(%esp) # self 2731 call SYMBOL(MterpGetShortStatic) 2732 movl rSELF, %ecx 2733 RESTORE_IBASE_FROM_SELF %ecx 2734 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 2735 jnz MterpException 2736 .if 0 2737 SET_VREG_OBJECT %eax, rINST # fp[A] <- value 2738 .else 2739 SET_VREG %eax, rINST # fp[A] <- value 2740 .endif 2741 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2742 2743 2744 /* ------------------------------ */ 2745 .balign 128 2746 .L_op_sput: /* 0x67 */ 2747 /* File: x86/op_sput.S */ 2748 /* 2749 * General SPUT handler wrapper. 2750 * 2751 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2752 */ 2753 /* op vAA, field@BBBB */ 2754 .extern MterpSet32Static 2755 EXPORT_PC 2756 movzwl 2(rPC), %eax 2757 movl %eax, OUT_ARG0(%esp) # field ref BBBB 2758 GET_VREG rINST, rINST 2759 movl rINST, OUT_ARG1(%esp) # fp[AA] 2760 movl OFF_FP_METHOD(rFP), %eax 2761 movl %eax, OUT_ARG2(%esp) # referrer 2762 movl rSELF, %ecx 2763 movl %ecx, OUT_ARG3(%esp) # self 2764 call SYMBOL(MterpSet32Static) 2765 testb %al, %al 2766 jnz MterpException 2767 RESTORE_IBASE 2768 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2769 2770 /* ------------------------------ */ 2771 .balign 128 2772 .L_op_sput_wide: /* 0x68 */ 2773 /* File: x86/op_sput_wide.S */ 2774 /* 2775 * SPUT_WIDE handler wrapper. 2776 * 2777 */ 2778 /* sput-wide vAA, field@BBBB */ 2779 .extern MterpSet64Static 2780 EXPORT_PC 2781 movzwl 2(rPC), %eax 2782 movl %eax, OUT_ARG0(%esp) # field ref BBBB 2783 leal VREG_ADDRESS(rINST), %eax 2784 movl %eax, OUT_ARG1(%esp) # &fp[AA] 2785 movl OFF_FP_METHOD(rFP), %eax 2786 movl %eax, OUT_ARG2(%esp) # referrer 2787 movl rSELF, %ecx 2788 movl %ecx, OUT_ARG3(%esp) # self 2789 call SYMBOL(MterpSet64Static) 2790 testb %al, %al 2791 jnz MterpException 2792 RESTORE_IBASE 2793 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2794 2795 /* ------------------------------ */ 2796 .balign 128 2797 .L_op_sput_object: /* 0x69 */ 2798 /* File: x86/op_sput_object.S */ 2799 EXPORT_PC 2800 leal OFF_FP_SHADOWFRAME(rFP), %eax 2801 movl %eax, OUT_ARG0(%esp) 2802 movl rPC, OUT_ARG1(%esp) 2803 REFRESH_INST 105 2804 movl rINST, OUT_ARG2(%esp) 2805 movl rSELF, %ecx 2806 movl %ecx, OUT_ARG3(%esp) 2807 call SYMBOL(MterpSputObject) 2808 testb %al, %al 2809 jz MterpException 2810 RESTORE_IBASE 2811 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2812 2813 /* ------------------------------ */ 2814 .balign 128 2815 .L_op_sput_boolean: /* 0x6a */ 2816 /* File: x86/op_sput_boolean.S */ 2817 /* File: x86/op_sput.S */ 2818 /* 2819 * General SPUT handler wrapper. 2820 * 2821 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2822 */ 2823 /* op vAA, field@BBBB */ 2824 .extern MterpSetBooleanStatic 2825 EXPORT_PC 2826 movzwl 2(rPC), %eax 2827 movl %eax, OUT_ARG0(%esp) # field ref BBBB 2828 GET_VREG rINST, rINST 2829 movl rINST, OUT_ARG1(%esp) # fp[AA] 2830 movl OFF_FP_METHOD(rFP), %eax 2831 movl %eax, OUT_ARG2(%esp) # referrer 2832 movl rSELF, %ecx 2833 movl %ecx, OUT_ARG3(%esp) # self 2834 call SYMBOL(MterpSetBooleanStatic) 2835 testb %al, %al 2836 jnz MterpException 2837 RESTORE_IBASE 2838 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2839 2840 2841 /* ------------------------------ */ 2842 .balign 128 2843 .L_op_sput_byte: /* 0x6b */ 2844 /* File: x86/op_sput_byte.S */ 2845 /* File: x86/op_sput.S */ 2846 /* 2847 * General SPUT handler wrapper. 2848 * 2849 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2850 */ 2851 /* op vAA, field@BBBB */ 2852 .extern MterpSetByteStatic 2853 EXPORT_PC 2854 movzwl 2(rPC), %eax 2855 movl %eax, OUT_ARG0(%esp) # field ref BBBB 2856 GET_VREG rINST, rINST 2857 movl rINST, OUT_ARG1(%esp) # fp[AA] 2858 movl OFF_FP_METHOD(rFP), %eax 2859 movl %eax, OUT_ARG2(%esp) # referrer 2860 movl rSELF, %ecx 2861 movl %ecx, OUT_ARG3(%esp) # self 2862 call SYMBOL(MterpSetByteStatic) 2863 testb %al, %al 2864 jnz MterpException 2865 RESTORE_IBASE 2866 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2867 2868 2869 /* ------------------------------ */ 2870 .balign 128 2871 .L_op_sput_char: /* 0x6c */ 2872 /* File: x86/op_sput_char.S */ 2873 /* File: x86/op_sput.S */ 2874 /* 2875 * General SPUT handler wrapper. 2876 * 2877 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2878 */ 2879 /* op vAA, field@BBBB */ 2880 .extern MterpSetCharStatic 2881 EXPORT_PC 2882 movzwl 2(rPC), %eax 2883 movl %eax, OUT_ARG0(%esp) # field ref BBBB 2884 GET_VREG rINST, rINST 2885 movl rINST, OUT_ARG1(%esp) # fp[AA] 2886 movl OFF_FP_METHOD(rFP), %eax 2887 movl %eax, OUT_ARG2(%esp) # referrer 2888 movl rSELF, %ecx 2889 movl %ecx, OUT_ARG3(%esp) # self 2890 call SYMBOL(MterpSetCharStatic) 2891 testb %al, %al 2892 jnz MterpException 2893 RESTORE_IBASE 2894 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2895 2896 2897 /* ------------------------------ */ 2898 .balign 128 2899 .L_op_sput_short: /* 0x6d */ 2900 /* File: x86/op_sput_short.S */ 2901 /* File: x86/op_sput.S */ 2902 /* 2903 * General SPUT handler wrapper. 2904 * 2905 * for: sput, sput-boolean, sput-byte, sput-char, sput-short 2906 */ 2907 /* op vAA, field@BBBB */ 2908 .extern MterpSetShortStatic 2909 EXPORT_PC 2910 movzwl 2(rPC), %eax 2911 movl %eax, OUT_ARG0(%esp) # field ref BBBB 2912 GET_VREG rINST, rINST 2913 movl rINST, OUT_ARG1(%esp) # fp[AA] 2914 movl OFF_FP_METHOD(rFP), %eax 2915 movl %eax, OUT_ARG2(%esp) # referrer 2916 movl rSELF, %ecx 2917 movl %ecx, OUT_ARG3(%esp) # self 2918 call SYMBOL(MterpSetShortStatic) 2919 testb %al, %al 2920 jnz MterpException 2921 RESTORE_IBASE 2922 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 2923 2924 2925 /* ------------------------------ */ 2926 .balign 128 2927 .L_op_invoke_virtual: /* 0x6e */ 2928 /* File: x86/op_invoke_virtual.S */ 2929 /* File: x86/invoke.S */ 2930 /* 2931 * Generic invoke handler wrapper. 2932 */ 2933 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2934 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2935 .extern MterpInvokeVirtual 2936 EXPORT_PC 2937 movl rSELF, %ecx 2938 movl %ecx, OUT_ARG0(%esp) 2939 leal OFF_FP_SHADOWFRAME(rFP), %eax 2940 movl %eax, OUT_ARG1(%esp) 2941 movl rPC, OUT_ARG2(%esp) 2942 REFRESH_INST 110 2943 movl rINST, OUT_ARG3(%esp) 2944 call SYMBOL(MterpInvokeVirtual) 2945 testb %al, %al 2946 jz MterpException 2947 ADVANCE_PC 3 2948 call SYMBOL(MterpShouldSwitchInterpreters) 2949 testb %al, %al 2950 jnz MterpFallback 2951 RESTORE_IBASE 2952 FETCH_INST 2953 GOTO_NEXT 2954 2955 /* 2956 * Handle a virtual method call. 2957 * 2958 * for: invoke-virtual, invoke-virtual/range 2959 */ 2960 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2961 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2962 2963 /* ------------------------------ */ 2964 .balign 128 2965 .L_op_invoke_super: /* 0x6f */ 2966 /* File: x86/op_invoke_super.S */ 2967 /* File: x86/invoke.S */ 2968 /* 2969 * Generic invoke handler wrapper. 2970 */ 2971 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2972 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 2973 .extern MterpInvokeSuper 2974 EXPORT_PC 2975 movl rSELF, %ecx 2976 movl %ecx, OUT_ARG0(%esp) 2977 leal OFF_FP_SHADOWFRAME(rFP), %eax 2978 movl %eax, OUT_ARG1(%esp) 2979 movl rPC, OUT_ARG2(%esp) 2980 REFRESH_INST 111 2981 movl rINST, OUT_ARG3(%esp) 2982 call SYMBOL(MterpInvokeSuper) 2983 testb %al, %al 2984 jz MterpException 2985 ADVANCE_PC 3 2986 call SYMBOL(MterpShouldSwitchInterpreters) 2987 testb %al, %al 2988 jnz MterpFallback 2989 RESTORE_IBASE 2990 FETCH_INST 2991 GOTO_NEXT 2992 2993 /* 2994 * Handle a "super" method call. 2995 * 2996 * for: invoke-super, invoke-super/range 2997 */ 2998 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 2999 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3000 3001 /* ------------------------------ */ 3002 .balign 128 3003 .L_op_invoke_direct: /* 0x70 */ 3004 /* File: x86/op_invoke_direct.S */ 3005 /* File: x86/invoke.S */ 3006 /* 3007 * Generic invoke handler wrapper. 3008 */ 3009 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3010 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3011 .extern MterpInvokeDirect 3012 EXPORT_PC 3013 movl rSELF, %ecx 3014 movl %ecx, OUT_ARG0(%esp) 3015 leal OFF_FP_SHADOWFRAME(rFP), %eax 3016 movl %eax, OUT_ARG1(%esp) 3017 movl rPC, OUT_ARG2(%esp) 3018 REFRESH_INST 112 3019 movl rINST, OUT_ARG3(%esp) 3020 call SYMBOL(MterpInvokeDirect) 3021 testb %al, %al 3022 jz MterpException 3023 ADVANCE_PC 3 3024 call SYMBOL(MterpShouldSwitchInterpreters) 3025 testb %al, %al 3026 jnz MterpFallback 3027 RESTORE_IBASE 3028 FETCH_INST 3029 GOTO_NEXT 3030 3031 3032 /* ------------------------------ */ 3033 .balign 128 3034 .L_op_invoke_static: /* 0x71 */ 3035 /* File: x86/op_invoke_static.S */ 3036 /* File: x86/invoke.S */ 3037 /* 3038 * Generic invoke handler wrapper. 3039 */ 3040 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3041 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3042 .extern MterpInvokeStatic 3043 EXPORT_PC 3044 movl rSELF, %ecx 3045 movl %ecx, OUT_ARG0(%esp) 3046 leal OFF_FP_SHADOWFRAME(rFP), %eax 3047 movl %eax, OUT_ARG1(%esp) 3048 movl rPC, OUT_ARG2(%esp) 3049 REFRESH_INST 113 3050 movl rINST, OUT_ARG3(%esp) 3051 call SYMBOL(MterpInvokeStatic) 3052 testb %al, %al 3053 jz MterpException 3054 ADVANCE_PC 3 3055 call SYMBOL(MterpShouldSwitchInterpreters) 3056 testb %al, %al 3057 jnz MterpFallback 3058 RESTORE_IBASE 3059 FETCH_INST 3060 GOTO_NEXT 3061 3062 3063 3064 /* ------------------------------ */ 3065 .balign 128 3066 .L_op_invoke_interface: /* 0x72 */ 3067 /* File: x86/op_invoke_interface.S */ 3068 /* File: x86/invoke.S */ 3069 /* 3070 * Generic invoke handler wrapper. 3071 */ 3072 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3073 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3074 .extern MterpInvokeInterface 3075 EXPORT_PC 3076 movl rSELF, %ecx 3077 movl %ecx, OUT_ARG0(%esp) 3078 leal OFF_FP_SHADOWFRAME(rFP), %eax 3079 movl %eax, OUT_ARG1(%esp) 3080 movl rPC, OUT_ARG2(%esp) 3081 REFRESH_INST 114 3082 movl rINST, OUT_ARG3(%esp) 3083 call SYMBOL(MterpInvokeInterface) 3084 testb %al, %al 3085 jz MterpException 3086 ADVANCE_PC 3 3087 call SYMBOL(MterpShouldSwitchInterpreters) 3088 testb %al, %al 3089 jnz MterpFallback 3090 RESTORE_IBASE 3091 FETCH_INST 3092 GOTO_NEXT 3093 3094 /* 3095 * Handle an interface method call. 3096 * 3097 * for: invoke-interface, invoke-interface/range 3098 */ 3099 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3100 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3101 3102 /* ------------------------------ */ 3103 .balign 128 3104 .L_op_return_void_no_barrier: /* 0x73 */ 3105 /* File: x86/op_return_void_no_barrier.S */ 3106 movl rSELF, %eax 3107 testl $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax) 3108 jz 1f 3109 movl %eax, OUT_ARG0(%esp) 3110 call SYMBOL(MterpSuspendCheck) 3111 1: 3112 xorl %eax, %eax 3113 xorl %ecx, %ecx 3114 jmp MterpReturn 3115 3116 /* ------------------------------ */ 3117 .balign 128 3118 .L_op_invoke_virtual_range: /* 0x74 */ 3119 /* File: x86/op_invoke_virtual_range.S */ 3120 /* File: x86/invoke.S */ 3121 /* 3122 * Generic invoke handler wrapper. 3123 */ 3124 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3125 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3126 .extern MterpInvokeVirtualRange 3127 EXPORT_PC 3128 movl rSELF, %ecx 3129 movl %ecx, OUT_ARG0(%esp) 3130 leal OFF_FP_SHADOWFRAME(rFP), %eax 3131 movl %eax, OUT_ARG1(%esp) 3132 movl rPC, OUT_ARG2(%esp) 3133 REFRESH_INST 116 3134 movl rINST, OUT_ARG3(%esp) 3135 call SYMBOL(MterpInvokeVirtualRange) 3136 testb %al, %al 3137 jz MterpException 3138 ADVANCE_PC 3 3139 call SYMBOL(MterpShouldSwitchInterpreters) 3140 testb %al, %al 3141 jnz MterpFallback 3142 RESTORE_IBASE 3143 FETCH_INST 3144 GOTO_NEXT 3145 3146 3147 /* ------------------------------ */ 3148 .balign 128 3149 .L_op_invoke_super_range: /* 0x75 */ 3150 /* File: x86/op_invoke_super_range.S */ 3151 /* File: x86/invoke.S */ 3152 /* 3153 * Generic invoke handler wrapper. 3154 */ 3155 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3156 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3157 .extern MterpInvokeSuperRange 3158 EXPORT_PC 3159 movl rSELF, %ecx 3160 movl %ecx, OUT_ARG0(%esp) 3161 leal OFF_FP_SHADOWFRAME(rFP), %eax 3162 movl %eax, OUT_ARG1(%esp) 3163 movl rPC, OUT_ARG2(%esp) 3164 REFRESH_INST 117 3165 movl rINST, OUT_ARG3(%esp) 3166 call SYMBOL(MterpInvokeSuperRange) 3167 testb %al, %al 3168 jz MterpException 3169 ADVANCE_PC 3 3170 call SYMBOL(MterpShouldSwitchInterpreters) 3171 testb %al, %al 3172 jnz MterpFallback 3173 RESTORE_IBASE 3174 FETCH_INST 3175 GOTO_NEXT 3176 3177 3178 /* ------------------------------ */ 3179 .balign 128 3180 .L_op_invoke_direct_range: /* 0x76 */ 3181 /* File: x86/op_invoke_direct_range.S */ 3182 /* File: x86/invoke.S */ 3183 /* 3184 * Generic invoke handler wrapper. 3185 */ 3186 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3187 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3188 .extern MterpInvokeDirectRange 3189 EXPORT_PC 3190 movl rSELF, %ecx 3191 movl %ecx, OUT_ARG0(%esp) 3192 leal OFF_FP_SHADOWFRAME(rFP), %eax 3193 movl %eax, OUT_ARG1(%esp) 3194 movl rPC, OUT_ARG2(%esp) 3195 REFRESH_INST 118 3196 movl rINST, OUT_ARG3(%esp) 3197 call SYMBOL(MterpInvokeDirectRange) 3198 testb %al, %al 3199 jz MterpException 3200 ADVANCE_PC 3 3201 call SYMBOL(MterpShouldSwitchInterpreters) 3202 testb %al, %al 3203 jnz MterpFallback 3204 RESTORE_IBASE 3205 FETCH_INST 3206 GOTO_NEXT 3207 3208 3209 /* ------------------------------ */ 3210 .balign 128 3211 .L_op_invoke_static_range: /* 0x77 */ 3212 /* File: x86/op_invoke_static_range.S */ 3213 /* File: x86/invoke.S */ 3214 /* 3215 * Generic invoke handler wrapper. 3216 */ 3217 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3218 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3219 .extern MterpInvokeStaticRange 3220 EXPORT_PC 3221 movl rSELF, %ecx 3222 movl %ecx, OUT_ARG0(%esp) 3223 leal OFF_FP_SHADOWFRAME(rFP), %eax 3224 movl %eax, OUT_ARG1(%esp) 3225 movl rPC, OUT_ARG2(%esp) 3226 REFRESH_INST 119 3227 movl rINST, OUT_ARG3(%esp) 3228 call SYMBOL(MterpInvokeStaticRange) 3229 testb %al, %al 3230 jz MterpException 3231 ADVANCE_PC 3 3232 call SYMBOL(MterpShouldSwitchInterpreters) 3233 testb %al, %al 3234 jnz MterpFallback 3235 RESTORE_IBASE 3236 FETCH_INST 3237 GOTO_NEXT 3238 3239 3240 /* ------------------------------ */ 3241 .balign 128 3242 .L_op_invoke_interface_range: /* 0x78 */ 3243 /* File: x86/op_invoke_interface_range.S */ 3244 /* File: x86/invoke.S */ 3245 /* 3246 * Generic invoke handler wrapper. 3247 */ 3248 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 3249 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 3250 .extern MterpInvokeInterfaceRange 3251 EXPORT_PC 3252 movl rSELF, %ecx 3253 movl %ecx, OUT_ARG0(%esp) 3254 leal OFF_FP_SHADOWFRAME(rFP), %eax 3255 movl %eax, OUT_ARG1(%esp) 3256 movl rPC, OUT_ARG2(%esp) 3257 REFRESH_INST 120 3258 movl rINST, OUT_ARG3(%esp) 3259 call SYMBOL(MterpInvokeInterfaceRange) 3260 testb %al, %al 3261 jz MterpException 3262 ADVANCE_PC 3 3263 call SYMBOL(MterpShouldSwitchInterpreters) 3264 testb %al, %al 3265 jnz MterpFallback 3266 RESTORE_IBASE 3267 FETCH_INST 3268 GOTO_NEXT 3269 3270 3271 /* ------------------------------ */ 3272 .balign 128 3273 .L_op_unused_79: /* 0x79 */ 3274 /* File: x86/op_unused_79.S */ 3275 /* File: x86/unused.S */ 3276 /* 3277 * Bail to reference interpreter to throw. 3278 */ 3279 jmp MterpFallback 3280 3281 3282 /* ------------------------------ */ 3283 .balign 128 3284 .L_op_unused_7a: /* 0x7a */ 3285 /* File: x86/op_unused_7a.S */ 3286 /* File: x86/unused.S */ 3287 /* 3288 * Bail to reference interpreter to throw. 3289 */ 3290 jmp MterpFallback 3291 3292 3293 /* ------------------------------ */ 3294 .balign 128 3295 .L_op_neg_int: /* 0x7b */ 3296 /* File: x86/op_neg_int.S */ 3297 /* File: x86/unop.S */ 3298 /* 3299 * Generic 32-bit unary operation. Provide an "instr" line that 3300 * specifies an instruction that performs "result = op eax". 3301 */ 3302 /* unop vA, vB */ 3303 movzbl rINSTbl,%ecx # ecx <- A+ 3304 sarl $4,rINST # rINST <- B 3305 GET_VREG %eax, rINST # eax <- vB 3306 andb $0xf,%cl # ecx <- A 3307 negl %eax 3308 SET_VREG %eax, %ecx 3309 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3310 3311 3312 /* ------------------------------ */ 3313 .balign 128 3314 .L_op_not_int: /* 0x7c */ 3315 /* File: x86/op_not_int.S */ 3316 /* File: x86/unop.S */ 3317 /* 3318 * Generic 32-bit unary operation. Provide an "instr" line that 3319 * specifies an instruction that performs "result = op eax". 3320 */ 3321 /* unop vA, vB */ 3322 movzbl rINSTbl,%ecx # ecx <- A+ 3323 sarl $4,rINST # rINST <- B 3324 GET_VREG %eax, rINST # eax <- vB 3325 andb $0xf,%cl # ecx <- A 3326 notl %eax 3327 SET_VREG %eax, %ecx 3328 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3329 3330 3331 /* ------------------------------ */ 3332 .balign 128 3333 .L_op_neg_long: /* 0x7d */ 3334 /* File: x86/op_neg_long.S */ 3335 /* unop vA, vB */ 3336 movzbl rINSTbl, %ecx # ecx <- BA 3337 sarl $4, %ecx # ecx <- B 3338 andb $0xf, rINSTbl # rINST <- A 3339 GET_VREG %eax, %ecx # eax <- v[B+0] 3340 GET_VREG_HIGH %ecx, %ecx # ecx <- v[B+1] 3341 negl %eax 3342 adcl $0, %ecx 3343 negl %ecx 3344 SET_VREG %eax, rINST # v[A+0] <- eax 3345 SET_VREG_HIGH %ecx, rINST # v[A+1] <- ecx 3346 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3347 3348 3349 /* ------------------------------ */ 3350 .balign 128 3351 .L_op_not_long: /* 0x7e */ 3352 /* File: x86/op_not_long.S */ 3353 /* unop vA, vB */ 3354 movzbl rINSTbl, %ecx # ecx <- BA 3355 sarl $4, %ecx # ecx <- B 3356 andb $0xf, rINSTbl # rINST <- A 3357 GET_VREG %eax, %ecx # eax <- v[B+0] 3358 GET_VREG_HIGH %ecx, %ecx # ecx <- v[B+1] 3359 notl %eax 3360 notl %ecx 3361 SET_VREG %eax, rINST # v[A+0] <- eax 3362 SET_VREG_HIGH %ecx, rINST # v[A+1] <- ecx 3363 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3364 3365 /* ------------------------------ */ 3366 .balign 128 3367 .L_op_neg_float: /* 0x7f */ 3368 /* File: x86/op_neg_float.S */ 3369 /* File: x86/fpcvt.S */ 3370 /* 3371 * Generic 32-bit FP conversion operation. 3372 */ 3373 /* unop vA, vB */ 3374 movzbl rINSTbl, %ecx # ecx <- A+ 3375 sarl $4, rINST # rINST <- B 3376 flds VREG_ADDRESS(rINST) # %st0 <- vB 3377 andb $0xf, %cl # ecx <- A 3378 fchs 3379 fstps VREG_ADDRESS(%ecx) # vA <- %st0 3380 .if 0 3381 CLEAR_WIDE_REF %ecx 3382 .else 3383 CLEAR_REF %ecx 3384 .endif 3385 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3386 3387 3388 /* ------------------------------ */ 3389 .balign 128 3390 .L_op_neg_double: /* 0x80 */ 3391 /* File: x86/op_neg_double.S */ 3392 /* File: x86/fpcvt.S */ 3393 /* 3394 * Generic 32-bit FP conversion operation. 3395 */ 3396 /* unop vA, vB */ 3397 movzbl rINSTbl, %ecx # ecx <- A+ 3398 sarl $4, rINST # rINST <- B 3399 fldl VREG_ADDRESS(rINST) # %st0 <- vB 3400 andb $0xf, %cl # ecx <- A 3401 fchs 3402 fstpl VREG_ADDRESS(%ecx) # vA <- %st0 3403 .if 1 3404 CLEAR_WIDE_REF %ecx 3405 .else 3406 CLEAR_REF %ecx 3407 .endif 3408 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3409 3410 3411 /* ------------------------------ */ 3412 .balign 128 3413 .L_op_int_to_long: /* 0x81 */ 3414 /* File: x86/op_int_to_long.S */ 3415 /* int to long vA, vB */ 3416 movzbl rINSTbl, %eax # eax <- +A 3417 sarl $4, %eax # eax <- B 3418 GET_VREG %eax, %eax # eax <- vB 3419 andb $0xf, rINSTbl # rINST <- A 3420 movl rIBASE, %ecx # cltd trashes rIBASE/edx 3421 cltd # rINST:eax<- sssssssBBBBBBBB 3422 SET_VREG_HIGH rIBASE, rINST # v[A+1] <- rIBASE 3423 SET_VREG %eax, rINST # v[A+0] <- %eax 3424 movl %ecx, rIBASE 3425 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3426 3427 3428 /* ------------------------------ */ 3429 .balign 128 3430 .L_op_int_to_float: /* 0x82 */ 3431 /* File: x86/op_int_to_float.S */ 3432 /* File: x86/fpcvt.S */ 3433 /* 3434 * Generic 32-bit FP conversion operation. 3435 */ 3436 /* unop vA, vB */ 3437 movzbl rINSTbl, %ecx # ecx <- A+ 3438 sarl $4, rINST # rINST <- B 3439 fildl VREG_ADDRESS(rINST) # %st0 <- vB 3440 andb $0xf, %cl # ecx <- A 3441 3442 fstps VREG_ADDRESS(%ecx) # vA <- %st0 3443 .if 0 3444 CLEAR_WIDE_REF %ecx 3445 .else 3446 CLEAR_REF %ecx 3447 .endif 3448 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3449 3450 3451 /* ------------------------------ */ 3452 .balign 128 3453 .L_op_int_to_double: /* 0x83 */ 3454 /* File: x86/op_int_to_double.S */ 3455 /* File: x86/fpcvt.S */ 3456 /* 3457 * Generic 32-bit FP conversion operation. 3458 */ 3459 /* unop vA, vB */ 3460 movzbl rINSTbl, %ecx # ecx <- A+ 3461 sarl $4, rINST # rINST <- B 3462 fildl VREG_ADDRESS(rINST) # %st0 <- vB 3463 andb $0xf, %cl # ecx <- A 3464 3465 fstpl VREG_ADDRESS(%ecx) # vA <- %st0 3466 .if 1 3467 CLEAR_WIDE_REF %ecx 3468 .else 3469 CLEAR_REF %ecx 3470 .endif 3471 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3472 3473 3474 /* ------------------------------ */ 3475 .balign 128 3476 .L_op_long_to_int: /* 0x84 */ 3477 /* File: x86/op_long_to_int.S */ 3478 /* we ignore the high word, making this equivalent to a 32-bit reg move */ 3479 /* File: x86/op_move.S */ 3480 /* for move, move-object, long-to-int */ 3481 /* op vA, vB */ 3482 movzbl rINSTbl, %eax # eax <- BA 3483 andb $0xf, %al # eax <- A 3484 shrl $4, rINST # rINST <- B 3485 GET_VREG rINST, rINST 3486 .if 0 3487 SET_VREG_OBJECT rINST, %eax # fp[A] <- fp[B] 3488 .else 3489 SET_VREG rINST, %eax # fp[A] <- fp[B] 3490 .endif 3491 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3492 3493 3494 /* ------------------------------ */ 3495 .balign 128 3496 .L_op_long_to_float: /* 0x85 */ 3497 /* File: x86/op_long_to_float.S */ 3498 /* File: x86/fpcvt.S */ 3499 /* 3500 * Generic 32-bit FP conversion operation. 3501 */ 3502 /* unop vA, vB */ 3503 movzbl rINSTbl, %ecx # ecx <- A+ 3504 sarl $4, rINST # rINST <- B 3505 fildll VREG_ADDRESS(rINST) # %st0 <- vB 3506 andb $0xf, %cl # ecx <- A 3507 3508 fstps VREG_ADDRESS(%ecx) # vA <- %st0 3509 .if 0 3510 CLEAR_WIDE_REF %ecx 3511 .else 3512 CLEAR_REF %ecx 3513 .endif 3514 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3515 3516 3517 /* ------------------------------ */ 3518 .balign 128 3519 .L_op_long_to_double: /* 0x86 */ 3520 /* File: x86/op_long_to_double.S */ 3521 /* File: x86/fpcvt.S */ 3522 /* 3523 * Generic 32-bit FP conversion operation. 3524 */ 3525 /* unop vA, vB */ 3526 movzbl rINSTbl, %ecx # ecx <- A+ 3527 sarl $4, rINST # rINST <- B 3528 fildll VREG_ADDRESS(rINST) # %st0 <- vB 3529 andb $0xf, %cl # ecx <- A 3530 3531 fstpl VREG_ADDRESS(%ecx) # vA <- %st0 3532 .if 1 3533 CLEAR_WIDE_REF %ecx 3534 .else 3535 CLEAR_REF %ecx 3536 .endif 3537 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3538 3539 3540 /* ------------------------------ */ 3541 .balign 128 3542 .L_op_float_to_int: /* 0x87 */ 3543 /* File: x86/op_float_to_int.S */ 3544 /* File: x86/cvtfp_int.S */ 3545 /* On fp to int conversions, Java requires that 3546 * if the result > maxint, it should be clamped to maxint. If it is less 3547 * than minint, it should be clamped to minint. If it is a nan, the result 3548 * should be zero. Further, the rounding mode is to truncate. This model 3549 * differs from what is delivered normally via the x86 fpu, so we have 3550 * to play some games. 3551 */ 3552 /* float/double to int/long vA, vB */ 3553 movzbl rINSTbl, %ecx # ecx <- A+ 3554 sarl $4, rINST # rINST <- B 3555 .if 0 3556 fldl VREG_ADDRESS(rINST) # %st0 <- vB 3557 .else 3558 flds VREG_ADDRESS(rINST) # %st0 <- vB 3559 .endif 3560 ftst 3561 fnstcw LOCAL0(%esp) # remember original rounding mode 3562 movzwl LOCAL0(%esp), %eax 3563 movb $0xc, %ah 3564 movw %ax, LOCAL0+2(%esp) 3565 fldcw LOCAL0+2(%esp) # set "to zero" rounding mode 3566 andb $0xf, %cl # ecx <- A 3567 .if 0 3568 fistpll VREG_ADDRESS(%ecx) # convert and store 3569 .else 3570 fistpl VREG_ADDRESS(%ecx) # convert and store 3571 .endif 3572 fldcw LOCAL0(%esp) # restore previous rounding mode 3573 .if 0 3574 movl $0x80000000, %eax 3575 xorl VREG_HIGH_ADDRESS(%ecx), %eax 3576 orl VREG_ADDRESS(%ecx), %eax 3577 .else 3578 cmpl $0x80000000, VREG_ADDRESS(%ecx) 3579 .endif 3580 je .Lop_float_to_int_special_case # fix up result 3581 3582 .Lop_float_to_int_finish: 3583 xor %eax, %eax 3584 mov %eax, VREG_REF_ADDRESS(%ecx) 3585 .if 0 3586 mov %eax, VREG_REF_HIGH_ADDRESS(%ecx) 3587 .endif 3588 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3589 3590 .Lop_float_to_int_special_case: 3591 fnstsw %ax 3592 sahf 3593 jp .Lop_float_to_int_isNaN 3594 adcl $-1, VREG_ADDRESS(%ecx) 3595 .if 0 3596 adcl $-1, VREG_HIGH_ADDRESS(%ecx) 3597 .endif 3598 jmp .Lop_float_to_int_finish 3599 .Lop_float_to_int_isNaN: 3600 movl $0, VREG_ADDRESS(%ecx) 3601 .if 0 3602 movl $0, VREG_HIGH_ADDRESS(%ecx) 3603 .endif 3604 jmp .Lop_float_to_int_finish 3605 3606 3607 /* ------------------------------ */ 3608 .balign 128 3609 .L_op_float_to_long: /* 0x88 */ 3610 /* File: x86/op_float_to_long.S */ 3611 /* File: x86/cvtfp_int.S */ 3612 /* On fp to int conversions, Java requires that 3613 * if the result > maxint, it should be clamped to maxint. If it is less 3614 * than minint, it should be clamped to minint. If it is a nan, the result 3615 * should be zero. Further, the rounding mode is to truncate. This model 3616 * differs from what is delivered normally via the x86 fpu, so we have 3617 * to play some games. 3618 */ 3619 /* float/double to int/long vA, vB */ 3620 movzbl rINSTbl, %ecx # ecx <- A+ 3621 sarl $4, rINST # rINST <- B 3622 .if 0 3623 fldl VREG_ADDRESS(rINST) # %st0 <- vB 3624 .else 3625 flds VREG_ADDRESS(rINST) # %st0 <- vB 3626 .endif 3627 ftst 3628 fnstcw LOCAL0(%esp) # remember original rounding mode 3629 movzwl LOCAL0(%esp), %eax 3630 movb $0xc, %ah 3631 movw %ax, LOCAL0+2(%esp) 3632 fldcw LOCAL0+2(%esp) # set "to zero" rounding mode 3633 andb $0xf, %cl # ecx <- A 3634 .if 1 3635 fistpll VREG_ADDRESS(%ecx) # convert and store 3636 .else 3637 fistpl VREG_ADDRESS(%ecx) # convert and store 3638 .endif 3639 fldcw LOCAL0(%esp) # restore previous rounding mode 3640 .if 1 3641 movl $0x80000000, %eax 3642 xorl VREG_HIGH_ADDRESS(%ecx), %eax 3643 orl VREG_ADDRESS(%ecx), %eax 3644 .else 3645 cmpl $0x80000000, VREG_ADDRESS(%ecx) 3646 .endif 3647 je .Lop_float_to_long_special_case # fix up result 3648 3649 .Lop_float_to_long_finish: 3650 xor %eax, %eax 3651 mov %eax, VREG_REF_ADDRESS(%ecx) 3652 .if 1 3653 mov %eax, VREG_REF_HIGH_ADDRESS(%ecx) 3654 .endif 3655 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3656 3657 .Lop_float_to_long_special_case: 3658 fnstsw %ax 3659 sahf 3660 jp .Lop_float_to_long_isNaN 3661 adcl $-1, VREG_ADDRESS(%ecx) 3662 .if 1 3663 adcl $-1, VREG_HIGH_ADDRESS(%ecx) 3664 .endif 3665 jmp .Lop_float_to_long_finish 3666 .Lop_float_to_long_isNaN: 3667 movl $0, VREG_ADDRESS(%ecx) 3668 .if 1 3669 movl $0, VREG_HIGH_ADDRESS(%ecx) 3670 .endif 3671 jmp .Lop_float_to_long_finish 3672 3673 3674 /* ------------------------------ */ 3675 .balign 128 3676 .L_op_float_to_double: /* 0x89 */ 3677 /* File: x86/op_float_to_double.S */ 3678 /* File: x86/fpcvt.S */ 3679 /* 3680 * Generic 32-bit FP conversion operation. 3681 */ 3682 /* unop vA, vB */ 3683 movzbl rINSTbl, %ecx # ecx <- A+ 3684 sarl $4, rINST # rINST <- B 3685 flds VREG_ADDRESS(rINST) # %st0 <- vB 3686 andb $0xf, %cl # ecx <- A 3687 3688 fstpl VREG_ADDRESS(%ecx) # vA <- %st0 3689 .if 1 3690 CLEAR_WIDE_REF %ecx 3691 .else 3692 CLEAR_REF %ecx 3693 .endif 3694 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3695 3696 3697 /* ------------------------------ */ 3698 .balign 128 3699 .L_op_double_to_int: /* 0x8a */ 3700 /* File: x86/op_double_to_int.S */ 3701 /* File: x86/cvtfp_int.S */ 3702 /* On fp to int conversions, Java requires that 3703 * if the result > maxint, it should be clamped to maxint. If it is less 3704 * than minint, it should be clamped to minint. If it is a nan, the result 3705 * should be zero. Further, the rounding mode is to truncate. This model 3706 * differs from what is delivered normally via the x86 fpu, so we have 3707 * to play some games. 3708 */ 3709 /* float/double to int/long vA, vB */ 3710 movzbl rINSTbl, %ecx # ecx <- A+ 3711 sarl $4, rINST # rINST <- B 3712 .if 1 3713 fldl VREG_ADDRESS(rINST) # %st0 <- vB 3714 .else 3715 flds VREG_ADDRESS(rINST) # %st0 <- vB 3716 .endif 3717 ftst 3718 fnstcw LOCAL0(%esp) # remember original rounding mode 3719 movzwl LOCAL0(%esp), %eax 3720 movb $0xc, %ah 3721 movw %ax, LOCAL0+2(%esp) 3722 fldcw LOCAL0+2(%esp) # set "to zero" rounding mode 3723 andb $0xf, %cl # ecx <- A 3724 .if 0 3725 fistpll VREG_ADDRESS(%ecx) # convert and store 3726 .else 3727 fistpl VREG_ADDRESS(%ecx) # convert and store 3728 .endif 3729 fldcw LOCAL0(%esp) # restore previous rounding mode 3730 .if 0 3731 movl $0x80000000, %eax 3732 xorl VREG_HIGH_ADDRESS(%ecx), %eax 3733 orl VREG_ADDRESS(%ecx), %eax 3734 .else 3735 cmpl $0x80000000, VREG_ADDRESS(%ecx) 3736 .endif 3737 je .Lop_double_to_int_special_case # fix up result 3738 3739 .Lop_double_to_int_finish: 3740 xor %eax, %eax 3741 mov %eax, VREG_REF_ADDRESS(%ecx) 3742 .if 0 3743 mov %eax, VREG_REF_HIGH_ADDRESS(%ecx) 3744 .endif 3745 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3746 3747 .Lop_double_to_int_special_case: 3748 fnstsw %ax 3749 sahf 3750 jp .Lop_double_to_int_isNaN 3751 adcl $-1, VREG_ADDRESS(%ecx) 3752 .if 0 3753 adcl $-1, VREG_HIGH_ADDRESS(%ecx) 3754 .endif 3755 jmp .Lop_double_to_int_finish 3756 .Lop_double_to_int_isNaN: 3757 movl $0, VREG_ADDRESS(%ecx) 3758 .if 0 3759 movl $0, VREG_HIGH_ADDRESS(%ecx) 3760 .endif 3761 jmp .Lop_double_to_int_finish 3762 3763 3764 /* ------------------------------ */ 3765 .balign 128 3766 .L_op_double_to_long: /* 0x8b */ 3767 /* File: x86/op_double_to_long.S */ 3768 /* File: x86/cvtfp_int.S */ 3769 /* On fp to int conversions, Java requires that 3770 * if the result > maxint, it should be clamped to maxint. If it is less 3771 * than minint, it should be clamped to minint. If it is a nan, the result 3772 * should be zero. Further, the rounding mode is to truncate. This model 3773 * differs from what is delivered normally via the x86 fpu, so we have 3774 * to play some games. 3775 */ 3776 /* float/double to int/long vA, vB */ 3777 movzbl rINSTbl, %ecx # ecx <- A+ 3778 sarl $4, rINST # rINST <- B 3779 .if 1 3780 fldl VREG_ADDRESS(rINST) # %st0 <- vB 3781 .else 3782 flds VREG_ADDRESS(rINST) # %st0 <- vB 3783 .endif 3784 ftst 3785 fnstcw LOCAL0(%esp) # remember original rounding mode 3786 movzwl LOCAL0(%esp), %eax 3787 movb $0xc, %ah 3788 movw %ax, LOCAL0+2(%esp) 3789 fldcw LOCAL0+2(%esp) # set "to zero" rounding mode 3790 andb $0xf, %cl # ecx <- A 3791 .if 1 3792 fistpll VREG_ADDRESS(%ecx) # convert and store 3793 .else 3794 fistpl VREG_ADDRESS(%ecx) # convert and store 3795 .endif 3796 fldcw LOCAL0(%esp) # restore previous rounding mode 3797 .if 1 3798 movl $0x80000000, %eax 3799 xorl VREG_HIGH_ADDRESS(%ecx), %eax 3800 orl VREG_ADDRESS(%ecx), %eax 3801 .else 3802 cmpl $0x80000000, VREG_ADDRESS(%ecx) 3803 .endif 3804 je .Lop_double_to_long_special_case # fix up result 3805 3806 .Lop_double_to_long_finish: 3807 xor %eax, %eax 3808 mov %eax, VREG_REF_ADDRESS(%ecx) 3809 .if 1 3810 mov %eax, VREG_REF_HIGH_ADDRESS(%ecx) 3811 .endif 3812 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3813 3814 .Lop_double_to_long_special_case: 3815 fnstsw %ax 3816 sahf 3817 jp .Lop_double_to_long_isNaN 3818 adcl $-1, VREG_ADDRESS(%ecx) 3819 .if 1 3820 adcl $-1, VREG_HIGH_ADDRESS(%ecx) 3821 .endif 3822 jmp .Lop_double_to_long_finish 3823 .Lop_double_to_long_isNaN: 3824 movl $0, VREG_ADDRESS(%ecx) 3825 .if 1 3826 movl $0, VREG_HIGH_ADDRESS(%ecx) 3827 .endif 3828 jmp .Lop_double_to_long_finish 3829 3830 3831 /* ------------------------------ */ 3832 .balign 128 3833 .L_op_double_to_float: /* 0x8c */ 3834 /* File: x86/op_double_to_float.S */ 3835 /* File: x86/fpcvt.S */ 3836 /* 3837 * Generic 32-bit FP conversion operation. 3838 */ 3839 /* unop vA, vB */ 3840 movzbl rINSTbl, %ecx # ecx <- A+ 3841 sarl $4, rINST # rINST <- B 3842 fldl VREG_ADDRESS(rINST) # %st0 <- vB 3843 andb $0xf, %cl # ecx <- A 3844 3845 fstps VREG_ADDRESS(%ecx) # vA <- %st0 3846 .if 0 3847 CLEAR_WIDE_REF %ecx 3848 .else 3849 CLEAR_REF %ecx 3850 .endif 3851 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3852 3853 3854 /* ------------------------------ */ 3855 .balign 128 3856 .L_op_int_to_byte: /* 0x8d */ 3857 /* File: x86/op_int_to_byte.S */ 3858 /* File: x86/unop.S */ 3859 /* 3860 * Generic 32-bit unary operation. Provide an "instr" line that 3861 * specifies an instruction that performs "result = op eax". 3862 */ 3863 /* unop vA, vB */ 3864 movzbl rINSTbl,%ecx # ecx <- A+ 3865 sarl $4,rINST # rINST <- B 3866 GET_VREG %eax, rINST # eax <- vB 3867 andb $0xf,%cl # ecx <- A 3868 movsbl %al, %eax 3869 SET_VREG %eax, %ecx 3870 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3871 3872 3873 /* ------------------------------ */ 3874 .balign 128 3875 .L_op_int_to_char: /* 0x8e */ 3876 /* File: x86/op_int_to_char.S */ 3877 /* File: x86/unop.S */ 3878 /* 3879 * Generic 32-bit unary operation. Provide an "instr" line that 3880 * specifies an instruction that performs "result = op eax". 3881 */ 3882 /* unop vA, vB */ 3883 movzbl rINSTbl,%ecx # ecx <- A+ 3884 sarl $4,rINST # rINST <- B 3885 GET_VREG %eax, rINST # eax <- vB 3886 andb $0xf,%cl # ecx <- A 3887 movzwl %ax,%eax 3888 SET_VREG %eax, %ecx 3889 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3890 3891 3892 /* ------------------------------ */ 3893 .balign 128 3894 .L_op_int_to_short: /* 0x8f */ 3895 /* File: x86/op_int_to_short.S */ 3896 /* File: x86/unop.S */ 3897 /* 3898 * Generic 32-bit unary operation. Provide an "instr" line that 3899 * specifies an instruction that performs "result = op eax". 3900 */ 3901 /* unop vA, vB */ 3902 movzbl rINSTbl,%ecx # ecx <- A+ 3903 sarl $4,rINST # rINST <- B 3904 GET_VREG %eax, rINST # eax <- vB 3905 andb $0xf,%cl # ecx <- A 3906 movswl %ax, %eax 3907 SET_VREG %eax, %ecx 3908 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 3909 3910 3911 /* ------------------------------ */ 3912 .balign 128 3913 .L_op_add_int: /* 0x90 */ 3914 /* File: x86/op_add_int.S */ 3915 /* File: x86/binop.S */ 3916 /* 3917 * Generic 32-bit binary operation. Provide an "instr" line that 3918 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)". 3919 * This could be an x86 instruction or a function call. (If the result 3920 * comes back in a register other than eax, you can override "result".) 3921 * 3922 * For: add-int, sub-int, and-int, or-int, 3923 * xor-int, shl-int, shr-int, ushr-int 3924 */ 3925 /* binop vAA, vBB, vCC */ 3926 movzbl 2(rPC), %eax # eax <- BB 3927 movzbl 3(rPC), %ecx # ecx <- CC 3928 GET_VREG %eax, %eax # eax <- vBB 3929 addl (rFP,%ecx,4), %eax # ex: addl (rFP,%ecx,4),%eax 3930 SET_VREG %eax, rINST 3931 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 3932 3933 3934 /* ------------------------------ */ 3935 .balign 128 3936 .L_op_sub_int: /* 0x91 */ 3937 /* File: x86/op_sub_int.S */ 3938 /* File: x86/binop.S */ 3939 /* 3940 * Generic 32-bit binary operation. Provide an "instr" line that 3941 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)". 3942 * This could be an x86 instruction or a function call. (If the result 3943 * comes back in a register other than eax, you can override "result".) 3944 * 3945 * For: add-int, sub-int, and-int, or-int, 3946 * xor-int, shl-int, shr-int, ushr-int 3947 */ 3948 /* binop vAA, vBB, vCC */ 3949 movzbl 2(rPC), %eax # eax <- BB 3950 movzbl 3(rPC), %ecx # ecx <- CC 3951 GET_VREG %eax, %eax # eax <- vBB 3952 subl (rFP,%ecx,4), %eax # ex: addl (rFP,%ecx,4),%eax 3953 SET_VREG %eax, rINST 3954 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 3955 3956 3957 /* ------------------------------ */ 3958 .balign 128 3959 .L_op_mul_int: /* 0x92 */ 3960 /* File: x86/op_mul_int.S */ 3961 /* 3962 * 32-bit binary multiplication. 3963 */ 3964 /* mul vAA, vBB, vCC */ 3965 movzbl 2(rPC), %eax # eax <- BB 3966 movzbl 3(rPC), %ecx # ecx <- CC 3967 GET_VREG %eax, %eax # eax <- vBB 3968 mov rIBASE, LOCAL0(%esp) 3969 imull (rFP,%ecx,4), %eax # trashes rIBASE/edx 3970 mov LOCAL0(%esp), rIBASE 3971 SET_VREG %eax, rINST 3972 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 3973 3974 /* ------------------------------ */ 3975 .balign 128 3976 .L_op_div_int: /* 0x93 */ 3977 /* File: x86/op_div_int.S */ 3978 /* File: x86/bindiv.S */ 3979 /* 3980 * 32-bit binary div/rem operation. Handles special case of op0=minint and 3981 * op1=-1. 3982 */ 3983 /* div/rem vAA, vBB, vCC */ 3984 movzbl 2(rPC), %eax # eax <- BB 3985 movzbl 3(rPC), %ecx # ecx <- CC 3986 GET_VREG %eax, %eax # eax <- vBB 3987 GET_VREG %ecx, %ecx # ecx <- vCC 3988 mov rIBASE, LOCAL0(%esp) 3989 testl %ecx, %ecx 3990 je common_errDivideByZero 3991 movl %eax, %edx 3992 orl %ecx, %edx 3993 testl $0xFFFFFF00, %edx # If both arguments are less 3994 # than 8-bit and +ve 3995 jz .Lop_div_int_8 # Do 8-bit divide 3996 testl $0xFFFF0000, %edx # If both arguments are less 3997 # than 16-bit and +ve 3998 jz .Lop_div_int_16 # Do 16-bit divide 3999 cmpl $-1, %ecx 4000 jne .Lop_div_int_32 4001 cmpl $0x80000000, %eax 4002 jne .Lop_div_int_32 4003 movl $0x80000000, %eax 4004 jmp .Lop_div_int_finish 4005 .Lop_div_int_32: 4006 cltd 4007 idivl %ecx 4008 jmp .Lop_div_int_finish 4009 .Lop_div_int_8: 4010 div %cl # 8-bit divide otherwise. 4011 # Remainder in %ah, quotient in %al 4012 .if 0 4013 movl %eax, %edx 4014 shr $8, %edx 4015 .else 4016 andl $0x000000FF, %eax 4017 .endif 4018 jmp .Lop_div_int_finish 4019 .Lop_div_int_16: 4020 xorl %edx, %edx # Clear %edx before divide 4021 div %cx 4022 .Lop_div_int_finish: 4023 SET_VREG %eax, rINST 4024 mov LOCAL0(%esp), rIBASE 4025 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4026 4027 4028 /* ------------------------------ */ 4029 .balign 128 4030 .L_op_rem_int: /* 0x94 */ 4031 /* File: x86/op_rem_int.S */ 4032 /* File: x86/bindiv.S */ 4033 /* 4034 * 32-bit binary div/rem operation. Handles special case of op0=minint and 4035 * op1=-1. 4036 */ 4037 /* div/rem vAA, vBB, vCC */ 4038 movzbl 2(rPC), %eax # eax <- BB 4039 movzbl 3(rPC), %ecx # ecx <- CC 4040 GET_VREG %eax, %eax # eax <- vBB 4041 GET_VREG %ecx, %ecx # ecx <- vCC 4042 mov rIBASE, LOCAL0(%esp) 4043 testl %ecx, %ecx 4044 je common_errDivideByZero 4045 movl %eax, %edx 4046 orl %ecx, %edx 4047 testl $0xFFFFFF00, %edx # If both arguments are less 4048 # than 8-bit and +ve 4049 jz .Lop_rem_int_8 # Do 8-bit divide 4050 testl $0xFFFF0000, %edx # If both arguments are less 4051 # than 16-bit and +ve 4052 jz .Lop_rem_int_16 # Do 16-bit divide 4053 cmpl $-1, %ecx 4054 jne .Lop_rem_int_32 4055 cmpl $0x80000000, %eax 4056 jne .Lop_rem_int_32 4057 movl $0, rIBASE 4058 jmp .Lop_rem_int_finish 4059 .Lop_rem_int_32: 4060 cltd 4061 idivl %ecx 4062 jmp .Lop_rem_int_finish 4063 .Lop_rem_int_8: 4064 div %cl # 8-bit divide otherwise. 4065 # Remainder in %ah, quotient in %al 4066 .if 1 4067 movl %eax, %edx 4068 shr $8, %edx 4069 .else 4070 andl $0x000000FF, %eax 4071 .endif 4072 jmp .Lop_rem_int_finish 4073 .Lop_rem_int_16: 4074 xorl %edx, %edx # Clear %edx before divide 4075 div %cx 4076 .Lop_rem_int_finish: 4077 SET_VREG rIBASE, rINST 4078 mov LOCAL0(%esp), rIBASE 4079 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4080 4081 4082 /* ------------------------------ */ 4083 .balign 128 4084 .L_op_and_int: /* 0x95 */ 4085 /* File: x86/op_and_int.S */ 4086 /* File: x86/binop.S */ 4087 /* 4088 * Generic 32-bit binary operation. Provide an "instr" line that 4089 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)". 4090 * This could be an x86 instruction or a function call. (If the result 4091 * comes back in a register other than eax, you can override "result".) 4092 * 4093 * For: add-int, sub-int, and-int, or-int, 4094 * xor-int, shl-int, shr-int, ushr-int 4095 */ 4096 /* binop vAA, vBB, vCC */ 4097 movzbl 2(rPC), %eax # eax <- BB 4098 movzbl 3(rPC), %ecx # ecx <- CC 4099 GET_VREG %eax, %eax # eax <- vBB 4100 andl (rFP,%ecx,4), %eax # ex: addl (rFP,%ecx,4),%eax 4101 SET_VREG %eax, rINST 4102 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4103 4104 4105 /* ------------------------------ */ 4106 .balign 128 4107 .L_op_or_int: /* 0x96 */ 4108 /* File: x86/op_or_int.S */ 4109 /* File: x86/binop.S */ 4110 /* 4111 * Generic 32-bit binary operation. Provide an "instr" line that 4112 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)". 4113 * This could be an x86 instruction or a function call. (If the result 4114 * comes back in a register other than eax, you can override "result".) 4115 * 4116 * For: add-int, sub-int, and-int, or-int, 4117 * xor-int, shl-int, shr-int, ushr-int 4118 */ 4119 /* binop vAA, vBB, vCC */ 4120 movzbl 2(rPC), %eax # eax <- BB 4121 movzbl 3(rPC), %ecx # ecx <- CC 4122 GET_VREG %eax, %eax # eax <- vBB 4123 orl (rFP,%ecx,4), %eax # ex: addl (rFP,%ecx,4),%eax 4124 SET_VREG %eax, rINST 4125 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4126 4127 4128 /* ------------------------------ */ 4129 .balign 128 4130 .L_op_xor_int: /* 0x97 */ 4131 /* File: x86/op_xor_int.S */ 4132 /* File: x86/binop.S */ 4133 /* 4134 * Generic 32-bit binary operation. Provide an "instr" line that 4135 * specifies an instruction that performs "result = eax op (rFP,%ecx,4)". 4136 * This could be an x86 instruction or a function call. (If the result 4137 * comes back in a register other than eax, you can override "result".) 4138 * 4139 * For: add-int, sub-int, and-int, or-int, 4140 * xor-int, shl-int, shr-int, ushr-int 4141 */ 4142 /* binop vAA, vBB, vCC */ 4143 movzbl 2(rPC), %eax # eax <- BB 4144 movzbl 3(rPC), %ecx # ecx <- CC 4145 GET_VREG %eax, %eax # eax <- vBB 4146 xorl (rFP,%ecx,4), %eax # ex: addl (rFP,%ecx,4),%eax 4147 SET_VREG %eax, rINST 4148 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4149 4150 4151 /* ------------------------------ */ 4152 .balign 128 4153 .L_op_shl_int: /* 0x98 */ 4154 /* File: x86/op_shl_int.S */ 4155 /* File: x86/binop1.S */ 4156 /* 4157 * Generic 32-bit binary operation in which both operands loaded to 4158 * registers (op0 in eax, op1 in ecx). 4159 */ 4160 /* binop vAA, vBB, vCC */ 4161 movzbl 2(rPC),%eax # eax <- BB 4162 movzbl 3(rPC),%ecx # ecx <- CC 4163 GET_VREG %eax, %eax # eax <- vBB 4164 GET_VREG %ecx, %ecx # eax <- vBB 4165 sall %cl, %eax # ex: addl %ecx,%eax 4166 SET_VREG %eax, rINST 4167 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4168 4169 4170 /* ------------------------------ */ 4171 .balign 128 4172 .L_op_shr_int: /* 0x99 */ 4173 /* File: x86/op_shr_int.S */ 4174 /* File: x86/binop1.S */ 4175 /* 4176 * Generic 32-bit binary operation in which both operands loaded to 4177 * registers (op0 in eax, op1 in ecx). 4178 */ 4179 /* binop vAA, vBB, vCC */ 4180 movzbl 2(rPC),%eax # eax <- BB 4181 movzbl 3(rPC),%ecx # ecx <- CC 4182 GET_VREG %eax, %eax # eax <- vBB 4183 GET_VREG %ecx, %ecx # eax <- vBB 4184 sarl %cl, %eax # ex: addl %ecx,%eax 4185 SET_VREG %eax, rINST 4186 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4187 4188 4189 /* ------------------------------ */ 4190 .balign 128 4191 .L_op_ushr_int: /* 0x9a */ 4192 /* File: x86/op_ushr_int.S */ 4193 /* File: x86/binop1.S */ 4194 /* 4195 * Generic 32-bit binary operation in which both operands loaded to 4196 * registers (op0 in eax, op1 in ecx). 4197 */ 4198 /* binop vAA, vBB, vCC */ 4199 movzbl 2(rPC),%eax # eax <- BB 4200 movzbl 3(rPC),%ecx # ecx <- CC 4201 GET_VREG %eax, %eax # eax <- vBB 4202 GET_VREG %ecx, %ecx # eax <- vBB 4203 shrl %cl, %eax # ex: addl %ecx,%eax 4204 SET_VREG %eax, rINST 4205 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4206 4207 4208 /* ------------------------------ */ 4209 .balign 128 4210 .L_op_add_long: /* 0x9b */ 4211 /* File: x86/op_add_long.S */ 4212 /* File: x86/binopWide.S */ 4213 /* 4214 * Generic 64-bit binary operation. 4215 */ 4216 /* binop vAA, vBB, vCC */ 4217 movzbl 2(rPC), %eax # eax <- BB 4218 movzbl 3(rPC), %ecx # ecx <- CC 4219 movl rIBASE, LOCAL0(%esp) # save rIBASE 4220 GET_VREG rIBASE, %eax # rIBASE <- v[BB+0] 4221 GET_VREG_HIGH %eax, %eax # eax <- v[BB+1] 4222 addl (rFP,%ecx,4), rIBASE # ex: addl (rFP,%ecx,4),rIBASE 4223 adcl 4(rFP,%ecx,4), %eax # ex: adcl 4(rFP,%ecx,4),%eax 4224 SET_VREG rIBASE, rINST # v[AA+0] <- rIBASE 4225 movl LOCAL0(%esp), rIBASE # restore rIBASE 4226 SET_VREG_HIGH %eax, rINST # v[AA+1] <- eax 4227 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4228 4229 4230 /* ------------------------------ */ 4231 .balign 128 4232 .L_op_sub_long: /* 0x9c */ 4233 /* File: x86/op_sub_long.S */ 4234 /* File: x86/binopWide.S */ 4235 /* 4236 * Generic 64-bit binary operation. 4237 */ 4238 /* binop vAA, vBB, vCC */ 4239 movzbl 2(rPC), %eax # eax <- BB 4240 movzbl 3(rPC), %ecx # ecx <- CC 4241 movl rIBASE, LOCAL0(%esp) # save rIBASE 4242 GET_VREG rIBASE, %eax # rIBASE <- v[BB+0] 4243 GET_VREG_HIGH %eax, %eax # eax <- v[BB+1] 4244 subl (rFP,%ecx,4), rIBASE # ex: addl (rFP,%ecx,4),rIBASE 4245 sbbl 4(rFP,%ecx,4), %eax # ex: adcl 4(rFP,%ecx,4),%eax 4246 SET_VREG rIBASE, rINST # v[AA+0] <- rIBASE 4247 movl LOCAL0(%esp), rIBASE # restore rIBASE 4248 SET_VREG_HIGH %eax, rINST # v[AA+1] <- eax 4249 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4250 4251 4252 /* ------------------------------ */ 4253 .balign 128 4254 .L_op_mul_long: /* 0x9d */ 4255 /* File: x86/op_mul_long.S */ 4256 /* 4257 * Signed 64-bit integer multiply. 4258 * 4259 * We could definately use more free registers for 4260 * this code. We spill rINSTw (ebx), 4261 * giving us eax, ebc, ecx and edx as computational 4262 * temps. On top of that, we'll spill edi (rFP) 4263 * for use as the vB pointer and esi (rPC) for use 4264 * as the vC pointer. Yuck. 4265 * 4266 */ 4267 /* mul-long vAA, vBB, vCC */ 4268 movzbl 2(rPC), %eax # eax <- B 4269 movzbl 3(rPC), %ecx # ecx <- C 4270 mov rPC, LOCAL0(%esp) # save Interpreter PC 4271 mov rFP, LOCAL1(%esp) # save FP 4272 mov rIBASE, LOCAL2(%esp) # save rIBASE 4273 leal (rFP,%eax,4), %esi # esi <- &v[B] 4274 leal (rFP,%ecx,4), rFP # rFP <- &v[C] 4275 movl 4(%esi), %ecx # ecx <- Bmsw 4276 imull (rFP), %ecx # ecx <- (Bmsw*Clsw) 4277 movl 4(rFP), %eax # eax <- Cmsw 4278 imull (%esi), %eax # eax <- (Cmsw*Blsw) 4279 addl %eax, %ecx # ecx <- (Bmsw*Clsw)+(Cmsw*Blsw) 4280 movl (rFP), %eax # eax <- Clsw 4281 mull (%esi) # eax <- (Clsw*Alsw) 4282 mov LOCAL0(%esp), rPC # restore Interpreter PC 4283 mov LOCAL1(%esp), rFP # restore FP 4284 leal (%ecx,rIBASE), rIBASE # full result now in rIBASE:%eax 4285 SET_VREG_HIGH rIBASE, rINST # v[B+1] <- rIBASE 4286 mov LOCAL2(%esp), rIBASE # restore IBASE 4287 SET_VREG %eax, rINST # v[B] <- eax 4288 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4289 4290 /* ------------------------------ */ 4291 .balign 128 4292 .L_op_div_long: /* 0x9e */ 4293 /* File: x86/op_div_long.S */ 4294 /* art_quick_* methods has quick abi, 4295 * so use eax, ecx, edx, ebx for args 4296 */ 4297 /* div vAA, vBB, vCC */ 4298 .extern art_quick_ldiv 4299 mov rIBASE, LOCAL0(%esp) # save rIBASE/%edx 4300 mov rINST, LOCAL1(%esp) # save rINST/%ebx 4301 movzbl 3(rPC), %eax # eax <- CC 4302 GET_VREG %ecx, %eax 4303 GET_VREG_HIGH %ebx, %eax 4304 movl %ecx, %edx 4305 orl %ebx, %ecx 4306 jz common_errDivideByZero 4307 movzbl 2(rPC), %eax # eax <- BB 4308 GET_VREG_HIGH %ecx, %eax 4309 GET_VREG %eax, %eax 4310 call SYMBOL(art_quick_ldiv) 4311 mov LOCAL1(%esp), rINST # restore rINST/%ebx 4312 SET_VREG_HIGH rIBASE, rINST 4313 SET_VREG %eax, rINST 4314 mov LOCAL0(%esp), rIBASE # restore rIBASE/%edx 4315 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4316 4317 /* ------------------------------ */ 4318 .balign 128 4319 .L_op_rem_long: /* 0x9f */ 4320 /* File: x86/op_rem_long.S */ 4321 /* File: x86/op_div_long.S */ 4322 /* art_quick_* methods has quick abi, 4323 * so use eax, ecx, edx, ebx for args 4324 */ 4325 /* div vAA, vBB, vCC */ 4326 .extern art_quick_lmod 4327 mov rIBASE, LOCAL0(%esp) # save rIBASE/%edx 4328 mov rINST, LOCAL1(%esp) # save rINST/%ebx 4329 movzbl 3(rPC), %eax # eax <- CC 4330 GET_VREG %ecx, %eax 4331 GET_VREG_HIGH %ebx, %eax 4332 movl %ecx, %edx 4333 orl %ebx, %ecx 4334 jz common_errDivideByZero 4335 movzbl 2(rPC), %eax # eax <- BB 4336 GET_VREG_HIGH %ecx, %eax 4337 GET_VREG %eax, %eax 4338 call SYMBOL(art_quick_lmod) 4339 mov LOCAL1(%esp), rINST # restore rINST/%ebx 4340 SET_VREG_HIGH rIBASE, rINST 4341 SET_VREG %eax, rINST 4342 mov LOCAL0(%esp), rIBASE # restore rIBASE/%edx 4343 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4344 4345 4346 /* ------------------------------ */ 4347 .balign 128 4348 .L_op_and_long: /* 0xa0 */ 4349 /* File: x86/op_and_long.S */ 4350 /* File: x86/binopWide.S */ 4351 /* 4352 * Generic 64-bit binary operation. 4353 */ 4354 /* binop vAA, vBB, vCC */ 4355 movzbl 2(rPC), %eax # eax <- BB 4356 movzbl 3(rPC), %ecx # ecx <- CC 4357 movl rIBASE, LOCAL0(%esp) # save rIBASE 4358 GET_VREG rIBASE, %eax # rIBASE <- v[BB+0] 4359 GET_VREG_HIGH %eax, %eax # eax <- v[BB+1] 4360 andl (rFP,%ecx,4), rIBASE # ex: addl (rFP,%ecx,4),rIBASE 4361 andl 4(rFP,%ecx,4), %eax # ex: adcl 4(rFP,%ecx,4),%eax 4362 SET_VREG rIBASE, rINST # v[AA+0] <- rIBASE 4363 movl LOCAL0(%esp), rIBASE # restore rIBASE 4364 SET_VREG_HIGH %eax, rINST # v[AA+1] <- eax 4365 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4366 4367 4368 /* ------------------------------ */ 4369 .balign 128 4370 .L_op_or_long: /* 0xa1 */ 4371 /* File: x86/op_or_long.S */ 4372 /* File: x86/binopWide.S */ 4373 /* 4374 * Generic 64-bit binary operation. 4375 */ 4376 /* binop vAA, vBB, vCC */ 4377 movzbl 2(rPC), %eax # eax <- BB 4378 movzbl 3(rPC), %ecx # ecx <- CC 4379 movl rIBASE, LOCAL0(%esp) # save rIBASE 4380 GET_VREG rIBASE, %eax # rIBASE <- v[BB+0] 4381 GET_VREG_HIGH %eax, %eax # eax <- v[BB+1] 4382 orl (rFP,%ecx,4), rIBASE # ex: addl (rFP,%ecx,4),rIBASE 4383 orl 4(rFP,%ecx,4), %eax # ex: adcl 4(rFP,%ecx,4),%eax 4384 SET_VREG rIBASE, rINST # v[AA+0] <- rIBASE 4385 movl LOCAL0(%esp), rIBASE # restore rIBASE 4386 SET_VREG_HIGH %eax, rINST # v[AA+1] <- eax 4387 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4388 4389 4390 /* ------------------------------ */ 4391 .balign 128 4392 .L_op_xor_long: /* 0xa2 */ 4393 /* File: x86/op_xor_long.S */ 4394 /* File: x86/binopWide.S */ 4395 /* 4396 * Generic 64-bit binary operation. 4397 */ 4398 /* binop vAA, vBB, vCC */ 4399 movzbl 2(rPC), %eax # eax <- BB 4400 movzbl 3(rPC), %ecx # ecx <- CC 4401 movl rIBASE, LOCAL0(%esp) # save rIBASE 4402 GET_VREG rIBASE, %eax # rIBASE <- v[BB+0] 4403 GET_VREG_HIGH %eax, %eax # eax <- v[BB+1] 4404 xorl (rFP,%ecx,4), rIBASE # ex: addl (rFP,%ecx,4),rIBASE 4405 xorl 4(rFP,%ecx,4), %eax # ex: adcl 4(rFP,%ecx,4),%eax 4406 SET_VREG rIBASE, rINST # v[AA+0] <- rIBASE 4407 movl LOCAL0(%esp), rIBASE # restore rIBASE 4408 SET_VREG_HIGH %eax, rINST # v[AA+1] <- eax 4409 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4410 4411 4412 /* ------------------------------ */ 4413 .balign 128 4414 .L_op_shl_long: /* 0xa3 */ 4415 /* File: x86/op_shl_long.S */ 4416 /* 4417 * Long integer shift. This is different from the generic 32/64-bit 4418 * binary operations because vAA/vBB are 64-bit but vCC (the shift 4419 * distance) is 32-bit. Also, Dalvik requires us to mask off the low 4420 * 6 bits of the shift distance. x86 shifts automatically mask off 4421 * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31 4422 * case specially. 4423 */ 4424 /* shl-long vAA, vBB, vCC */ 4425 /* ecx gets shift count */ 4426 /* Need to spill rINST */ 4427 /* rINSTw gets AA */ 4428 movzbl 2(rPC), %eax # eax <- BB 4429 movzbl 3(rPC), %ecx # ecx <- CC 4430 movl rIBASE, LOCAL0(%esp) 4431 GET_VREG_HIGH rIBASE, %eax # ecx <- v[BB+1] 4432 GET_VREG %ecx, %ecx # ecx <- vCC 4433 GET_VREG %eax, %eax # eax <- v[BB+0] 4434 shldl %eax,rIBASE 4435 sall %cl, %eax 4436 testb $32, %cl 4437 je 2f 4438 movl %eax, rIBASE 4439 xorl %eax, %eax 4440 2: 4441 SET_VREG_HIGH rIBASE, rINST # v[AA+1] <- rIBASE 4442 movl LOCAL0(%esp), rIBASE 4443 SET_VREG %eax, rINST # v[AA+0] <- %eax 4444 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4445 4446 /* ------------------------------ */ 4447 .balign 128 4448 .L_op_shr_long: /* 0xa4 */ 4449 /* File: x86/op_shr_long.S */ 4450 /* 4451 * Long integer shift. This is different from the generic 32/64-bit 4452 * binary operations because vAA/vBB are 64-bit but vCC (the shift 4453 * distance) is 32-bit. Also, Dalvik requires us to mask off the low 4454 * 6 bits of the shift distance. x86 shifts automatically mask off 4455 * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31 4456 * case specially. 4457 */ 4458 /* shr-long vAA, vBB, vCC */ 4459 /* ecx gets shift count */ 4460 /* Need to spill rIBASE */ 4461 /* rINSTw gets AA */ 4462 movzbl 2(rPC), %eax # eax <- BB 4463 movzbl 3(rPC), %ecx # ecx <- CC 4464 movl rIBASE, LOCAL0(%esp) 4465 GET_VREG_HIGH rIBASE, %eax # rIBASE<- v[BB+1] 4466 GET_VREG %ecx, %ecx # ecx <- vCC 4467 GET_VREG %eax, %eax # eax <- v[BB+0] 4468 shrdl rIBASE, %eax 4469 sarl %cl, rIBASE 4470 testb $32, %cl 4471 je 2f 4472 movl rIBASE, %eax 4473 sarl $31, rIBASE 4474 2: 4475 SET_VREG_HIGH rIBASE, rINST # v[AA+1] <- rIBASE 4476 movl LOCAL0(%esp), rIBASE 4477 SET_VREG %eax, rINST # v[AA+0] <- eax 4478 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4479 4480 /* ------------------------------ */ 4481 .balign 128 4482 .L_op_ushr_long: /* 0xa5 */ 4483 /* File: x86/op_ushr_long.S */ 4484 /* 4485 * Long integer shift. This is different from the generic 32/64-bit 4486 * binary operations because vAA/vBB are 64-bit but vCC (the shift 4487 * distance) is 32-bit. Also, Dalvik requires us to mask off the low 4488 * 6 bits of the shift distance. x86 shifts automatically mask off 4489 * the low 5 bits of %cl, so have to handle the 64 > shiftcount > 31 4490 * case specially. 4491 */ 4492 /* shr-long vAA, vBB, vCC */ 4493 /* ecx gets shift count */ 4494 /* Need to spill rIBASE */ 4495 /* rINSTw gets AA */ 4496 movzbl 2(rPC), %eax # eax <- BB 4497 movzbl 3(rPC), %ecx # ecx <- CC 4498 movl rIBASE, LOCAL0(%esp) 4499 GET_VREG_HIGH rIBASE, %eax # rIBASE <- v[BB+1] 4500 GET_VREG %ecx, %ecx # ecx <- vCC 4501 GET_VREG %eax, %eax # eax <- v[BB+0] 4502 shrdl rIBASE, %eax 4503 shrl %cl, rIBASE 4504 testb $32, %cl 4505 je 2f 4506 movl rIBASE, %eax 4507 xorl rIBASE, rIBASE 4508 2: 4509 SET_VREG_HIGH rIBASE, rINST # v[AA+1] <- rIBASE 4510 movl LOCAL0(%esp), rIBASE 4511 SET_VREG %eax, rINST # v[BB+0] <- eax 4512 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4513 4514 /* ------------------------------ */ 4515 .balign 128 4516 .L_op_add_float: /* 0xa6 */ 4517 /* File: x86/op_add_float.S */ 4518 /* File: x86/sseBinop.S */ 4519 movzbl 2(rPC), %ecx # ecx <- BB 4520 movzbl 3(rPC), %eax # eax <- CC 4521 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 4522 addss VREG_ADDRESS(%eax), %xmm0 4523 movss %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0 4524 pxor %xmm0, %xmm0 4525 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 4526 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4527 4528 4529 /* ------------------------------ */ 4530 .balign 128 4531 .L_op_sub_float: /* 0xa7 */ 4532 /* File: x86/op_sub_float.S */ 4533 /* File: x86/sseBinop.S */ 4534 movzbl 2(rPC), %ecx # ecx <- BB 4535 movzbl 3(rPC), %eax # eax <- CC 4536 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 4537 subss VREG_ADDRESS(%eax), %xmm0 4538 movss %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0 4539 pxor %xmm0, %xmm0 4540 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 4541 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4542 4543 4544 /* ------------------------------ */ 4545 .balign 128 4546 .L_op_mul_float: /* 0xa8 */ 4547 /* File: x86/op_mul_float.S */ 4548 /* File: x86/sseBinop.S */ 4549 movzbl 2(rPC), %ecx # ecx <- BB 4550 movzbl 3(rPC), %eax # eax <- CC 4551 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 4552 mulss VREG_ADDRESS(%eax), %xmm0 4553 movss %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0 4554 pxor %xmm0, %xmm0 4555 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 4556 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4557 4558 4559 /* ------------------------------ */ 4560 .balign 128 4561 .L_op_div_float: /* 0xa9 */ 4562 /* File: x86/op_div_float.S */ 4563 /* File: x86/sseBinop.S */ 4564 movzbl 2(rPC), %ecx # ecx <- BB 4565 movzbl 3(rPC), %eax # eax <- CC 4566 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 4567 divss VREG_ADDRESS(%eax), %xmm0 4568 movss %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0 4569 pxor %xmm0, %xmm0 4570 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 4571 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4572 4573 4574 /* ------------------------------ */ 4575 .balign 128 4576 .L_op_rem_float: /* 0xaa */ 4577 /* File: x86/op_rem_float.S */ 4578 /* rem_float vAA, vBB, vCC */ 4579 movzbl 3(rPC), %ecx # ecx <- BB 4580 movzbl 2(rPC), %eax # eax <- CC 4581 flds VREG_ADDRESS(%ecx) # vBB to fp stack 4582 flds VREG_ADDRESS(%eax) # vCC to fp stack 4583 1: 4584 fprem 4585 fstsw %ax 4586 sahf 4587 jp 1b 4588 fstp %st(1) 4589 fstps VREG_ADDRESS(rINST) # %st to vAA 4590 CLEAR_REF rINST 4591 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4592 4593 /* ------------------------------ */ 4594 .balign 128 4595 .L_op_add_double: /* 0xab */ 4596 /* File: x86/op_add_double.S */ 4597 /* File: x86/sseBinop.S */ 4598 movzbl 2(rPC), %ecx # ecx <- BB 4599 movzbl 3(rPC), %eax # eax <- CC 4600 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 4601 addsd VREG_ADDRESS(%eax), %xmm0 4602 movsd %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0 4603 pxor %xmm0, %xmm0 4604 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 4605 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4606 4607 4608 /* ------------------------------ */ 4609 .balign 128 4610 .L_op_sub_double: /* 0xac */ 4611 /* File: x86/op_sub_double.S */ 4612 /* File: x86/sseBinop.S */ 4613 movzbl 2(rPC), %ecx # ecx <- BB 4614 movzbl 3(rPC), %eax # eax <- CC 4615 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 4616 subsd VREG_ADDRESS(%eax), %xmm0 4617 movsd %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0 4618 pxor %xmm0, %xmm0 4619 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 4620 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4621 4622 4623 /* ------------------------------ */ 4624 .balign 128 4625 .L_op_mul_double: /* 0xad */ 4626 /* File: x86/op_mul_double.S */ 4627 /* File: x86/sseBinop.S */ 4628 movzbl 2(rPC), %ecx # ecx <- BB 4629 movzbl 3(rPC), %eax # eax <- CC 4630 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 4631 mulsd VREG_ADDRESS(%eax), %xmm0 4632 movsd %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0 4633 pxor %xmm0, %xmm0 4634 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 4635 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4636 4637 4638 /* ------------------------------ */ 4639 .balign 128 4640 .L_op_div_double: /* 0xae */ 4641 /* File: x86/op_div_double.S */ 4642 /* File: x86/sseBinop.S */ 4643 movzbl 2(rPC), %ecx # ecx <- BB 4644 movzbl 3(rPC), %eax # eax <- CC 4645 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 4646 divsd VREG_ADDRESS(%eax), %xmm0 4647 movsd %xmm0, VREG_ADDRESS(rINST) # vAA <- %xmm0 4648 pxor %xmm0, %xmm0 4649 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 4650 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4651 4652 4653 /* ------------------------------ */ 4654 .balign 128 4655 .L_op_rem_double: /* 0xaf */ 4656 /* File: x86/op_rem_double.S */ 4657 /* rem_double vAA, vBB, vCC */ 4658 movzbl 3(rPC), %ecx # ecx <- BB 4659 movzbl 2(rPC), %eax # eax <- CC 4660 fldl VREG_ADDRESS(%ecx) # %st1 <- fp[vBB] 4661 fldl VREG_ADDRESS(%eax) # %st0 <- fp[vCC] 4662 1: 4663 fprem 4664 fstsw %ax 4665 sahf 4666 jp 1b 4667 fstp %st(1) 4668 fstpl VREG_ADDRESS(rINST) # fp[vAA] <- %st 4669 CLEAR_WIDE_REF rINST 4670 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 4671 4672 /* ------------------------------ */ 4673 .balign 128 4674 .L_op_add_int_2addr: /* 0xb0 */ 4675 /* File: x86/op_add_int_2addr.S */ 4676 /* File: x86/binop2addr.S */ 4677 /* 4678 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4679 * that specifies an instruction that performs "result = r0 op r1". 4680 * This could be an instruction or a function call. 4681 * 4682 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4683 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4684 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4685 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4686 */ 4687 /* binop/2addr vA, vB */ 4688 movzx rINSTbl, %ecx # ecx <- A+ 4689 sarl $4, rINST # rINST <- B 4690 GET_VREG %eax, rINST # eax <- vB 4691 andb $0xf, %cl # ecx <- A 4692 addl %eax, (rFP,%ecx,4) # for ex: addl %eax,(rFP,%ecx,4) 4693 CLEAR_REF %ecx 4694 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4695 4696 4697 /* ------------------------------ */ 4698 .balign 128 4699 .L_op_sub_int_2addr: /* 0xb1 */ 4700 /* File: x86/op_sub_int_2addr.S */ 4701 /* File: x86/binop2addr.S */ 4702 /* 4703 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4704 * that specifies an instruction that performs "result = r0 op r1". 4705 * This could be an instruction or a function call. 4706 * 4707 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4708 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4709 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4710 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4711 */ 4712 /* binop/2addr vA, vB */ 4713 movzx rINSTbl, %ecx # ecx <- A+ 4714 sarl $4, rINST # rINST <- B 4715 GET_VREG %eax, rINST # eax <- vB 4716 andb $0xf, %cl # ecx <- A 4717 subl %eax, (rFP,%ecx,4) # for ex: addl %eax,(rFP,%ecx,4) 4718 CLEAR_REF %ecx 4719 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4720 4721 4722 /* ------------------------------ */ 4723 .balign 128 4724 .L_op_mul_int_2addr: /* 0xb2 */ 4725 /* File: x86/op_mul_int_2addr.S */ 4726 /* mul vA, vB */ 4727 movzx rINSTbl, %ecx # ecx <- A+ 4728 sarl $4, rINST # rINST <- B 4729 GET_VREG %eax, rINST # eax <- vB 4730 andb $0xf, %cl # ecx <- A 4731 movl rIBASE, rINST 4732 imull (rFP,%ecx,4), %eax # trashes rIBASE/edx 4733 movl rINST, rIBASE 4734 SET_VREG %eax, %ecx 4735 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4736 4737 /* ------------------------------ */ 4738 .balign 128 4739 .L_op_div_int_2addr: /* 0xb3 */ 4740 /* File: x86/op_div_int_2addr.S */ 4741 /* File: x86/bindiv2addr.S */ 4742 /* 4743 * 32-bit binary div/rem operation. Handles special case of op0=minint and 4744 * op1=-1. 4745 */ 4746 /* div/rem/2addr vA, vB */ 4747 movzx rINSTbl, %ecx # eax <- BA 4748 mov rIBASE, LOCAL0(%esp) 4749 sarl $4, %ecx # ecx <- B 4750 GET_VREG %ecx, %ecx # eax <- vBB 4751 andb $0xf, rINSTbl # rINST <- A 4752 GET_VREG %eax, rINST # eax <- vBB 4753 testl %ecx, %ecx 4754 je common_errDivideByZero 4755 cmpl $-1, %ecx 4756 jne .Lop_div_int_2addr_continue_div2addr 4757 cmpl $0x80000000, %eax 4758 jne .Lop_div_int_2addr_continue_div2addr 4759 movl $0x80000000, %eax 4760 SET_VREG %eax, rINST 4761 mov LOCAL0(%esp), rIBASE 4762 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4763 4764 .Lop_div_int_2addr_continue_div2addr: 4765 cltd 4766 idivl %ecx 4767 SET_VREG %eax, rINST 4768 mov LOCAL0(%esp), rIBASE 4769 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4770 4771 4772 /* ------------------------------ */ 4773 .balign 128 4774 .L_op_rem_int_2addr: /* 0xb4 */ 4775 /* File: x86/op_rem_int_2addr.S */ 4776 /* File: x86/bindiv2addr.S */ 4777 /* 4778 * 32-bit binary div/rem operation. Handles special case of op0=minint and 4779 * op1=-1. 4780 */ 4781 /* div/rem/2addr vA, vB */ 4782 movzx rINSTbl, %ecx # eax <- BA 4783 mov rIBASE, LOCAL0(%esp) 4784 sarl $4, %ecx # ecx <- B 4785 GET_VREG %ecx, %ecx # eax <- vBB 4786 andb $0xf, rINSTbl # rINST <- A 4787 GET_VREG %eax, rINST # eax <- vBB 4788 testl %ecx, %ecx 4789 je common_errDivideByZero 4790 cmpl $-1, %ecx 4791 jne .Lop_rem_int_2addr_continue_div2addr 4792 cmpl $0x80000000, %eax 4793 jne .Lop_rem_int_2addr_continue_div2addr 4794 movl $0, rIBASE 4795 SET_VREG rIBASE, rINST 4796 mov LOCAL0(%esp), rIBASE 4797 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4798 4799 .Lop_rem_int_2addr_continue_div2addr: 4800 cltd 4801 idivl %ecx 4802 SET_VREG rIBASE, rINST 4803 mov LOCAL0(%esp), rIBASE 4804 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4805 4806 4807 /* ------------------------------ */ 4808 .balign 128 4809 .L_op_and_int_2addr: /* 0xb5 */ 4810 /* File: x86/op_and_int_2addr.S */ 4811 /* File: x86/binop2addr.S */ 4812 /* 4813 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4814 * that specifies an instruction that performs "result = r0 op r1". 4815 * This could be an instruction or a function call. 4816 * 4817 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4818 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4819 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4820 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4821 */ 4822 /* binop/2addr vA, vB */ 4823 movzx rINSTbl, %ecx # ecx <- A+ 4824 sarl $4, rINST # rINST <- B 4825 GET_VREG %eax, rINST # eax <- vB 4826 andb $0xf, %cl # ecx <- A 4827 andl %eax, (rFP,%ecx,4) # for ex: addl %eax,(rFP,%ecx,4) 4828 CLEAR_REF %ecx 4829 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4830 4831 4832 /* ------------------------------ */ 4833 .balign 128 4834 .L_op_or_int_2addr: /* 0xb6 */ 4835 /* File: x86/op_or_int_2addr.S */ 4836 /* File: x86/binop2addr.S */ 4837 /* 4838 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4839 * that specifies an instruction that performs "result = r0 op r1". 4840 * This could be an instruction or a function call. 4841 * 4842 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4843 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4844 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4845 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4846 */ 4847 /* binop/2addr vA, vB */ 4848 movzx rINSTbl, %ecx # ecx <- A+ 4849 sarl $4, rINST # rINST <- B 4850 GET_VREG %eax, rINST # eax <- vB 4851 andb $0xf, %cl # ecx <- A 4852 orl %eax, (rFP,%ecx,4) # for ex: addl %eax,(rFP,%ecx,4) 4853 CLEAR_REF %ecx 4854 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4855 4856 4857 /* ------------------------------ */ 4858 .balign 128 4859 .L_op_xor_int_2addr: /* 0xb7 */ 4860 /* File: x86/op_xor_int_2addr.S */ 4861 /* File: x86/binop2addr.S */ 4862 /* 4863 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line 4864 * that specifies an instruction that performs "result = r0 op r1". 4865 * This could be an instruction or a function call. 4866 * 4867 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr, 4868 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr, 4869 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr, 4870 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr 4871 */ 4872 /* binop/2addr vA, vB */ 4873 movzx rINSTbl, %ecx # ecx <- A+ 4874 sarl $4, rINST # rINST <- B 4875 GET_VREG %eax, rINST # eax <- vB 4876 andb $0xf, %cl # ecx <- A 4877 xorl %eax, (rFP,%ecx,4) # for ex: addl %eax,(rFP,%ecx,4) 4878 CLEAR_REF %ecx 4879 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4880 4881 4882 /* ------------------------------ */ 4883 .balign 128 4884 .L_op_shl_int_2addr: /* 0xb8 */ 4885 /* File: x86/op_shl_int_2addr.S */ 4886 /* File: x86/shop2addr.S */ 4887 /* 4888 * Generic 32-bit "shift/2addr" operation. 4889 */ 4890 /* shift/2addr vA, vB */ 4891 movzx rINSTbl, %ecx # eax <- BA 4892 sarl $4, %ecx # ecx <- B 4893 GET_VREG %ecx, %ecx # eax <- vBB 4894 andb $0xf, rINSTbl # rINST <- A 4895 GET_VREG %eax, rINST # eax <- vAA 4896 sall %cl, %eax # ex: sarl %cl, %eax 4897 SET_VREG %eax, rINST 4898 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4899 4900 4901 /* ------------------------------ */ 4902 .balign 128 4903 .L_op_shr_int_2addr: /* 0xb9 */ 4904 /* File: x86/op_shr_int_2addr.S */ 4905 /* File: x86/shop2addr.S */ 4906 /* 4907 * Generic 32-bit "shift/2addr" operation. 4908 */ 4909 /* shift/2addr vA, vB */ 4910 movzx rINSTbl, %ecx # eax <- BA 4911 sarl $4, %ecx # ecx <- B 4912 GET_VREG %ecx, %ecx # eax <- vBB 4913 andb $0xf, rINSTbl # rINST <- A 4914 GET_VREG %eax, rINST # eax <- vAA 4915 sarl %cl, %eax # ex: sarl %cl, %eax 4916 SET_VREG %eax, rINST 4917 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4918 4919 4920 /* ------------------------------ */ 4921 .balign 128 4922 .L_op_ushr_int_2addr: /* 0xba */ 4923 /* File: x86/op_ushr_int_2addr.S */ 4924 /* File: x86/shop2addr.S */ 4925 /* 4926 * Generic 32-bit "shift/2addr" operation. 4927 */ 4928 /* shift/2addr vA, vB */ 4929 movzx rINSTbl, %ecx # eax <- BA 4930 sarl $4, %ecx # ecx <- B 4931 GET_VREG %ecx, %ecx # eax <- vBB 4932 andb $0xf, rINSTbl # rINST <- A 4933 GET_VREG %eax, rINST # eax <- vAA 4934 shrl %cl, %eax # ex: sarl %cl, %eax 4935 SET_VREG %eax, rINST 4936 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4937 4938 4939 /* ------------------------------ */ 4940 .balign 128 4941 .L_op_add_long_2addr: /* 0xbb */ 4942 /* File: x86/op_add_long_2addr.S */ 4943 /* File: x86/binopWide2addr.S */ 4944 /* 4945 * Generic 64-bit binary operation. 4946 */ 4947 /* binop/2addr vA, vB */ 4948 movzbl rINSTbl, %ecx # ecx<- BA 4949 sarl $4, %ecx # ecx<- B 4950 GET_VREG %eax, %ecx # eax<- v[B+0] 4951 GET_VREG_HIGH %ecx, %ecx # eax<- v[B+1] 4952 andb $0xF, rINSTbl # rINST<- A 4953 addl %eax, (rFP,rINST,4) # ex: addl %eax,(rFP,rINST,4) 4954 adcl %ecx, 4(rFP,rINST,4) # ex: adcl %ecx,4(rFP,rINST,4) 4955 CLEAR_WIDE_REF rINST 4956 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4957 4958 4959 /* ------------------------------ */ 4960 .balign 128 4961 .L_op_sub_long_2addr: /* 0xbc */ 4962 /* File: x86/op_sub_long_2addr.S */ 4963 /* File: x86/binopWide2addr.S */ 4964 /* 4965 * Generic 64-bit binary operation. 4966 */ 4967 /* binop/2addr vA, vB */ 4968 movzbl rINSTbl, %ecx # ecx<- BA 4969 sarl $4, %ecx # ecx<- B 4970 GET_VREG %eax, %ecx # eax<- v[B+0] 4971 GET_VREG_HIGH %ecx, %ecx # eax<- v[B+1] 4972 andb $0xF, rINSTbl # rINST<- A 4973 subl %eax, (rFP,rINST,4) # ex: addl %eax,(rFP,rINST,4) 4974 sbbl %ecx, 4(rFP,rINST,4) # ex: adcl %ecx,4(rFP,rINST,4) 4975 CLEAR_WIDE_REF rINST 4976 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 4977 4978 4979 /* ------------------------------ */ 4980 .balign 128 4981 .L_op_mul_long_2addr: /* 0xbd */ 4982 /* File: x86/op_mul_long_2addr.S */ 4983 /* 4984 * Signed 64-bit integer multiply, 2-addr version 4985 * 4986 * We could definately use more free registers for 4987 * this code. We must spill %edx (rIBASE) because it 4988 * is used by imul. We'll also spill rINST (ebx), 4989 * giving us eax, ebc, ecx and rIBASE as computational 4990 * temps. On top of that, we'll spill %esi (edi) 4991 * for use as the vA pointer and rFP (esi) for use 4992 * as the vB pointer. Yuck. 4993 */ 4994 /* mul-long/2addr vA, vB */ 4995 movzbl rINSTbl, %eax # eax <- BA 4996 andb $0xf, %al # eax <- A 4997 CLEAR_WIDE_REF %eax # clear refs in advance 4998 sarl $4, rINST # rINST <- B 4999 mov rPC, LOCAL0(%esp) # save Interpreter PC 5000 mov rFP, LOCAL1(%esp) # save FP 5001 mov rIBASE, LOCAL2(%esp) # save rIBASE 5002 leal (rFP,%eax,4), %esi # esi <- &v[A] 5003 leal (rFP,rINST,4), rFP # rFP <- &v[B] 5004 movl 4(%esi), %ecx # ecx <- Amsw 5005 imull (rFP), %ecx # ecx <- (Amsw*Blsw) 5006 movl 4(rFP), %eax # eax <- Bmsw 5007 imull (%esi), %eax # eax <- (Bmsw*Alsw) 5008 addl %eax, %ecx # ecx <- (Amsw*Blsw)+(Bmsw*Alsw) 5009 movl (rFP), %eax # eax <- Blsw 5010 mull (%esi) # eax <- (Blsw*Alsw) 5011 leal (%ecx,rIBASE), rIBASE # full result now in %edx:%eax 5012 movl rIBASE, 4(%esi) # v[A+1] <- rIBASE 5013 movl %eax, (%esi) # v[A] <- %eax 5014 mov LOCAL0(%esp), rPC # restore Interpreter PC 5015 mov LOCAL2(%esp), rIBASE # restore IBASE 5016 mov LOCAL1(%esp), rFP # restore FP 5017 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5018 5019 /* ------------------------------ */ 5020 .balign 128 5021 .L_op_div_long_2addr: /* 0xbe */ 5022 /* File: x86/op_div_long_2addr.S */ 5023 /* art_quick_* methods has quick abi, 5024 * so use eax, ecx, edx, ebx for args 5025 */ 5026 /* div/2addr vA, vB */ 5027 .extern art_quick_ldiv 5028 mov rIBASE, LOCAL0(%esp) # save rIBASE/%edx 5029 movzbl rINSTbl, %eax 5030 shrl $4, %eax # eax <- B 5031 andb $0xf, rINSTbl # rINST <- A 5032 mov rINST, LOCAL1(%esp) # save rINST/%ebx 5033 movl %ebx, %ecx 5034 GET_VREG %edx, %eax 5035 GET_VREG_HIGH %ebx, %eax 5036 movl %edx, %eax 5037 orl %ebx, %eax 5038 jz common_errDivideByZero 5039 GET_VREG %eax, %ecx 5040 GET_VREG_HIGH %ecx, %ecx 5041 call SYMBOL(art_quick_ldiv) 5042 mov LOCAL1(%esp), rINST # restore rINST/%ebx 5043 SET_VREG_HIGH rIBASE, rINST 5044 SET_VREG %eax, rINST 5045 mov LOCAL0(%esp), rIBASE # restore rIBASE/%edx 5046 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5047 5048 /* ------------------------------ */ 5049 .balign 128 5050 .L_op_rem_long_2addr: /* 0xbf */ 5051 /* File: x86/op_rem_long_2addr.S */ 5052 /* File: x86/op_div_long_2addr.S */ 5053 /* art_quick_* methods has quick abi, 5054 * so use eax, ecx, edx, ebx for args 5055 */ 5056 /* div/2addr vA, vB */ 5057 .extern art_quick_lmod 5058 mov rIBASE, LOCAL0(%esp) # save rIBASE/%edx 5059 movzbl rINSTbl, %eax 5060 shrl $4, %eax # eax <- B 5061 andb $0xf, rINSTbl # rINST <- A 5062 mov rINST, LOCAL1(%esp) # save rINST/%ebx 5063 movl %ebx, %ecx 5064 GET_VREG %edx, %eax 5065 GET_VREG_HIGH %ebx, %eax 5066 movl %edx, %eax 5067 orl %ebx, %eax 5068 jz common_errDivideByZero 5069 GET_VREG %eax, %ecx 5070 GET_VREG_HIGH %ecx, %ecx 5071 call SYMBOL(art_quick_lmod) 5072 mov LOCAL1(%esp), rINST # restore rINST/%ebx 5073 SET_VREG_HIGH rIBASE, rINST 5074 SET_VREG %eax, rINST 5075 mov LOCAL0(%esp), rIBASE # restore rIBASE/%edx 5076 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5077 5078 5079 /* ------------------------------ */ 5080 .balign 128 5081 .L_op_and_long_2addr: /* 0xc0 */ 5082 /* File: x86/op_and_long_2addr.S */ 5083 /* File: x86/binopWide2addr.S */ 5084 /* 5085 * Generic 64-bit binary operation. 5086 */ 5087 /* binop/2addr vA, vB */ 5088 movzbl rINSTbl, %ecx # ecx<- BA 5089 sarl $4, %ecx # ecx<- B 5090 GET_VREG %eax, %ecx # eax<- v[B+0] 5091 GET_VREG_HIGH %ecx, %ecx # eax<- v[B+1] 5092 andb $0xF, rINSTbl # rINST<- A 5093 andl %eax, (rFP,rINST,4) # ex: addl %eax,(rFP,rINST,4) 5094 andl %ecx, 4(rFP,rINST,4) # ex: adcl %ecx,4(rFP,rINST,4) 5095 CLEAR_WIDE_REF rINST 5096 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5097 5098 5099 /* ------------------------------ */ 5100 .balign 128 5101 .L_op_or_long_2addr: /* 0xc1 */ 5102 /* File: x86/op_or_long_2addr.S */ 5103 /* File: x86/binopWide2addr.S */ 5104 /* 5105 * Generic 64-bit binary operation. 5106 */ 5107 /* binop/2addr vA, vB */ 5108 movzbl rINSTbl, %ecx # ecx<- BA 5109 sarl $4, %ecx # ecx<- B 5110 GET_VREG %eax, %ecx # eax<- v[B+0] 5111 GET_VREG_HIGH %ecx, %ecx # eax<- v[B+1] 5112 andb $0xF, rINSTbl # rINST<- A 5113 orl %eax, (rFP,rINST,4) # ex: addl %eax,(rFP,rINST,4) 5114 orl %ecx, 4(rFP,rINST,4) # ex: adcl %ecx,4(rFP,rINST,4) 5115 CLEAR_WIDE_REF rINST 5116 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5117 5118 5119 /* ------------------------------ */ 5120 .balign 128 5121 .L_op_xor_long_2addr: /* 0xc2 */ 5122 /* File: x86/op_xor_long_2addr.S */ 5123 /* File: x86/binopWide2addr.S */ 5124 /* 5125 * Generic 64-bit binary operation. 5126 */ 5127 /* binop/2addr vA, vB */ 5128 movzbl rINSTbl, %ecx # ecx<- BA 5129 sarl $4, %ecx # ecx<- B 5130 GET_VREG %eax, %ecx # eax<- v[B+0] 5131 GET_VREG_HIGH %ecx, %ecx # eax<- v[B+1] 5132 andb $0xF, rINSTbl # rINST<- A 5133 xorl %eax, (rFP,rINST,4) # ex: addl %eax,(rFP,rINST,4) 5134 xorl %ecx, 4(rFP,rINST,4) # ex: adcl %ecx,4(rFP,rINST,4) 5135 CLEAR_WIDE_REF rINST 5136 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5137 5138 5139 /* ------------------------------ */ 5140 .balign 128 5141 .L_op_shl_long_2addr: /* 0xc3 */ 5142 /* File: x86/op_shl_long_2addr.S */ 5143 /* 5144 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is 5145 * 32-bit shift distance. 5146 */ 5147 /* shl-long/2addr vA, vB */ 5148 /* ecx gets shift count */ 5149 /* Need to spill rIBASE */ 5150 /* rINSTw gets AA */ 5151 movzbl rINSTbl, %ecx # ecx <- BA 5152 andb $0xf, rINSTbl # rINST <- A 5153 GET_VREG %eax, rINST # eax <- v[AA+0] 5154 sarl $4, %ecx # ecx <- B 5155 movl rIBASE, LOCAL0(%esp) 5156 GET_VREG_HIGH rIBASE, rINST # rIBASE <- v[AA+1] 5157 GET_VREG %ecx, %ecx # ecx <- vBB 5158 shldl %eax, rIBASE 5159 sall %cl, %eax 5160 testb $32, %cl 5161 je 2f 5162 movl %eax, rIBASE 5163 xorl %eax, %eax 5164 2: 5165 SET_VREG_HIGH rIBASE, rINST # v[AA+1] <- rIBASE 5166 movl LOCAL0(%esp), rIBASE 5167 SET_VREG %eax, rINST # v[AA+0] <- eax 5168 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5169 5170 /* ------------------------------ */ 5171 .balign 128 5172 .L_op_shr_long_2addr: /* 0xc4 */ 5173 /* File: x86/op_shr_long_2addr.S */ 5174 /* 5175 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is 5176 * 32-bit shift distance. 5177 */ 5178 /* shl-long/2addr vA, vB */ 5179 /* ecx gets shift count */ 5180 /* Need to spill rIBASE */ 5181 /* rINSTw gets AA */ 5182 movzbl rINSTbl, %ecx # ecx <- BA 5183 andb $0xf, rINSTbl # rINST <- A 5184 GET_VREG %eax, rINST # eax <- v[AA+0] 5185 sarl $4, %ecx # ecx <- B 5186 movl rIBASE, LOCAL0(%esp) 5187 GET_VREG_HIGH rIBASE, rINST # rIBASE <- v[AA+1] 5188 GET_VREG %ecx, %ecx # ecx <- vBB 5189 shrdl rIBASE, %eax 5190 sarl %cl, rIBASE 5191 testb $32, %cl 5192 je 2f 5193 movl rIBASE, %eax 5194 sarl $31, rIBASE 5195 2: 5196 SET_VREG_HIGH rIBASE, rINST # v[AA+1] <- rIBASE 5197 movl LOCAL0(%esp), rIBASE 5198 SET_VREG %eax, rINST # v[AA+0] <- eax 5199 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5200 5201 /* ------------------------------ */ 5202 .balign 128 5203 .L_op_ushr_long_2addr: /* 0xc5 */ 5204 /* File: x86/op_ushr_long_2addr.S */ 5205 /* 5206 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is 5207 * 32-bit shift distance. 5208 */ 5209 /* shl-long/2addr vA, vB */ 5210 /* ecx gets shift count */ 5211 /* Need to spill rIBASE */ 5212 /* rINSTw gets AA */ 5213 movzbl rINSTbl, %ecx # ecx <- BA 5214 andb $0xf, rINSTbl # rINST <- A 5215 GET_VREG %eax, rINST # eax <- v[AA+0] 5216 sarl $4, %ecx # ecx <- B 5217 movl rIBASE, LOCAL0(%esp) 5218 GET_VREG_HIGH rIBASE, rINST # rIBASE <- v[AA+1] 5219 GET_VREG %ecx, %ecx # ecx <- vBB 5220 shrdl rIBASE, %eax 5221 shrl %cl, rIBASE 5222 testb $32, %cl 5223 je 2f 5224 movl rIBASE, %eax 5225 xorl rIBASE, rIBASE 5226 2: 5227 SET_VREG_HIGH rIBASE, rINST # v[AA+1] <- rIBASE 5228 movl LOCAL0(%esp), rIBASE 5229 SET_VREG %eax, rINST # v[AA+0] <- eax 5230 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5231 5232 /* ------------------------------ */ 5233 .balign 128 5234 .L_op_add_float_2addr: /* 0xc6 */ 5235 /* File: x86/op_add_float_2addr.S */ 5236 /* File: x86/sseBinop2Addr.S */ 5237 movzx rINSTbl, %ecx # ecx <- A+ 5238 andl $0xf, %ecx # ecx <- A 5239 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 5240 sarl $4, rINST # rINST<- B 5241 addss VREG_ADDRESS(rINST), %xmm0 5242 movss %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0 5243 pxor %xmm0, %xmm0 5244 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 5245 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5246 5247 5248 /* ------------------------------ */ 5249 .balign 128 5250 .L_op_sub_float_2addr: /* 0xc7 */ 5251 /* File: x86/op_sub_float_2addr.S */ 5252 /* File: x86/sseBinop2Addr.S */ 5253 movzx rINSTbl, %ecx # ecx <- A+ 5254 andl $0xf, %ecx # ecx <- A 5255 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 5256 sarl $4, rINST # rINST<- B 5257 subss VREG_ADDRESS(rINST), %xmm0 5258 movss %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0 5259 pxor %xmm0, %xmm0 5260 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 5261 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5262 5263 5264 /* ------------------------------ */ 5265 .balign 128 5266 .L_op_mul_float_2addr: /* 0xc8 */ 5267 /* File: x86/op_mul_float_2addr.S */ 5268 /* File: x86/sseBinop2Addr.S */ 5269 movzx rINSTbl, %ecx # ecx <- A+ 5270 andl $0xf, %ecx # ecx <- A 5271 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 5272 sarl $4, rINST # rINST<- B 5273 mulss VREG_ADDRESS(rINST), %xmm0 5274 movss %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0 5275 pxor %xmm0, %xmm0 5276 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 5277 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5278 5279 5280 /* ------------------------------ */ 5281 .balign 128 5282 .L_op_div_float_2addr: /* 0xc9 */ 5283 /* File: x86/op_div_float_2addr.S */ 5284 /* File: x86/sseBinop2Addr.S */ 5285 movzx rINSTbl, %ecx # ecx <- A+ 5286 andl $0xf, %ecx # ecx <- A 5287 movss VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 5288 sarl $4, rINST # rINST<- B 5289 divss VREG_ADDRESS(rINST), %xmm0 5290 movss %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0 5291 pxor %xmm0, %xmm0 5292 movss %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 5293 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5294 5295 5296 /* ------------------------------ */ 5297 .balign 128 5298 .L_op_rem_float_2addr: /* 0xca */ 5299 /* File: x86/op_rem_float_2addr.S */ 5300 /* rem_float/2addr vA, vB */ 5301 movzx rINSTbl, %ecx # ecx <- A+ 5302 sarl $4, rINST # rINST <- B 5303 flds VREG_ADDRESS(rINST) # vB to fp stack 5304 andb $0xf, %cl # ecx <- A 5305 flds VREG_ADDRESS(%ecx) # vA to fp stack 5306 1: 5307 fprem 5308 fstsw %ax 5309 sahf 5310 jp 1b 5311 fstp %st(1) 5312 fstps VREG_ADDRESS(%ecx) # %st to vA 5313 CLEAR_REF %ecx 5314 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5315 5316 /* ------------------------------ */ 5317 .balign 128 5318 .L_op_add_double_2addr: /* 0xcb */ 5319 /* File: x86/op_add_double_2addr.S */ 5320 /* File: x86/sseBinop2Addr.S */ 5321 movzx rINSTbl, %ecx # ecx <- A+ 5322 andl $0xf, %ecx # ecx <- A 5323 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 5324 sarl $4, rINST # rINST<- B 5325 addsd VREG_ADDRESS(rINST), %xmm0 5326 movsd %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0 5327 pxor %xmm0, %xmm0 5328 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 5329 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5330 5331 5332 /* ------------------------------ */ 5333 .balign 128 5334 .L_op_sub_double_2addr: /* 0xcc */ 5335 /* File: x86/op_sub_double_2addr.S */ 5336 /* File: x86/sseBinop2Addr.S */ 5337 movzx rINSTbl, %ecx # ecx <- A+ 5338 andl $0xf, %ecx # ecx <- A 5339 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 5340 sarl $4, rINST # rINST<- B 5341 subsd VREG_ADDRESS(rINST), %xmm0 5342 movsd %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0 5343 pxor %xmm0, %xmm0 5344 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 5345 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5346 5347 5348 /* ------------------------------ */ 5349 .balign 128 5350 .L_op_mul_double_2addr: /* 0xcd */ 5351 /* File: x86/op_mul_double_2addr.S */ 5352 /* File: x86/sseBinop2Addr.S */ 5353 movzx rINSTbl, %ecx # ecx <- A+ 5354 andl $0xf, %ecx # ecx <- A 5355 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 5356 sarl $4, rINST # rINST<- B 5357 mulsd VREG_ADDRESS(rINST), %xmm0 5358 movsd %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0 5359 pxor %xmm0, %xmm0 5360 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 5361 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5362 5363 5364 /* ------------------------------ */ 5365 .balign 128 5366 .L_op_div_double_2addr: /* 0xce */ 5367 /* File: x86/op_div_double_2addr.S */ 5368 /* File: x86/sseBinop2Addr.S */ 5369 movzx rINSTbl, %ecx # ecx <- A+ 5370 andl $0xf, %ecx # ecx <- A 5371 movsd VREG_ADDRESS(%ecx), %xmm0 # %xmm0 <- 1st src 5372 sarl $4, rINST # rINST<- B 5373 divsd VREG_ADDRESS(rINST), %xmm0 5374 movsd %xmm0, VREG_ADDRESS(%ecx) # vAA<- %xmm0 5375 pxor %xmm0, %xmm0 5376 movsd %xmm0, VREG_REF_ADDRESS(rINST) # clear ref 5377 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5378 5379 5380 /* ------------------------------ */ 5381 .balign 128 5382 .L_op_rem_double_2addr: /* 0xcf */ 5383 /* File: x86/op_rem_double_2addr.S */ 5384 /* rem_double/2addr vA, vB */ 5385 movzx rINSTbl, %ecx # ecx <- A+ 5386 sarl $4, rINST # rINST <- B 5387 fldl VREG_ADDRESS(rINST) # vB to fp stack 5388 andb $0xf, %cl # ecx <- A 5389 fldl VREG_ADDRESS(%ecx) # vA to fp stack 5390 1: 5391 fprem 5392 fstsw %ax 5393 sahf 5394 jp 1b 5395 fstp %st(1) 5396 fstpl VREG_ADDRESS(%ecx) # %st to vA 5397 CLEAR_WIDE_REF %ecx 5398 ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 5399 5400 /* ------------------------------ */ 5401 .balign 128 5402 .L_op_add_int_lit16: /* 0xd0 */ 5403 /* File: x86/op_add_int_lit16.S */ 5404 /* File: x86/binopLit16.S */ 5405 /* 5406 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5407 * that specifies an instruction that performs "result = eax op ecx". 5408 * This could be an x86 instruction or a function call. (If the result 5409 * comes back in a register other than eax, you can override "result".) 5410 * 5411 * For: add-int/lit16, rsub-int, 5412 * and-int/lit16, or-int/lit16, xor-int/lit16 5413 */ 5414 /* binop/lit16 vA, vB, #+CCCC */ 5415 movzbl rINSTbl, %eax # eax <- 000000BA 5416 sarl $4, %eax # eax <- B 5417 GET_VREG %eax, %eax # eax <- vB 5418 movswl 2(rPC), %ecx # ecx <- ssssCCCC 5419 andb $0xf, rINSTbl # rINST <- A 5420 addl %ecx, %eax # for example: addl %ecx, %eax 5421 SET_VREG %eax, rINST 5422 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5423 5424 5425 /* ------------------------------ */ 5426 .balign 128 5427 .L_op_rsub_int: /* 0xd1 */ 5428 /* File: x86/op_rsub_int.S */ 5429 /* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */ 5430 /* File: x86/binopLit16.S */ 5431 /* 5432 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5433 * that specifies an instruction that performs "result = eax op ecx". 5434 * This could be an x86 instruction or a function call. (If the result 5435 * comes back in a register other than eax, you can override "result".) 5436 * 5437 * For: add-int/lit16, rsub-int, 5438 * and-int/lit16, or-int/lit16, xor-int/lit16 5439 */ 5440 /* binop/lit16 vA, vB, #+CCCC */ 5441 movzbl rINSTbl, %eax # eax <- 000000BA 5442 sarl $4, %eax # eax <- B 5443 GET_VREG %eax, %eax # eax <- vB 5444 movswl 2(rPC), %ecx # ecx <- ssssCCCC 5445 andb $0xf, rINSTbl # rINST <- A 5446 subl %eax, %ecx # for example: addl %ecx, %eax 5447 SET_VREG %ecx, rINST 5448 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5449 5450 5451 /* ------------------------------ */ 5452 .balign 128 5453 .L_op_mul_int_lit16: /* 0xd2 */ 5454 /* File: x86/op_mul_int_lit16.S */ 5455 /* mul/lit16 vA, vB, #+CCCC */ 5456 /* Need A in rINST, ssssCCCC in ecx, vB in eax */ 5457 movzbl rINSTbl, %eax # eax <- 000000BA 5458 sarl $4, %eax # eax <- B 5459 GET_VREG %eax, %eax # eax <- vB 5460 movl rIBASE, %ecx 5461 movswl 2(rPC), rIBASE # rIBASE <- ssssCCCC 5462 andb $0xf, rINSTbl # rINST <- A 5463 imull rIBASE, %eax # trashes rIBASE/edx 5464 movl %ecx, rIBASE 5465 SET_VREG %eax, rINST 5466 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5467 5468 /* ------------------------------ */ 5469 .balign 128 5470 .L_op_div_int_lit16: /* 0xd3 */ 5471 /* File: x86/op_div_int_lit16.S */ 5472 /* File: x86/bindivLit16.S */ 5473 /* 5474 * 32-bit binary div/rem operation. Handles special case of op0=minint and 5475 * op1=-1. 5476 */ 5477 /* div/rem/lit16 vA, vB, #+CCCC */ 5478 /* Need A in rINST, ssssCCCC in ecx, vB in eax */ 5479 movzbl rINSTbl, %eax # eax <- 000000BA 5480 sarl $4, %eax # eax <- B 5481 GET_VREG %eax, %eax # eax <- vB 5482 movswl 2(rPC), %ecx # ecx <- ssssCCCC 5483 andb $0xf, rINSTbl # rINST <- A 5484 testl %ecx, %ecx 5485 je common_errDivideByZero 5486 cmpl $-1, %ecx 5487 jne .Lop_div_int_lit16_continue_div 5488 cmpl $0x80000000, %eax 5489 jne .Lop_div_int_lit16_continue_div 5490 movl $0x80000000, %eax 5491 SET_VREG %eax, rINST 5492 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5493 5494 .Lop_div_int_lit16_continue_div: 5495 mov rIBASE, LOCAL0(%esp) 5496 cltd 5497 idivl %ecx 5498 SET_VREG %eax, rINST 5499 mov LOCAL0(%esp), rIBASE 5500 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5501 5502 5503 /* ------------------------------ */ 5504 .balign 128 5505 .L_op_rem_int_lit16: /* 0xd4 */ 5506 /* File: x86/op_rem_int_lit16.S */ 5507 /* File: x86/bindivLit16.S */ 5508 /* 5509 * 32-bit binary div/rem operation. Handles special case of op0=minint and 5510 * op1=-1. 5511 */ 5512 /* div/rem/lit16 vA, vB, #+CCCC */ 5513 /* Need A in rINST, ssssCCCC in ecx, vB in eax */ 5514 movzbl rINSTbl, %eax # eax <- 000000BA 5515 sarl $4, %eax # eax <- B 5516 GET_VREG %eax, %eax # eax <- vB 5517 movswl 2(rPC), %ecx # ecx <- ssssCCCC 5518 andb $0xf, rINSTbl # rINST <- A 5519 testl %ecx, %ecx 5520 je common_errDivideByZero 5521 cmpl $-1, %ecx 5522 jne .Lop_rem_int_lit16_continue_div 5523 cmpl $0x80000000, %eax 5524 jne .Lop_rem_int_lit16_continue_div 5525 movl $0, %eax 5526 SET_VREG %eax, rINST 5527 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5528 5529 .Lop_rem_int_lit16_continue_div: 5530 mov rIBASE, LOCAL0(%esp) 5531 cltd 5532 idivl %ecx 5533 SET_VREG rIBASE, rINST 5534 mov LOCAL0(%esp), rIBASE 5535 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5536 5537 5538 /* ------------------------------ */ 5539 .balign 128 5540 .L_op_and_int_lit16: /* 0xd5 */ 5541 /* File: x86/op_and_int_lit16.S */ 5542 /* File: x86/binopLit16.S */ 5543 /* 5544 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5545 * that specifies an instruction that performs "result = eax op ecx". 5546 * This could be an x86 instruction or a function call. (If the result 5547 * comes back in a register other than eax, you can override "result".) 5548 * 5549 * For: add-int/lit16, rsub-int, 5550 * and-int/lit16, or-int/lit16, xor-int/lit16 5551 */ 5552 /* binop/lit16 vA, vB, #+CCCC */ 5553 movzbl rINSTbl, %eax # eax <- 000000BA 5554 sarl $4, %eax # eax <- B 5555 GET_VREG %eax, %eax # eax <- vB 5556 movswl 2(rPC), %ecx # ecx <- ssssCCCC 5557 andb $0xf, rINSTbl # rINST <- A 5558 andl %ecx, %eax # for example: addl %ecx, %eax 5559 SET_VREG %eax, rINST 5560 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5561 5562 5563 /* ------------------------------ */ 5564 .balign 128 5565 .L_op_or_int_lit16: /* 0xd6 */ 5566 /* File: x86/op_or_int_lit16.S */ 5567 /* File: x86/binopLit16.S */ 5568 /* 5569 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5570 * that specifies an instruction that performs "result = eax op ecx". 5571 * This could be an x86 instruction or a function call. (If the result 5572 * comes back in a register other than eax, you can override "result".) 5573 * 5574 * For: add-int/lit16, rsub-int, 5575 * and-int/lit16, or-int/lit16, xor-int/lit16 5576 */ 5577 /* binop/lit16 vA, vB, #+CCCC */ 5578 movzbl rINSTbl, %eax # eax <- 000000BA 5579 sarl $4, %eax # eax <- B 5580 GET_VREG %eax, %eax # eax <- vB 5581 movswl 2(rPC), %ecx # ecx <- ssssCCCC 5582 andb $0xf, rINSTbl # rINST <- A 5583 orl %ecx, %eax # for example: addl %ecx, %eax 5584 SET_VREG %eax, rINST 5585 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5586 5587 5588 /* ------------------------------ */ 5589 .balign 128 5590 .L_op_xor_int_lit16: /* 0xd7 */ 5591 /* File: x86/op_xor_int_lit16.S */ 5592 /* File: x86/binopLit16.S */ 5593 /* 5594 * Generic 32-bit "lit16" binary operation. Provide an "instr" line 5595 * that specifies an instruction that performs "result = eax op ecx". 5596 * This could be an x86 instruction or a function call. (If the result 5597 * comes back in a register other than eax, you can override "result".) 5598 * 5599 * For: add-int/lit16, rsub-int, 5600 * and-int/lit16, or-int/lit16, xor-int/lit16 5601 */ 5602 /* binop/lit16 vA, vB, #+CCCC */ 5603 movzbl rINSTbl, %eax # eax <- 000000BA 5604 sarl $4, %eax # eax <- B 5605 GET_VREG %eax, %eax # eax <- vB 5606 movswl 2(rPC), %ecx # ecx <- ssssCCCC 5607 andb $0xf, rINSTbl # rINST <- A 5608 xorl %ecx, %eax # for example: addl %ecx, %eax 5609 SET_VREG %eax, rINST 5610 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5611 5612 5613 /* ------------------------------ */ 5614 .balign 128 5615 .L_op_add_int_lit8: /* 0xd8 */ 5616 /* File: x86/op_add_int_lit8.S */ 5617 /* File: x86/binopLit8.S */ 5618 /* 5619 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5620 * that specifies an instruction that performs "result = eax op ecx". 5621 * This could be an x86 instruction or a function call. (If the result 5622 * comes back in a register other than r0, you can override "result".) 5623 * 5624 * For: add-int/lit8, rsub-int/lit8 5625 * and-int/lit8, or-int/lit8, xor-int/lit8, 5626 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5627 */ 5628 /* binop/lit8 vAA, vBB, #+CC */ 5629 movzbl 2(rPC), %eax # eax <- BB 5630 movsbl 3(rPC), %ecx # ecx <- ssssssCC 5631 GET_VREG %eax, %eax # eax <- rBB 5632 addl %ecx, %eax # ex: addl %ecx,%eax 5633 SET_VREG %eax, rINST 5634 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5635 5636 5637 /* ------------------------------ */ 5638 .balign 128 5639 .L_op_rsub_int_lit8: /* 0xd9 */ 5640 /* File: x86/op_rsub_int_lit8.S */ 5641 /* File: x86/binopLit8.S */ 5642 /* 5643 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5644 * that specifies an instruction that performs "result = eax op ecx". 5645 * This could be an x86 instruction or a function call. (If the result 5646 * comes back in a register other than r0, you can override "result".) 5647 * 5648 * For: add-int/lit8, rsub-int/lit8 5649 * and-int/lit8, or-int/lit8, xor-int/lit8, 5650 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5651 */ 5652 /* binop/lit8 vAA, vBB, #+CC */ 5653 movzbl 2(rPC), %eax # eax <- BB 5654 movsbl 3(rPC), %ecx # ecx <- ssssssCC 5655 GET_VREG %eax, %eax # eax <- rBB 5656 subl %eax, %ecx # ex: addl %ecx,%eax 5657 SET_VREG %ecx, rINST 5658 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5659 5660 5661 /* ------------------------------ */ 5662 .balign 128 5663 .L_op_mul_int_lit8: /* 0xda */ 5664 /* File: x86/op_mul_int_lit8.S */ 5665 /* mul/lit8 vAA, vBB, #+CC */ 5666 movzbl 2(rPC), %eax # eax <- BB 5667 movl rIBASE, %ecx 5668 GET_VREG %eax, %eax # eax <- rBB 5669 movsbl 3(rPC), rIBASE # rIBASE <- ssssssCC 5670 imull rIBASE, %eax # trashes rIBASE/edx 5671 movl %ecx, rIBASE 5672 SET_VREG %eax, rINST 5673 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5674 5675 /* ------------------------------ */ 5676 .balign 128 5677 .L_op_div_int_lit8: /* 0xdb */ 5678 /* File: x86/op_div_int_lit8.S */ 5679 /* File: x86/bindivLit8.S */ 5680 /* 5681 * 32-bit div/rem "lit8" binary operation. Handles special case of 5682 * op0=minint & op1=-1 5683 */ 5684 /* div/rem/lit8 vAA, vBB, #+CC */ 5685 movzbl 2(rPC), %eax # eax <- BB 5686 movsbl 3(rPC), %ecx # ecx <- ssssssCC 5687 GET_VREG %eax, %eax # eax <- rBB 5688 testl %ecx, %ecx 5689 je common_errDivideByZero 5690 cmpl $0x80000000, %eax 5691 jne .Lop_div_int_lit8_continue_div 5692 cmpl $-1, %ecx 5693 jne .Lop_div_int_lit8_continue_div 5694 movl $0x80000000, %eax 5695 SET_VREG %eax, rINST 5696 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5697 5698 .Lop_div_int_lit8_continue_div: 5699 mov rIBASE, LOCAL0(%esp) 5700 cltd 5701 idivl %ecx 5702 SET_VREG %eax, rINST 5703 mov LOCAL0(%esp), rIBASE 5704 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5705 5706 5707 /* ------------------------------ */ 5708 .balign 128 5709 .L_op_rem_int_lit8: /* 0xdc */ 5710 /* File: x86/op_rem_int_lit8.S */ 5711 /* File: x86/bindivLit8.S */ 5712 /* 5713 * 32-bit div/rem "lit8" binary operation. Handles special case of 5714 * op0=minint & op1=-1 5715 */ 5716 /* div/rem/lit8 vAA, vBB, #+CC */ 5717 movzbl 2(rPC), %eax # eax <- BB 5718 movsbl 3(rPC), %ecx # ecx <- ssssssCC 5719 GET_VREG %eax, %eax # eax <- rBB 5720 testl %ecx, %ecx 5721 je common_errDivideByZero 5722 cmpl $0x80000000, %eax 5723 jne .Lop_rem_int_lit8_continue_div 5724 cmpl $-1, %ecx 5725 jne .Lop_rem_int_lit8_continue_div 5726 movl $0, %eax 5727 SET_VREG %eax, rINST 5728 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5729 5730 .Lop_rem_int_lit8_continue_div: 5731 mov rIBASE, LOCAL0(%esp) 5732 cltd 5733 idivl %ecx 5734 SET_VREG rIBASE, rINST 5735 mov LOCAL0(%esp), rIBASE 5736 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5737 5738 5739 /* ------------------------------ */ 5740 .balign 128 5741 .L_op_and_int_lit8: /* 0xdd */ 5742 /* File: x86/op_and_int_lit8.S */ 5743 /* File: x86/binopLit8.S */ 5744 /* 5745 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5746 * that specifies an instruction that performs "result = eax op ecx". 5747 * This could be an x86 instruction or a function call. (If the result 5748 * comes back in a register other than r0, you can override "result".) 5749 * 5750 * For: add-int/lit8, rsub-int/lit8 5751 * and-int/lit8, or-int/lit8, xor-int/lit8, 5752 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5753 */ 5754 /* binop/lit8 vAA, vBB, #+CC */ 5755 movzbl 2(rPC), %eax # eax <- BB 5756 movsbl 3(rPC), %ecx # ecx <- ssssssCC 5757 GET_VREG %eax, %eax # eax <- rBB 5758 andl %ecx, %eax # ex: addl %ecx,%eax 5759 SET_VREG %eax, rINST 5760 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5761 5762 5763 /* ------------------------------ */ 5764 .balign 128 5765 .L_op_or_int_lit8: /* 0xde */ 5766 /* File: x86/op_or_int_lit8.S */ 5767 /* File: x86/binopLit8.S */ 5768 /* 5769 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5770 * that specifies an instruction that performs "result = eax op ecx". 5771 * This could be an x86 instruction or a function call. (If the result 5772 * comes back in a register other than r0, you can override "result".) 5773 * 5774 * For: add-int/lit8, rsub-int/lit8 5775 * and-int/lit8, or-int/lit8, xor-int/lit8, 5776 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5777 */ 5778 /* binop/lit8 vAA, vBB, #+CC */ 5779 movzbl 2(rPC), %eax # eax <- BB 5780 movsbl 3(rPC), %ecx # ecx <- ssssssCC 5781 GET_VREG %eax, %eax # eax <- rBB 5782 orl %ecx, %eax # ex: addl %ecx,%eax 5783 SET_VREG %eax, rINST 5784 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5785 5786 5787 /* ------------------------------ */ 5788 .balign 128 5789 .L_op_xor_int_lit8: /* 0xdf */ 5790 /* File: x86/op_xor_int_lit8.S */ 5791 /* File: x86/binopLit8.S */ 5792 /* 5793 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5794 * that specifies an instruction that performs "result = eax op ecx". 5795 * This could be an x86 instruction or a function call. (If the result 5796 * comes back in a register other than r0, you can override "result".) 5797 * 5798 * For: add-int/lit8, rsub-int/lit8 5799 * and-int/lit8, or-int/lit8, xor-int/lit8, 5800 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5801 */ 5802 /* binop/lit8 vAA, vBB, #+CC */ 5803 movzbl 2(rPC), %eax # eax <- BB 5804 movsbl 3(rPC), %ecx # ecx <- ssssssCC 5805 GET_VREG %eax, %eax # eax <- rBB 5806 xorl %ecx, %eax # ex: addl %ecx,%eax 5807 SET_VREG %eax, rINST 5808 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5809 5810 5811 /* ------------------------------ */ 5812 .balign 128 5813 .L_op_shl_int_lit8: /* 0xe0 */ 5814 /* File: x86/op_shl_int_lit8.S */ 5815 /* File: x86/binopLit8.S */ 5816 /* 5817 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5818 * that specifies an instruction that performs "result = eax op ecx". 5819 * This could be an x86 instruction or a function call. (If the result 5820 * comes back in a register other than r0, you can override "result".) 5821 * 5822 * For: add-int/lit8, rsub-int/lit8 5823 * and-int/lit8, or-int/lit8, xor-int/lit8, 5824 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5825 */ 5826 /* binop/lit8 vAA, vBB, #+CC */ 5827 movzbl 2(rPC), %eax # eax <- BB 5828 movsbl 3(rPC), %ecx # ecx <- ssssssCC 5829 GET_VREG %eax, %eax # eax <- rBB 5830 sall %cl, %eax # ex: addl %ecx,%eax 5831 SET_VREG %eax, rINST 5832 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5833 5834 5835 /* ------------------------------ */ 5836 .balign 128 5837 .L_op_shr_int_lit8: /* 0xe1 */ 5838 /* File: x86/op_shr_int_lit8.S */ 5839 /* File: x86/binopLit8.S */ 5840 /* 5841 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5842 * that specifies an instruction that performs "result = eax op ecx". 5843 * This could be an x86 instruction or a function call. (If the result 5844 * comes back in a register other than r0, you can override "result".) 5845 * 5846 * For: add-int/lit8, rsub-int/lit8 5847 * and-int/lit8, or-int/lit8, xor-int/lit8, 5848 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5849 */ 5850 /* binop/lit8 vAA, vBB, #+CC */ 5851 movzbl 2(rPC), %eax # eax <- BB 5852 movsbl 3(rPC), %ecx # ecx <- ssssssCC 5853 GET_VREG %eax, %eax # eax <- rBB 5854 sarl %cl, %eax # ex: addl %ecx,%eax 5855 SET_VREG %eax, rINST 5856 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5857 5858 5859 /* ------------------------------ */ 5860 .balign 128 5861 .L_op_ushr_int_lit8: /* 0xe2 */ 5862 /* File: x86/op_ushr_int_lit8.S */ 5863 /* File: x86/binopLit8.S */ 5864 /* 5865 * Generic 32-bit "lit8" binary operation. Provide an "instr" line 5866 * that specifies an instruction that performs "result = eax op ecx". 5867 * This could be an x86 instruction or a function call. (If the result 5868 * comes back in a register other than r0, you can override "result".) 5869 * 5870 * For: add-int/lit8, rsub-int/lit8 5871 * and-int/lit8, or-int/lit8, xor-int/lit8, 5872 * shl-int/lit8, shr-int/lit8, ushr-int/lit8 5873 */ 5874 /* binop/lit8 vAA, vBB, #+CC */ 5875 movzbl 2(rPC), %eax # eax <- BB 5876 movsbl 3(rPC), %ecx # ecx <- ssssssCC 5877 GET_VREG %eax, %eax # eax <- rBB 5878 shrl %cl, %eax # ex: addl %ecx,%eax 5879 SET_VREG %eax, rINST 5880 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5881 5882 5883 /* ------------------------------ */ 5884 .balign 128 5885 .L_op_iget_quick: /* 0xe3 */ 5886 /* File: x86/op_iget_quick.S */ 5887 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */ 5888 /* op vA, vB, offset@CCCC */ 5889 movzbl rINSTbl, %ecx # ecx <- BA 5890 sarl $4, %ecx # ecx <- B 5891 GET_VREG %ecx, %ecx # vB (object we're operating on) 5892 movzwl 2(rPC), %eax # eax <- field byte offset 5893 testl %ecx, %ecx # is object null? 5894 je common_errNullObject 5895 movl (%ecx,%eax,1), %eax 5896 andb $0xf,rINSTbl # rINST <- A 5897 SET_VREG %eax, rINST # fp[A] <- value 5898 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5899 5900 /* ------------------------------ */ 5901 .balign 128 5902 .L_op_iget_wide_quick: /* 0xe4 */ 5903 /* File: x86/op_iget_wide_quick.S */ 5904 /* iget-wide-quick vA, vB, offset@CCCC */ 5905 movzbl rINSTbl, %ecx # ecx <- BA 5906 sarl $4, %ecx # ecx <- B 5907 GET_VREG %ecx, %ecx # vB (object we're operating on) 5908 movzwl 2(rPC), %eax # eax <- field byte offset 5909 testl %ecx, %ecx # is object null? 5910 je common_errNullObject 5911 movq (%ecx,%eax,1), %xmm0 5912 andb $0xf, rINSTbl # rINST <- A 5913 SET_WIDE_FP_VREG %xmm0, rINST 5914 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5915 5916 /* ------------------------------ */ 5917 .balign 128 5918 .L_op_iget_object_quick: /* 0xe5 */ 5919 /* File: x86/op_iget_object_quick.S */ 5920 /* For: iget-object-quick */ 5921 /* op vA, vB, offset@CCCC */ 5922 movzbl rINSTbl, %ecx # ecx <- BA 5923 sarl $4, %ecx # ecx <- B 5924 GET_VREG %ecx, %ecx # vB (object we're operating on) 5925 movzwl 2(rPC), %eax # eax <- field byte offset 5926 movl %ecx, OUT_ARG0(%esp) 5927 movl %eax, OUT_ARG1(%esp) 5928 EXPORT_PC 5929 call SYMBOL(artIGetObjectFromMterp) # (obj, offset) 5930 movl rSELF, %ecx 5931 RESTORE_IBASE_FROM_SELF %ecx 5932 cmpl $0, THREAD_EXCEPTION_OFFSET(%ecx) 5933 jnz MterpException # bail out 5934 andb $0xf,rINSTbl # rINST <- A 5935 SET_VREG_OBJECT %eax, rINST # fp[A] <- value 5936 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5937 5938 /* ------------------------------ */ 5939 .balign 128 5940 .L_op_iput_quick: /* 0xe6 */ 5941 /* File: x86/op_iput_quick.S */ 5942 /* For: iput-quick, iput-object-quick */ 5943 /* op vA, vB, offset@CCCC */ 5944 movzbl rINSTbl, %ecx # ecx <- BA 5945 sarl $4, %ecx # ecx <- B 5946 GET_VREG %ecx, %ecx # vB (object we're operating on) 5947 testl %ecx, %ecx # is object null? 5948 je common_errNullObject 5949 andb $0xf, rINSTbl # rINST <- A 5950 GET_VREG rINST, rINST # rINST <- v[A] 5951 movzwl 2(rPC), %eax # eax <- field byte offset 5952 movl rINST, (%ecx,%eax,1) 5953 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5954 5955 /* ------------------------------ */ 5956 .balign 128 5957 .L_op_iput_wide_quick: /* 0xe7 */ 5958 /* File: x86/op_iput_wide_quick.S */ 5959 /* iput-wide-quick vA, vB, offset@CCCC */ 5960 movzbl rINSTbl, %ecx # ecx<- BA 5961 sarl $4, %ecx # ecx<- B 5962 GET_VREG %ecx, %ecx # vB (object we're operating on) 5963 testl %ecx, %ecx # is object null? 5964 je common_errNullObject 5965 movzwl 2(rPC), %eax # eax<- field byte offset 5966 leal (%ecx,%eax,1), %ecx # ecx<- Address of 64-bit target 5967 andb $0xf, rINSTbl # rINST<- A 5968 GET_WIDE_FP_VREG %xmm0, rINST # xmm0<- fp[A]/fp[A+1] 5969 movq %xmm0, (%ecx) # obj.field<- r0/r1 5970 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5971 5972 /* ------------------------------ */ 5973 .balign 128 5974 .L_op_iput_object_quick: /* 0xe8 */ 5975 /* File: x86/op_iput_object_quick.S */ 5976 EXPORT_PC 5977 leal OFF_FP_SHADOWFRAME(rFP), %eax 5978 movl %eax, OUT_ARG0(%esp) 5979 movl rPC, OUT_ARG1(%esp) 5980 REFRESH_INST 232 5981 movl rINST, OUT_ARG2(%esp) 5982 call SYMBOL(MterpIputObjectQuick) 5983 testb %al, %al 5984 jz MterpException 5985 RESTORE_IBASE 5986 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 5987 5988 /* ------------------------------ */ 5989 .balign 128 5990 .L_op_invoke_virtual_quick: /* 0xe9 */ 5991 /* File: x86/op_invoke_virtual_quick.S */ 5992 /* File: x86/invoke.S */ 5993 /* 5994 * Generic invoke handler wrapper. 5995 */ 5996 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 5997 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 5998 .extern MterpInvokeVirtualQuick 5999 EXPORT_PC 6000 movl rSELF, %ecx 6001 movl %ecx, OUT_ARG0(%esp) 6002 leal OFF_FP_SHADOWFRAME(rFP), %eax 6003 movl %eax, OUT_ARG1(%esp) 6004 movl rPC, OUT_ARG2(%esp) 6005 REFRESH_INST 233 6006 movl rINST, OUT_ARG3(%esp) 6007 call SYMBOL(MterpInvokeVirtualQuick) 6008 testb %al, %al 6009 jz MterpException 6010 ADVANCE_PC 3 6011 call SYMBOL(MterpShouldSwitchInterpreters) 6012 testb %al, %al 6013 jnz MterpFallback 6014 RESTORE_IBASE 6015 FETCH_INST 6016 GOTO_NEXT 6017 6018 6019 /* ------------------------------ */ 6020 .balign 128 6021 .L_op_invoke_virtual_range_quick: /* 0xea */ 6022 /* File: x86/op_invoke_virtual_range_quick.S */ 6023 /* File: x86/invoke.S */ 6024 /* 6025 * Generic invoke handler wrapper. 6026 */ 6027 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 6028 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 6029 .extern MterpInvokeVirtualQuickRange 6030 EXPORT_PC 6031 movl rSELF, %ecx 6032 movl %ecx, OUT_ARG0(%esp) 6033 leal OFF_FP_SHADOWFRAME(rFP), %eax 6034 movl %eax, OUT_ARG1(%esp) 6035 movl rPC, OUT_ARG2(%esp) 6036 REFRESH_INST 234 6037 movl rINST, OUT_ARG3(%esp) 6038 call SYMBOL(MterpInvokeVirtualQuickRange) 6039 testb %al, %al 6040 jz MterpException 6041 ADVANCE_PC 3 6042 call SYMBOL(MterpShouldSwitchInterpreters) 6043 testb %al, %al 6044 jnz MterpFallback 6045 RESTORE_IBASE 6046 FETCH_INST 6047 GOTO_NEXT 6048 6049 6050 /* ------------------------------ */ 6051 .balign 128 6052 .L_op_iput_boolean_quick: /* 0xeb */ 6053 /* File: x86/op_iput_boolean_quick.S */ 6054 /* File: x86/op_iput_quick.S */ 6055 /* For: iput-quick, iput-object-quick */ 6056 /* op vA, vB, offset@CCCC */ 6057 movzbl rINSTbl, %ecx # ecx <- BA 6058 sarl $4, %ecx # ecx <- B 6059 GET_VREG %ecx, %ecx # vB (object we're operating on) 6060 testl %ecx, %ecx # is object null? 6061 je common_errNullObject 6062 andb $0xf, rINSTbl # rINST <- A 6063 GET_VREG rINST, rINST # rINST <- v[A] 6064 movzwl 2(rPC), %eax # eax <- field byte offset 6065 movb rINSTbl, (%ecx,%eax,1) 6066 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 6067 6068 6069 /* ------------------------------ */ 6070 .balign 128 6071 .L_op_iput_byte_quick: /* 0xec */ 6072 /* File: x86/op_iput_byte_quick.S */ 6073 /* File: x86/op_iput_quick.S */ 6074 /* For: iput-quick, iput-object-quick */ 6075 /* op vA, vB, offset@CCCC */ 6076 movzbl rINSTbl, %ecx # ecx <- BA 6077 sarl $4, %ecx # ecx <- B 6078 GET_VREG %ecx, %ecx # vB (object we're operating on) 6079 testl %ecx, %ecx # is object null? 6080 je common_errNullObject 6081 andb $0xf, rINSTbl # rINST <- A 6082 GET_VREG rINST, rINST # rINST <- v[A] 6083 movzwl 2(rPC), %eax # eax <- field byte offset 6084 movb rINSTbl, (%ecx,%eax,1) 6085 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 6086 6087 6088 /* ------------------------------ */ 6089 .balign 128 6090 .L_op_iput_char_quick: /* 0xed */ 6091 /* File: x86/op_iput_char_quick.S */ 6092 /* File: x86/op_iput_quick.S */ 6093 /* For: iput-quick, iput-object-quick */ 6094 /* op vA, vB, offset@CCCC */ 6095 movzbl rINSTbl, %ecx # ecx <- BA 6096 sarl $4, %ecx # ecx <- B 6097 GET_VREG %ecx, %ecx # vB (object we're operating on) 6098 testl %ecx, %ecx # is object null? 6099 je common_errNullObject 6100 andb $0xf, rINSTbl # rINST <- A 6101 GET_VREG rINST, rINST # rINST <- v[A] 6102 movzwl 2(rPC), %eax # eax <- field byte offset 6103 movw rINSTw, (%ecx,%eax,1) 6104 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 6105 6106 6107 /* ------------------------------ */ 6108 .balign 128 6109 .L_op_iput_short_quick: /* 0xee */ 6110 /* File: x86/op_iput_short_quick.S */ 6111 /* File: x86/op_iput_quick.S */ 6112 /* For: iput-quick, iput-object-quick */ 6113 /* op vA, vB, offset@CCCC */ 6114 movzbl rINSTbl, %ecx # ecx <- BA 6115 sarl $4, %ecx # ecx <- B 6116 GET_VREG %ecx, %ecx # vB (object we're operating on) 6117 testl %ecx, %ecx # is object null? 6118 je common_errNullObject 6119 andb $0xf, rINSTbl # rINST <- A 6120 GET_VREG rINST, rINST # rINST <- v[A] 6121 movzwl 2(rPC), %eax # eax <- field byte offset 6122 movw rINSTw, (%ecx,%eax,1) 6123 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 6124 6125 6126 /* ------------------------------ */ 6127 .balign 128 6128 .L_op_iget_boolean_quick: /* 0xef */ 6129 /* File: x86/op_iget_boolean_quick.S */ 6130 /* File: x86/op_iget_quick.S */ 6131 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */ 6132 /* op vA, vB, offset@CCCC */ 6133 movzbl rINSTbl, %ecx # ecx <- BA 6134 sarl $4, %ecx # ecx <- B 6135 GET_VREG %ecx, %ecx # vB (object we're operating on) 6136 movzwl 2(rPC), %eax # eax <- field byte offset 6137 testl %ecx, %ecx # is object null? 6138 je common_errNullObject 6139 movsbl (%ecx,%eax,1), %eax 6140 andb $0xf,rINSTbl # rINST <- A 6141 SET_VREG %eax, rINST # fp[A] <- value 6142 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 6143 6144 6145 /* ------------------------------ */ 6146 .balign 128 6147 .L_op_iget_byte_quick: /* 0xf0 */ 6148 /* File: x86/op_iget_byte_quick.S */ 6149 /* File: x86/op_iget_quick.S */ 6150 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */ 6151 /* op vA, vB, offset@CCCC */ 6152 movzbl rINSTbl, %ecx # ecx <- BA 6153 sarl $4, %ecx # ecx <- B 6154 GET_VREG %ecx, %ecx # vB (object we're operating on) 6155 movzwl 2(rPC), %eax # eax <- field byte offset 6156 testl %ecx, %ecx # is object null? 6157 je common_errNullObject 6158 movsbl (%ecx,%eax,1), %eax 6159 andb $0xf,rINSTbl # rINST <- A 6160 SET_VREG %eax, rINST # fp[A] <- value 6161 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 6162 6163 6164 /* ------------------------------ */ 6165 .balign 128 6166 .L_op_iget_char_quick: /* 0xf1 */ 6167 /* File: x86/op_iget_char_quick.S */ 6168 /* File: x86/op_iget_quick.S */ 6169 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */ 6170 /* op vA, vB, offset@CCCC */ 6171 movzbl rINSTbl, %ecx # ecx <- BA 6172 sarl $4, %ecx # ecx <- B 6173 GET_VREG %ecx, %ecx # vB (object we're operating on) 6174 movzwl 2(rPC), %eax # eax <- field byte offset 6175 testl %ecx, %ecx # is object null? 6176 je common_errNullObject 6177 movzwl (%ecx,%eax,1), %eax 6178 andb $0xf,rINSTbl # rINST <- A 6179 SET_VREG %eax, rINST # fp[A] <- value 6180 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 6181 6182 6183 /* ------------------------------ */ 6184 .balign 128 6185 .L_op_iget_short_quick: /* 0xf2 */ 6186 /* File: x86/op_iget_short_quick.S */ 6187 /* File: x86/op_iget_quick.S */ 6188 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */ 6189 /* op vA, vB, offset@CCCC */ 6190 movzbl rINSTbl, %ecx # ecx <- BA 6191 sarl $4, %ecx # ecx <- B 6192 GET_VREG %ecx, %ecx # vB (object we're operating on) 6193 movzwl 2(rPC), %eax # eax <- field byte offset 6194 testl %ecx, %ecx # is object null? 6195 je common_errNullObject 6196 movswl (%ecx,%eax,1), %eax 6197 andb $0xf,rINSTbl # rINST <- A 6198 SET_VREG %eax, rINST # fp[A] <- value 6199 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 6200 6201 6202 /* ------------------------------ */ 6203 .balign 128 6204 .L_op_unused_f3: /* 0xf3 */ 6205 /* File: x86/op_unused_f3.S */ 6206 /* File: x86/unused.S */ 6207 /* 6208 * Bail to reference interpreter to throw. 6209 */ 6210 jmp MterpFallback 6211 6212 6213 /* ------------------------------ */ 6214 .balign 128 6215 .L_op_unused_f4: /* 0xf4 */ 6216 /* File: x86/op_unused_f4.S */ 6217 /* File: x86/unused.S */ 6218 /* 6219 * Bail to reference interpreter to throw. 6220 */ 6221 jmp MterpFallback 6222 6223 6224 /* ------------------------------ */ 6225 .balign 128 6226 .L_op_unused_f5: /* 0xf5 */ 6227 /* File: x86/op_unused_f5.S */ 6228 /* File: x86/unused.S */ 6229 /* 6230 * Bail to reference interpreter to throw. 6231 */ 6232 jmp MterpFallback 6233 6234 6235 /* ------------------------------ */ 6236 .balign 128 6237 .L_op_unused_f6: /* 0xf6 */ 6238 /* File: x86/op_unused_f6.S */ 6239 /* File: x86/unused.S */ 6240 /* 6241 * Bail to reference interpreter to throw. 6242 */ 6243 jmp MterpFallback 6244 6245 6246 /* ------------------------------ */ 6247 .balign 128 6248 .L_op_unused_f7: /* 0xf7 */ 6249 /* File: x86/op_unused_f7.S */ 6250 /* File: x86/unused.S */ 6251 /* 6252 * Bail to reference interpreter to throw. 6253 */ 6254 jmp MterpFallback 6255 6256 6257 /* ------------------------------ */ 6258 .balign 128 6259 .L_op_unused_f8: /* 0xf8 */ 6260 /* File: x86/op_unused_f8.S */ 6261 /* File: x86/unused.S */ 6262 /* 6263 * Bail to reference interpreter to throw. 6264 */ 6265 jmp MterpFallback 6266 6267 6268 /* ------------------------------ */ 6269 .balign 128 6270 .L_op_unused_f9: /* 0xf9 */ 6271 /* File: x86/op_unused_f9.S */ 6272 /* File: x86/unused.S */ 6273 /* 6274 * Bail to reference interpreter to throw. 6275 */ 6276 jmp MterpFallback 6277 6278 6279 /* ------------------------------ */ 6280 .balign 128 6281 .L_op_invoke_polymorphic: /* 0xfa */ 6282 /* Transfer stub to alternate interpreter */ 6283 jmp MterpFallback 6284 6285 6286 /* ------------------------------ */ 6287 .balign 128 6288 .L_op_invoke_polymorphic_range: /* 0xfb */ 6289 /* Transfer stub to alternate interpreter */ 6290 jmp MterpFallback 6291 6292 6293 /* ------------------------------ */ 6294 .balign 128 6295 .L_op_invoke_custom: /* 0xfc */ 6296 /* Transfer stub to alternate interpreter */ 6297 jmp MterpFallback 6298 6299 6300 /* ------------------------------ */ 6301 .balign 128 6302 .L_op_invoke_custom_range: /* 0xfd */ 6303 /* Transfer stub to alternate interpreter */ 6304 jmp MterpFallback 6305 6306 6307 /* ------------------------------ */ 6308 .balign 128 6309 .L_op_unused_fe: /* 0xfe */ 6310 /* File: x86/op_unused_fe.S */ 6311 /* File: x86/unused.S */ 6312 /* 6313 * Bail to reference interpreter to throw. 6314 */ 6315 jmp MterpFallback 6316 6317 6318 /* ------------------------------ */ 6319 .balign 128 6320 .L_op_unused_ff: /* 0xff */ 6321 /* File: x86/op_unused_ff.S */ 6322 /* File: x86/unused.S */ 6323 /* 6324 * Bail to reference interpreter to throw. 6325 */ 6326 jmp MterpFallback 6327 6328 6329 .balign 128 6330 SIZE(SYMBOL(artMterpAsmInstructionStart),SYMBOL(artMterpAsmInstructionStart)) 6331 .global SYMBOL(artMterpAsmInstructionEnd) 6332 SYMBOL(artMterpAsmInstructionEnd): 6333 6334 /* 6335 * =========================================================================== 6336 * Sister implementations 6337 * =========================================================================== 6338 */ 6339 .global SYMBOL(artMterpAsmSisterStart) 6340 FUNCTION_TYPE(SYMBOL(artMterpAsmSisterStart)) 6341 .text 6342 .balign 4 6343 SYMBOL(artMterpAsmSisterStart): 6344 6345 SIZE(SYMBOL(artMterpAsmSisterStart),SYMBOL(artMterpAsmSisterStart)) 6346 .global SYMBOL(artMterpAsmSisterEnd) 6347 SYMBOL(artMterpAsmSisterEnd): 6348 6349 6350 .global SYMBOL(artMterpAsmAltInstructionStart) 6351 FUNCTION_TYPE(SYMBOL(artMterpAsmAltInstructionStart)) 6352 .text 6353 6354 SYMBOL(artMterpAsmAltInstructionStart) = .L_ALT_op_nop 6355 /* ------------------------------ */ 6356 .balign 128 6357 .L_ALT_op_nop: /* 0x00 */ 6358 /* File: x86/alt_stub.S */ 6359 /* 6360 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6361 * any interesting requests and then jump to the real instruction 6362 * handler. Unlike the Arm handler, we can't do this as a tail call 6363 * because rIBASE is caller save and we need to reload it. 6364 * 6365 * Note that unlike in the Arm implementation, we should never arrive 6366 * here with a zero breakFlag because we always refresh rIBASE on 6367 * return. 6368 */ 6369 .extern MterpCheckBefore 6370 movl rSELF, %ecx 6371 movl %ecx, OUT_ARG0(%esp) 6372 leal OFF_FP_SHADOWFRAME(rFP), %eax 6373 movl %eax, OUT_ARG1(%esp) 6374 movl rPC, OUT_ARG2(%esp) 6375 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6376 REFRESH_IBASE 6377 jmp .L_op_nop+(0*128) 6378 6379 /* ------------------------------ */ 6380 .balign 128 6381 .L_ALT_op_move: /* 0x01 */ 6382 /* File: x86/alt_stub.S */ 6383 /* 6384 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6385 * any interesting requests and then jump to the real instruction 6386 * handler. Unlike the Arm handler, we can't do this as a tail call 6387 * because rIBASE is caller save and we need to reload it. 6388 * 6389 * Note that unlike in the Arm implementation, we should never arrive 6390 * here with a zero breakFlag because we always refresh rIBASE on 6391 * return. 6392 */ 6393 .extern MterpCheckBefore 6394 movl rSELF, %ecx 6395 movl %ecx, OUT_ARG0(%esp) 6396 leal OFF_FP_SHADOWFRAME(rFP), %eax 6397 movl %eax, OUT_ARG1(%esp) 6398 movl rPC, OUT_ARG2(%esp) 6399 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6400 REFRESH_IBASE 6401 jmp .L_op_nop+(1*128) 6402 6403 /* ------------------------------ */ 6404 .balign 128 6405 .L_ALT_op_move_from16: /* 0x02 */ 6406 /* File: x86/alt_stub.S */ 6407 /* 6408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6409 * any interesting requests and then jump to the real instruction 6410 * handler. Unlike the Arm handler, we can't do this as a tail call 6411 * because rIBASE is caller save and we need to reload it. 6412 * 6413 * Note that unlike in the Arm implementation, we should never arrive 6414 * here with a zero breakFlag because we always refresh rIBASE on 6415 * return. 6416 */ 6417 .extern MterpCheckBefore 6418 movl rSELF, %ecx 6419 movl %ecx, OUT_ARG0(%esp) 6420 leal OFF_FP_SHADOWFRAME(rFP), %eax 6421 movl %eax, OUT_ARG1(%esp) 6422 movl rPC, OUT_ARG2(%esp) 6423 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6424 REFRESH_IBASE 6425 jmp .L_op_nop+(2*128) 6426 6427 /* ------------------------------ */ 6428 .balign 128 6429 .L_ALT_op_move_16: /* 0x03 */ 6430 /* File: x86/alt_stub.S */ 6431 /* 6432 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6433 * any interesting requests and then jump to the real instruction 6434 * handler. Unlike the Arm handler, we can't do this as a tail call 6435 * because rIBASE is caller save and we need to reload it. 6436 * 6437 * Note that unlike in the Arm implementation, we should never arrive 6438 * here with a zero breakFlag because we always refresh rIBASE on 6439 * return. 6440 */ 6441 .extern MterpCheckBefore 6442 movl rSELF, %ecx 6443 movl %ecx, OUT_ARG0(%esp) 6444 leal OFF_FP_SHADOWFRAME(rFP), %eax 6445 movl %eax, OUT_ARG1(%esp) 6446 movl rPC, OUT_ARG2(%esp) 6447 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6448 REFRESH_IBASE 6449 jmp .L_op_nop+(3*128) 6450 6451 /* ------------------------------ */ 6452 .balign 128 6453 .L_ALT_op_move_wide: /* 0x04 */ 6454 /* File: x86/alt_stub.S */ 6455 /* 6456 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6457 * any interesting requests and then jump to the real instruction 6458 * handler. Unlike the Arm handler, we can't do this as a tail call 6459 * because rIBASE is caller save and we need to reload it. 6460 * 6461 * Note that unlike in the Arm implementation, we should never arrive 6462 * here with a zero breakFlag because we always refresh rIBASE on 6463 * return. 6464 */ 6465 .extern MterpCheckBefore 6466 movl rSELF, %ecx 6467 movl %ecx, OUT_ARG0(%esp) 6468 leal OFF_FP_SHADOWFRAME(rFP), %eax 6469 movl %eax, OUT_ARG1(%esp) 6470 movl rPC, OUT_ARG2(%esp) 6471 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6472 REFRESH_IBASE 6473 jmp .L_op_nop+(4*128) 6474 6475 /* ------------------------------ */ 6476 .balign 128 6477 .L_ALT_op_move_wide_from16: /* 0x05 */ 6478 /* File: x86/alt_stub.S */ 6479 /* 6480 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6481 * any interesting requests and then jump to the real instruction 6482 * handler. Unlike the Arm handler, we can't do this as a tail call 6483 * because rIBASE is caller save and we need to reload it. 6484 * 6485 * Note that unlike in the Arm implementation, we should never arrive 6486 * here with a zero breakFlag because we always refresh rIBASE on 6487 * return. 6488 */ 6489 .extern MterpCheckBefore 6490 movl rSELF, %ecx 6491 movl %ecx, OUT_ARG0(%esp) 6492 leal OFF_FP_SHADOWFRAME(rFP), %eax 6493 movl %eax, OUT_ARG1(%esp) 6494 movl rPC, OUT_ARG2(%esp) 6495 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6496 REFRESH_IBASE 6497 jmp .L_op_nop+(5*128) 6498 6499 /* ------------------------------ */ 6500 .balign 128 6501 .L_ALT_op_move_wide_16: /* 0x06 */ 6502 /* File: x86/alt_stub.S */ 6503 /* 6504 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6505 * any interesting requests and then jump to the real instruction 6506 * handler. Unlike the Arm handler, we can't do this as a tail call 6507 * because rIBASE is caller save and we need to reload it. 6508 * 6509 * Note that unlike in the Arm implementation, we should never arrive 6510 * here with a zero breakFlag because we always refresh rIBASE on 6511 * return. 6512 */ 6513 .extern MterpCheckBefore 6514 movl rSELF, %ecx 6515 movl %ecx, OUT_ARG0(%esp) 6516 leal OFF_FP_SHADOWFRAME(rFP), %eax 6517 movl %eax, OUT_ARG1(%esp) 6518 movl rPC, OUT_ARG2(%esp) 6519 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6520 REFRESH_IBASE 6521 jmp .L_op_nop+(6*128) 6522 6523 /* ------------------------------ */ 6524 .balign 128 6525 .L_ALT_op_move_object: /* 0x07 */ 6526 /* File: x86/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 movl rSELF, %ecx 6539 movl %ecx, OUT_ARG0(%esp) 6540 leal OFF_FP_SHADOWFRAME(rFP), %eax 6541 movl %eax, OUT_ARG1(%esp) 6542 movl rPC, OUT_ARG2(%esp) 6543 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6544 REFRESH_IBASE 6545 jmp .L_op_nop+(7*128) 6546 6547 /* ------------------------------ */ 6548 .balign 128 6549 .L_ALT_op_move_object_from16: /* 0x08 */ 6550 /* File: x86/alt_stub.S */ 6551 /* 6552 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6553 * any interesting requests and then jump to the real instruction 6554 * handler. Unlike the Arm handler, we can't do this as a tail call 6555 * because rIBASE is caller save and we need to reload it. 6556 * 6557 * Note that unlike in the Arm implementation, we should never arrive 6558 * here with a zero breakFlag because we always refresh rIBASE on 6559 * return. 6560 */ 6561 .extern MterpCheckBefore 6562 movl rSELF, %ecx 6563 movl %ecx, OUT_ARG0(%esp) 6564 leal OFF_FP_SHADOWFRAME(rFP), %eax 6565 movl %eax, OUT_ARG1(%esp) 6566 movl rPC, OUT_ARG2(%esp) 6567 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6568 REFRESH_IBASE 6569 jmp .L_op_nop+(8*128) 6570 6571 /* ------------------------------ */ 6572 .balign 128 6573 .L_ALT_op_move_object_16: /* 0x09 */ 6574 /* File: x86/alt_stub.S */ 6575 /* 6576 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6577 * any interesting requests and then jump to the real instruction 6578 * handler. Unlike the Arm handler, we can't do this as a tail call 6579 * because rIBASE is caller save and we need to reload it. 6580 * 6581 * Note that unlike in the Arm implementation, we should never arrive 6582 * here with a zero breakFlag because we always refresh rIBASE on 6583 * return. 6584 */ 6585 .extern MterpCheckBefore 6586 movl rSELF, %ecx 6587 movl %ecx, OUT_ARG0(%esp) 6588 leal OFF_FP_SHADOWFRAME(rFP), %eax 6589 movl %eax, OUT_ARG1(%esp) 6590 movl rPC, OUT_ARG2(%esp) 6591 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6592 REFRESH_IBASE 6593 jmp .L_op_nop+(9*128) 6594 6595 /* ------------------------------ */ 6596 .balign 128 6597 .L_ALT_op_move_result: /* 0x0a */ 6598 /* File: x86/alt_stub.S */ 6599 /* 6600 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6601 * any interesting requests and then jump to the real instruction 6602 * handler. Unlike the Arm handler, we can't do this as a tail call 6603 * because rIBASE is caller save and we need to reload it. 6604 * 6605 * Note that unlike in the Arm implementation, we should never arrive 6606 * here with a zero breakFlag because we always refresh rIBASE on 6607 * return. 6608 */ 6609 .extern MterpCheckBefore 6610 movl rSELF, %ecx 6611 movl %ecx, OUT_ARG0(%esp) 6612 leal OFF_FP_SHADOWFRAME(rFP), %eax 6613 movl %eax, OUT_ARG1(%esp) 6614 movl rPC, OUT_ARG2(%esp) 6615 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6616 REFRESH_IBASE 6617 jmp .L_op_nop+(10*128) 6618 6619 /* ------------------------------ */ 6620 .balign 128 6621 .L_ALT_op_move_result_wide: /* 0x0b */ 6622 /* File: x86/alt_stub.S */ 6623 /* 6624 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6625 * any interesting requests and then jump to the real instruction 6626 * handler. Unlike the Arm handler, we can't do this as a tail call 6627 * because rIBASE is caller save and we need to reload it. 6628 * 6629 * Note that unlike in the Arm implementation, we should never arrive 6630 * here with a zero breakFlag because we always refresh rIBASE on 6631 * return. 6632 */ 6633 .extern MterpCheckBefore 6634 movl rSELF, %ecx 6635 movl %ecx, OUT_ARG0(%esp) 6636 leal OFF_FP_SHADOWFRAME(rFP), %eax 6637 movl %eax, OUT_ARG1(%esp) 6638 movl rPC, OUT_ARG2(%esp) 6639 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6640 REFRESH_IBASE 6641 jmp .L_op_nop+(11*128) 6642 6643 /* ------------------------------ */ 6644 .balign 128 6645 .L_ALT_op_move_result_object: /* 0x0c */ 6646 /* File: x86/alt_stub.S */ 6647 /* 6648 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6649 * any interesting requests and then jump to the real instruction 6650 * handler. Unlike the Arm handler, we can't do this as a tail call 6651 * because rIBASE is caller save and we need to reload it. 6652 * 6653 * Note that unlike in the Arm implementation, we should never arrive 6654 * here with a zero breakFlag because we always refresh rIBASE on 6655 * return. 6656 */ 6657 .extern MterpCheckBefore 6658 movl rSELF, %ecx 6659 movl %ecx, OUT_ARG0(%esp) 6660 leal OFF_FP_SHADOWFRAME(rFP), %eax 6661 movl %eax, OUT_ARG1(%esp) 6662 movl rPC, OUT_ARG2(%esp) 6663 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6664 REFRESH_IBASE 6665 jmp .L_op_nop+(12*128) 6666 6667 /* ------------------------------ */ 6668 .balign 128 6669 .L_ALT_op_move_exception: /* 0x0d */ 6670 /* File: x86/alt_stub.S */ 6671 /* 6672 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6673 * any interesting requests and then jump to the real instruction 6674 * handler. Unlike the Arm handler, we can't do this as a tail call 6675 * because rIBASE is caller save and we need to reload it. 6676 * 6677 * Note that unlike in the Arm implementation, we should never arrive 6678 * here with a zero breakFlag because we always refresh rIBASE on 6679 * return. 6680 */ 6681 .extern MterpCheckBefore 6682 movl rSELF, %ecx 6683 movl %ecx, OUT_ARG0(%esp) 6684 leal OFF_FP_SHADOWFRAME(rFP), %eax 6685 movl %eax, OUT_ARG1(%esp) 6686 movl rPC, OUT_ARG2(%esp) 6687 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6688 REFRESH_IBASE 6689 jmp .L_op_nop+(13*128) 6690 6691 /* ------------------------------ */ 6692 .balign 128 6693 .L_ALT_op_return_void: /* 0x0e */ 6694 /* File: x86/alt_stub.S */ 6695 /* 6696 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6697 * any interesting requests and then jump to the real instruction 6698 * handler. Unlike the Arm handler, we can't do this as a tail call 6699 * because rIBASE is caller save and we need to reload it. 6700 * 6701 * Note that unlike in the Arm implementation, we should never arrive 6702 * here with a zero breakFlag because we always refresh rIBASE on 6703 * return. 6704 */ 6705 .extern MterpCheckBefore 6706 movl rSELF, %ecx 6707 movl %ecx, OUT_ARG0(%esp) 6708 leal OFF_FP_SHADOWFRAME(rFP), %eax 6709 movl %eax, OUT_ARG1(%esp) 6710 movl rPC, OUT_ARG2(%esp) 6711 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6712 REFRESH_IBASE 6713 jmp .L_op_nop+(14*128) 6714 6715 /* ------------------------------ */ 6716 .balign 128 6717 .L_ALT_op_return: /* 0x0f */ 6718 /* File: x86/alt_stub.S */ 6719 /* 6720 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6721 * any interesting requests and then jump to the real instruction 6722 * handler. Unlike the Arm handler, we can't do this as a tail call 6723 * because rIBASE is caller save and we need to reload it. 6724 * 6725 * Note that unlike in the Arm implementation, we should never arrive 6726 * here with a zero breakFlag because we always refresh rIBASE on 6727 * return. 6728 */ 6729 .extern MterpCheckBefore 6730 movl rSELF, %ecx 6731 movl %ecx, OUT_ARG0(%esp) 6732 leal OFF_FP_SHADOWFRAME(rFP), %eax 6733 movl %eax, OUT_ARG1(%esp) 6734 movl rPC, OUT_ARG2(%esp) 6735 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6736 REFRESH_IBASE 6737 jmp .L_op_nop+(15*128) 6738 6739 /* ------------------------------ */ 6740 .balign 128 6741 .L_ALT_op_return_wide: /* 0x10 */ 6742 /* File: x86/alt_stub.S */ 6743 /* 6744 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6745 * any interesting requests and then jump to the real instruction 6746 * handler. Unlike the Arm handler, we can't do this as a tail call 6747 * because rIBASE is caller save and we need to reload it. 6748 * 6749 * Note that unlike in the Arm implementation, we should never arrive 6750 * here with a zero breakFlag because we always refresh rIBASE on 6751 * return. 6752 */ 6753 .extern MterpCheckBefore 6754 movl rSELF, %ecx 6755 movl %ecx, OUT_ARG0(%esp) 6756 leal OFF_FP_SHADOWFRAME(rFP), %eax 6757 movl %eax, OUT_ARG1(%esp) 6758 movl rPC, OUT_ARG2(%esp) 6759 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6760 REFRESH_IBASE 6761 jmp .L_op_nop+(16*128) 6762 6763 /* ------------------------------ */ 6764 .balign 128 6765 .L_ALT_op_return_object: /* 0x11 */ 6766 /* File: x86/alt_stub.S */ 6767 /* 6768 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6769 * any interesting requests and then jump to the real instruction 6770 * handler. Unlike the Arm handler, we can't do this as a tail call 6771 * because rIBASE is caller save and we need to reload it. 6772 * 6773 * Note that unlike in the Arm implementation, we should never arrive 6774 * here with a zero breakFlag because we always refresh rIBASE on 6775 * return. 6776 */ 6777 .extern MterpCheckBefore 6778 movl rSELF, %ecx 6779 movl %ecx, OUT_ARG0(%esp) 6780 leal OFF_FP_SHADOWFRAME(rFP), %eax 6781 movl %eax, OUT_ARG1(%esp) 6782 movl rPC, OUT_ARG2(%esp) 6783 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6784 REFRESH_IBASE 6785 jmp .L_op_nop+(17*128) 6786 6787 /* ------------------------------ */ 6788 .balign 128 6789 .L_ALT_op_const_4: /* 0x12 */ 6790 /* File: x86/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 movl rSELF, %ecx 6803 movl %ecx, OUT_ARG0(%esp) 6804 leal OFF_FP_SHADOWFRAME(rFP), %eax 6805 movl %eax, OUT_ARG1(%esp) 6806 movl rPC, OUT_ARG2(%esp) 6807 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6808 REFRESH_IBASE 6809 jmp .L_op_nop+(18*128) 6810 6811 /* ------------------------------ */ 6812 .balign 128 6813 .L_ALT_op_const_16: /* 0x13 */ 6814 /* File: x86/alt_stub.S */ 6815 /* 6816 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6817 * any interesting requests and then jump to the real instruction 6818 * handler. Unlike the Arm handler, we can't do this as a tail call 6819 * because rIBASE is caller save and we need to reload it. 6820 * 6821 * Note that unlike in the Arm implementation, we should never arrive 6822 * here with a zero breakFlag because we always refresh rIBASE on 6823 * return. 6824 */ 6825 .extern MterpCheckBefore 6826 movl rSELF, %ecx 6827 movl %ecx, OUT_ARG0(%esp) 6828 leal OFF_FP_SHADOWFRAME(rFP), %eax 6829 movl %eax, OUT_ARG1(%esp) 6830 movl rPC, OUT_ARG2(%esp) 6831 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6832 REFRESH_IBASE 6833 jmp .L_op_nop+(19*128) 6834 6835 /* ------------------------------ */ 6836 .balign 128 6837 .L_ALT_op_const: /* 0x14 */ 6838 /* File: x86/alt_stub.S */ 6839 /* 6840 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6841 * any interesting requests and then jump to the real instruction 6842 * handler. Unlike the Arm handler, we can't do this as a tail call 6843 * because rIBASE is caller save and we need to reload it. 6844 * 6845 * Note that unlike in the Arm implementation, we should never arrive 6846 * here with a zero breakFlag because we always refresh rIBASE on 6847 * return. 6848 */ 6849 .extern MterpCheckBefore 6850 movl rSELF, %ecx 6851 movl %ecx, OUT_ARG0(%esp) 6852 leal OFF_FP_SHADOWFRAME(rFP), %eax 6853 movl %eax, OUT_ARG1(%esp) 6854 movl rPC, OUT_ARG2(%esp) 6855 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6856 REFRESH_IBASE 6857 jmp .L_op_nop+(20*128) 6858 6859 /* ------------------------------ */ 6860 .balign 128 6861 .L_ALT_op_const_high16: /* 0x15 */ 6862 /* File: x86/alt_stub.S */ 6863 /* 6864 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6865 * any interesting requests and then jump to the real instruction 6866 * handler. Unlike the Arm handler, we can't do this as a tail call 6867 * because rIBASE is caller save and we need to reload it. 6868 * 6869 * Note that unlike in the Arm implementation, we should never arrive 6870 * here with a zero breakFlag because we always refresh rIBASE on 6871 * return. 6872 */ 6873 .extern MterpCheckBefore 6874 movl rSELF, %ecx 6875 movl %ecx, OUT_ARG0(%esp) 6876 leal OFF_FP_SHADOWFRAME(rFP), %eax 6877 movl %eax, OUT_ARG1(%esp) 6878 movl rPC, OUT_ARG2(%esp) 6879 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6880 REFRESH_IBASE 6881 jmp .L_op_nop+(21*128) 6882 6883 /* ------------------------------ */ 6884 .balign 128 6885 .L_ALT_op_const_wide_16: /* 0x16 */ 6886 /* File: x86/alt_stub.S */ 6887 /* 6888 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6889 * any interesting requests and then jump to the real instruction 6890 * handler. Unlike the Arm handler, we can't do this as a tail call 6891 * because rIBASE is caller save and we need to reload it. 6892 * 6893 * Note that unlike in the Arm implementation, we should never arrive 6894 * here with a zero breakFlag because we always refresh rIBASE on 6895 * return. 6896 */ 6897 .extern MterpCheckBefore 6898 movl rSELF, %ecx 6899 movl %ecx, OUT_ARG0(%esp) 6900 leal OFF_FP_SHADOWFRAME(rFP), %eax 6901 movl %eax, OUT_ARG1(%esp) 6902 movl rPC, OUT_ARG2(%esp) 6903 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6904 REFRESH_IBASE 6905 jmp .L_op_nop+(22*128) 6906 6907 /* ------------------------------ */ 6908 .balign 128 6909 .L_ALT_op_const_wide_32: /* 0x17 */ 6910 /* File: x86/alt_stub.S */ 6911 /* 6912 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6913 * any interesting requests and then jump to the real instruction 6914 * handler. Unlike the Arm handler, we can't do this as a tail call 6915 * because rIBASE is caller save and we need to reload it. 6916 * 6917 * Note that unlike in the Arm implementation, we should never arrive 6918 * here with a zero breakFlag because we always refresh rIBASE on 6919 * return. 6920 */ 6921 .extern MterpCheckBefore 6922 movl rSELF, %ecx 6923 movl %ecx, OUT_ARG0(%esp) 6924 leal OFF_FP_SHADOWFRAME(rFP), %eax 6925 movl %eax, OUT_ARG1(%esp) 6926 movl rPC, OUT_ARG2(%esp) 6927 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6928 REFRESH_IBASE 6929 jmp .L_op_nop+(23*128) 6930 6931 /* ------------------------------ */ 6932 .balign 128 6933 .L_ALT_op_const_wide: /* 0x18 */ 6934 /* File: x86/alt_stub.S */ 6935 /* 6936 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6937 * any interesting requests and then jump to the real instruction 6938 * handler. Unlike the Arm handler, we can't do this as a tail call 6939 * because rIBASE is caller save and we need to reload it. 6940 * 6941 * Note that unlike in the Arm implementation, we should never arrive 6942 * here with a zero breakFlag because we always refresh rIBASE on 6943 * return. 6944 */ 6945 .extern MterpCheckBefore 6946 movl rSELF, %ecx 6947 movl %ecx, OUT_ARG0(%esp) 6948 leal OFF_FP_SHADOWFRAME(rFP), %eax 6949 movl %eax, OUT_ARG1(%esp) 6950 movl rPC, OUT_ARG2(%esp) 6951 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6952 REFRESH_IBASE 6953 jmp .L_op_nop+(24*128) 6954 6955 /* ------------------------------ */ 6956 .balign 128 6957 .L_ALT_op_const_wide_high16: /* 0x19 */ 6958 /* File: x86/alt_stub.S */ 6959 /* 6960 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6961 * any interesting requests and then jump to the real instruction 6962 * handler. Unlike the Arm handler, we can't do this as a tail call 6963 * because rIBASE is caller save and we need to reload it. 6964 * 6965 * Note that unlike in the Arm implementation, we should never arrive 6966 * here with a zero breakFlag because we always refresh rIBASE on 6967 * return. 6968 */ 6969 .extern MterpCheckBefore 6970 movl rSELF, %ecx 6971 movl %ecx, OUT_ARG0(%esp) 6972 leal OFF_FP_SHADOWFRAME(rFP), %eax 6973 movl %eax, OUT_ARG1(%esp) 6974 movl rPC, OUT_ARG2(%esp) 6975 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 6976 REFRESH_IBASE 6977 jmp .L_op_nop+(25*128) 6978 6979 /* ------------------------------ */ 6980 .balign 128 6981 .L_ALT_op_const_string: /* 0x1a */ 6982 /* File: x86/alt_stub.S */ 6983 /* 6984 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 6985 * any interesting requests and then jump to the real instruction 6986 * handler. Unlike the Arm handler, we can't do this as a tail call 6987 * because rIBASE is caller save and we need to reload it. 6988 * 6989 * Note that unlike in the Arm implementation, we should never arrive 6990 * here with a zero breakFlag because we always refresh rIBASE on 6991 * return. 6992 */ 6993 .extern MterpCheckBefore 6994 movl rSELF, %ecx 6995 movl %ecx, OUT_ARG0(%esp) 6996 leal OFF_FP_SHADOWFRAME(rFP), %eax 6997 movl %eax, OUT_ARG1(%esp) 6998 movl rPC, OUT_ARG2(%esp) 6999 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7000 REFRESH_IBASE 7001 jmp .L_op_nop+(26*128) 7002 7003 /* ------------------------------ */ 7004 .balign 128 7005 .L_ALT_op_const_string_jumbo: /* 0x1b */ 7006 /* File: x86/alt_stub.S */ 7007 /* 7008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7009 * any interesting requests and then jump to the real instruction 7010 * handler. Unlike the Arm handler, we can't do this as a tail call 7011 * because rIBASE is caller save and we need to reload it. 7012 * 7013 * Note that unlike in the Arm implementation, we should never arrive 7014 * here with a zero breakFlag because we always refresh rIBASE on 7015 * return. 7016 */ 7017 .extern MterpCheckBefore 7018 movl rSELF, %ecx 7019 movl %ecx, OUT_ARG0(%esp) 7020 leal OFF_FP_SHADOWFRAME(rFP), %eax 7021 movl %eax, OUT_ARG1(%esp) 7022 movl rPC, OUT_ARG2(%esp) 7023 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7024 REFRESH_IBASE 7025 jmp .L_op_nop+(27*128) 7026 7027 /* ------------------------------ */ 7028 .balign 128 7029 .L_ALT_op_const_class: /* 0x1c */ 7030 /* File: x86/alt_stub.S */ 7031 /* 7032 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7033 * any interesting requests and then jump to the real instruction 7034 * handler. Unlike the Arm handler, we can't do this as a tail call 7035 * because rIBASE is caller save and we need to reload it. 7036 * 7037 * Note that unlike in the Arm implementation, we should never arrive 7038 * here with a zero breakFlag because we always refresh rIBASE on 7039 * return. 7040 */ 7041 .extern MterpCheckBefore 7042 movl rSELF, %ecx 7043 movl %ecx, OUT_ARG0(%esp) 7044 leal OFF_FP_SHADOWFRAME(rFP), %eax 7045 movl %eax, OUT_ARG1(%esp) 7046 movl rPC, OUT_ARG2(%esp) 7047 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7048 REFRESH_IBASE 7049 jmp .L_op_nop+(28*128) 7050 7051 /* ------------------------------ */ 7052 .balign 128 7053 .L_ALT_op_monitor_enter: /* 0x1d */ 7054 /* File: x86/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 movl rSELF, %ecx 7067 movl %ecx, OUT_ARG0(%esp) 7068 leal OFF_FP_SHADOWFRAME(rFP), %eax 7069 movl %eax, OUT_ARG1(%esp) 7070 movl rPC, OUT_ARG2(%esp) 7071 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7072 REFRESH_IBASE 7073 jmp .L_op_nop+(29*128) 7074 7075 /* ------------------------------ */ 7076 .balign 128 7077 .L_ALT_op_monitor_exit: /* 0x1e */ 7078 /* File: x86/alt_stub.S */ 7079 /* 7080 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7081 * any interesting requests and then jump to the real instruction 7082 * handler. Unlike the Arm handler, we can't do this as a tail call 7083 * because rIBASE is caller save and we need to reload it. 7084 * 7085 * Note that unlike in the Arm implementation, we should never arrive 7086 * here with a zero breakFlag because we always refresh rIBASE on 7087 * return. 7088 */ 7089 .extern MterpCheckBefore 7090 movl rSELF, %ecx 7091 movl %ecx, OUT_ARG0(%esp) 7092 leal OFF_FP_SHADOWFRAME(rFP), %eax 7093 movl %eax, OUT_ARG1(%esp) 7094 movl rPC, OUT_ARG2(%esp) 7095 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7096 REFRESH_IBASE 7097 jmp .L_op_nop+(30*128) 7098 7099 /* ------------------------------ */ 7100 .balign 128 7101 .L_ALT_op_check_cast: /* 0x1f */ 7102 /* File: x86/alt_stub.S */ 7103 /* 7104 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7105 * any interesting requests and then jump to the real instruction 7106 * handler. Unlike the Arm handler, we can't do this as a tail call 7107 * because rIBASE is caller save and we need to reload it. 7108 * 7109 * Note that unlike in the Arm implementation, we should never arrive 7110 * here with a zero breakFlag because we always refresh rIBASE on 7111 * return. 7112 */ 7113 .extern MterpCheckBefore 7114 movl rSELF, %ecx 7115 movl %ecx, OUT_ARG0(%esp) 7116 leal OFF_FP_SHADOWFRAME(rFP), %eax 7117 movl %eax, OUT_ARG1(%esp) 7118 movl rPC, OUT_ARG2(%esp) 7119 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7120 REFRESH_IBASE 7121 jmp .L_op_nop+(31*128) 7122 7123 /* ------------------------------ */ 7124 .balign 128 7125 .L_ALT_op_instance_of: /* 0x20 */ 7126 /* File: x86/alt_stub.S */ 7127 /* 7128 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7129 * any interesting requests and then jump to the real instruction 7130 * handler. Unlike the Arm handler, we can't do this as a tail call 7131 * because rIBASE is caller save and we need to reload it. 7132 * 7133 * Note that unlike in the Arm implementation, we should never arrive 7134 * here with a zero breakFlag because we always refresh rIBASE on 7135 * return. 7136 */ 7137 .extern MterpCheckBefore 7138 movl rSELF, %ecx 7139 movl %ecx, OUT_ARG0(%esp) 7140 leal OFF_FP_SHADOWFRAME(rFP), %eax 7141 movl %eax, OUT_ARG1(%esp) 7142 movl rPC, OUT_ARG2(%esp) 7143 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7144 REFRESH_IBASE 7145 jmp .L_op_nop+(32*128) 7146 7147 /* ------------------------------ */ 7148 .balign 128 7149 .L_ALT_op_array_length: /* 0x21 */ 7150 /* File: x86/alt_stub.S */ 7151 /* 7152 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7153 * any interesting requests and then jump to the real instruction 7154 * handler. Unlike the Arm handler, we can't do this as a tail call 7155 * because rIBASE is caller save and we need to reload it. 7156 * 7157 * Note that unlike in the Arm implementation, we should never arrive 7158 * here with a zero breakFlag because we always refresh rIBASE on 7159 * return. 7160 */ 7161 .extern MterpCheckBefore 7162 movl rSELF, %ecx 7163 movl %ecx, OUT_ARG0(%esp) 7164 leal OFF_FP_SHADOWFRAME(rFP), %eax 7165 movl %eax, OUT_ARG1(%esp) 7166 movl rPC, OUT_ARG2(%esp) 7167 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7168 REFRESH_IBASE 7169 jmp .L_op_nop+(33*128) 7170 7171 /* ------------------------------ */ 7172 .balign 128 7173 .L_ALT_op_new_instance: /* 0x22 */ 7174 /* File: x86/alt_stub.S */ 7175 /* 7176 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7177 * any interesting requests and then jump to the real instruction 7178 * handler. Unlike the Arm handler, we can't do this as a tail call 7179 * because rIBASE is caller save and we need to reload it. 7180 * 7181 * Note that unlike in the Arm implementation, we should never arrive 7182 * here with a zero breakFlag because we always refresh rIBASE on 7183 * return. 7184 */ 7185 .extern MterpCheckBefore 7186 movl rSELF, %ecx 7187 movl %ecx, OUT_ARG0(%esp) 7188 leal OFF_FP_SHADOWFRAME(rFP), %eax 7189 movl %eax, OUT_ARG1(%esp) 7190 movl rPC, OUT_ARG2(%esp) 7191 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7192 REFRESH_IBASE 7193 jmp .L_op_nop+(34*128) 7194 7195 /* ------------------------------ */ 7196 .balign 128 7197 .L_ALT_op_new_array: /* 0x23 */ 7198 /* File: x86/alt_stub.S */ 7199 /* 7200 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7201 * any interesting requests and then jump to the real instruction 7202 * handler. Unlike the Arm handler, we can't do this as a tail call 7203 * because rIBASE is caller save and we need to reload it. 7204 * 7205 * Note that unlike in the Arm implementation, we should never arrive 7206 * here with a zero breakFlag because we always refresh rIBASE on 7207 * return. 7208 */ 7209 .extern MterpCheckBefore 7210 movl rSELF, %ecx 7211 movl %ecx, OUT_ARG0(%esp) 7212 leal OFF_FP_SHADOWFRAME(rFP), %eax 7213 movl %eax, OUT_ARG1(%esp) 7214 movl rPC, OUT_ARG2(%esp) 7215 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7216 REFRESH_IBASE 7217 jmp .L_op_nop+(35*128) 7218 7219 /* ------------------------------ */ 7220 .balign 128 7221 .L_ALT_op_filled_new_array: /* 0x24 */ 7222 /* File: x86/alt_stub.S */ 7223 /* 7224 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7225 * any interesting requests and then jump to the real instruction 7226 * handler. Unlike the Arm handler, we can't do this as a tail call 7227 * because rIBASE is caller save and we need to reload it. 7228 * 7229 * Note that unlike in the Arm implementation, we should never arrive 7230 * here with a zero breakFlag because we always refresh rIBASE on 7231 * return. 7232 */ 7233 .extern MterpCheckBefore 7234 movl rSELF, %ecx 7235 movl %ecx, OUT_ARG0(%esp) 7236 leal OFF_FP_SHADOWFRAME(rFP), %eax 7237 movl %eax, OUT_ARG1(%esp) 7238 movl rPC, OUT_ARG2(%esp) 7239 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7240 REFRESH_IBASE 7241 jmp .L_op_nop+(36*128) 7242 7243 /* ------------------------------ */ 7244 .balign 128 7245 .L_ALT_op_filled_new_array_range: /* 0x25 */ 7246 /* File: x86/alt_stub.S */ 7247 /* 7248 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7249 * any interesting requests and then jump to the real instruction 7250 * handler. Unlike the Arm handler, we can't do this as a tail call 7251 * because rIBASE is caller save and we need to reload it. 7252 * 7253 * Note that unlike in the Arm implementation, we should never arrive 7254 * here with a zero breakFlag because we always refresh rIBASE on 7255 * return. 7256 */ 7257 .extern MterpCheckBefore 7258 movl rSELF, %ecx 7259 movl %ecx, OUT_ARG0(%esp) 7260 leal OFF_FP_SHADOWFRAME(rFP), %eax 7261 movl %eax, OUT_ARG1(%esp) 7262 movl rPC, OUT_ARG2(%esp) 7263 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7264 REFRESH_IBASE 7265 jmp .L_op_nop+(37*128) 7266 7267 /* ------------------------------ */ 7268 .balign 128 7269 .L_ALT_op_fill_array_data: /* 0x26 */ 7270 /* File: x86/alt_stub.S */ 7271 /* 7272 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7273 * any interesting requests and then jump to the real instruction 7274 * handler. Unlike the Arm handler, we can't do this as a tail call 7275 * because rIBASE is caller save and we need to reload it. 7276 * 7277 * Note that unlike in the Arm implementation, we should never arrive 7278 * here with a zero breakFlag because we always refresh rIBASE on 7279 * return. 7280 */ 7281 .extern MterpCheckBefore 7282 movl rSELF, %ecx 7283 movl %ecx, OUT_ARG0(%esp) 7284 leal OFF_FP_SHADOWFRAME(rFP), %eax 7285 movl %eax, OUT_ARG1(%esp) 7286 movl rPC, OUT_ARG2(%esp) 7287 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7288 REFRESH_IBASE 7289 jmp .L_op_nop+(38*128) 7290 7291 /* ------------------------------ */ 7292 .balign 128 7293 .L_ALT_op_throw: /* 0x27 */ 7294 /* File: x86/alt_stub.S */ 7295 /* 7296 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7297 * any interesting requests and then jump to the real instruction 7298 * handler. Unlike the Arm handler, we can't do this as a tail call 7299 * because rIBASE is caller save and we need to reload it. 7300 * 7301 * Note that unlike in the Arm implementation, we should never arrive 7302 * here with a zero breakFlag because we always refresh rIBASE on 7303 * return. 7304 */ 7305 .extern MterpCheckBefore 7306 movl rSELF, %ecx 7307 movl %ecx, OUT_ARG0(%esp) 7308 leal OFF_FP_SHADOWFRAME(rFP), %eax 7309 movl %eax, OUT_ARG1(%esp) 7310 movl rPC, OUT_ARG2(%esp) 7311 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7312 REFRESH_IBASE 7313 jmp .L_op_nop+(39*128) 7314 7315 /* ------------------------------ */ 7316 .balign 128 7317 .L_ALT_op_goto: /* 0x28 */ 7318 /* File: x86/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 movl rSELF, %ecx 7331 movl %ecx, OUT_ARG0(%esp) 7332 leal OFF_FP_SHADOWFRAME(rFP), %eax 7333 movl %eax, OUT_ARG1(%esp) 7334 movl rPC, OUT_ARG2(%esp) 7335 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7336 REFRESH_IBASE 7337 jmp .L_op_nop+(40*128) 7338 7339 /* ------------------------------ */ 7340 .balign 128 7341 .L_ALT_op_goto_16: /* 0x29 */ 7342 /* File: x86/alt_stub.S */ 7343 /* 7344 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7345 * any interesting requests and then jump to the real instruction 7346 * handler. Unlike the Arm handler, we can't do this as a tail call 7347 * because rIBASE is caller save and we need to reload it. 7348 * 7349 * Note that unlike in the Arm implementation, we should never arrive 7350 * here with a zero breakFlag because we always refresh rIBASE on 7351 * return. 7352 */ 7353 .extern MterpCheckBefore 7354 movl rSELF, %ecx 7355 movl %ecx, OUT_ARG0(%esp) 7356 leal OFF_FP_SHADOWFRAME(rFP), %eax 7357 movl %eax, OUT_ARG1(%esp) 7358 movl rPC, OUT_ARG2(%esp) 7359 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7360 REFRESH_IBASE 7361 jmp .L_op_nop+(41*128) 7362 7363 /* ------------------------------ */ 7364 .balign 128 7365 .L_ALT_op_goto_32: /* 0x2a */ 7366 /* File: x86/alt_stub.S */ 7367 /* 7368 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7369 * any interesting requests and then jump to the real instruction 7370 * handler. Unlike the Arm handler, we can't do this as a tail call 7371 * because rIBASE is caller save and we need to reload it. 7372 * 7373 * Note that unlike in the Arm implementation, we should never arrive 7374 * here with a zero breakFlag because we always refresh rIBASE on 7375 * return. 7376 */ 7377 .extern MterpCheckBefore 7378 movl rSELF, %ecx 7379 movl %ecx, OUT_ARG0(%esp) 7380 leal OFF_FP_SHADOWFRAME(rFP), %eax 7381 movl %eax, OUT_ARG1(%esp) 7382 movl rPC, OUT_ARG2(%esp) 7383 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7384 REFRESH_IBASE 7385 jmp .L_op_nop+(42*128) 7386 7387 /* ------------------------------ */ 7388 .balign 128 7389 .L_ALT_op_packed_switch: /* 0x2b */ 7390 /* File: x86/alt_stub.S */ 7391 /* 7392 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7393 * any interesting requests and then jump to the real instruction 7394 * handler. Unlike the Arm handler, we can't do this as a tail call 7395 * because rIBASE is caller save and we need to reload it. 7396 * 7397 * Note that unlike in the Arm implementation, we should never arrive 7398 * here with a zero breakFlag because we always refresh rIBASE on 7399 * return. 7400 */ 7401 .extern MterpCheckBefore 7402 movl rSELF, %ecx 7403 movl %ecx, OUT_ARG0(%esp) 7404 leal OFF_FP_SHADOWFRAME(rFP), %eax 7405 movl %eax, OUT_ARG1(%esp) 7406 movl rPC, OUT_ARG2(%esp) 7407 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7408 REFRESH_IBASE 7409 jmp .L_op_nop+(43*128) 7410 7411 /* ------------------------------ */ 7412 .balign 128 7413 .L_ALT_op_sparse_switch: /* 0x2c */ 7414 /* File: x86/alt_stub.S */ 7415 /* 7416 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7417 * any interesting requests and then jump to the real instruction 7418 * handler. Unlike the Arm handler, we can't do this as a tail call 7419 * because rIBASE is caller save and we need to reload it. 7420 * 7421 * Note that unlike in the Arm implementation, we should never arrive 7422 * here with a zero breakFlag because we always refresh rIBASE on 7423 * return. 7424 */ 7425 .extern MterpCheckBefore 7426 movl rSELF, %ecx 7427 movl %ecx, OUT_ARG0(%esp) 7428 leal OFF_FP_SHADOWFRAME(rFP), %eax 7429 movl %eax, OUT_ARG1(%esp) 7430 movl rPC, OUT_ARG2(%esp) 7431 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7432 REFRESH_IBASE 7433 jmp .L_op_nop+(44*128) 7434 7435 /* ------------------------------ */ 7436 .balign 128 7437 .L_ALT_op_cmpl_float: /* 0x2d */ 7438 /* File: x86/alt_stub.S */ 7439 /* 7440 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7441 * any interesting requests and then jump to the real instruction 7442 * handler. Unlike the Arm handler, we can't do this as a tail call 7443 * because rIBASE is caller save and we need to reload it. 7444 * 7445 * Note that unlike in the Arm implementation, we should never arrive 7446 * here with a zero breakFlag because we always refresh rIBASE on 7447 * return. 7448 */ 7449 .extern MterpCheckBefore 7450 movl rSELF, %ecx 7451 movl %ecx, OUT_ARG0(%esp) 7452 leal OFF_FP_SHADOWFRAME(rFP), %eax 7453 movl %eax, OUT_ARG1(%esp) 7454 movl rPC, OUT_ARG2(%esp) 7455 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7456 REFRESH_IBASE 7457 jmp .L_op_nop+(45*128) 7458 7459 /* ------------------------------ */ 7460 .balign 128 7461 .L_ALT_op_cmpg_float: /* 0x2e */ 7462 /* File: x86/alt_stub.S */ 7463 /* 7464 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7465 * any interesting requests and then jump to the real instruction 7466 * handler. Unlike the Arm handler, we can't do this as a tail call 7467 * because rIBASE is caller save and we need to reload it. 7468 * 7469 * Note that unlike in the Arm implementation, we should never arrive 7470 * here with a zero breakFlag because we always refresh rIBASE on 7471 * return. 7472 */ 7473 .extern MterpCheckBefore 7474 movl rSELF, %ecx 7475 movl %ecx, OUT_ARG0(%esp) 7476 leal OFF_FP_SHADOWFRAME(rFP), %eax 7477 movl %eax, OUT_ARG1(%esp) 7478 movl rPC, OUT_ARG2(%esp) 7479 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7480 REFRESH_IBASE 7481 jmp .L_op_nop+(46*128) 7482 7483 /* ------------------------------ */ 7484 .balign 128 7485 .L_ALT_op_cmpl_double: /* 0x2f */ 7486 /* File: x86/alt_stub.S */ 7487 /* 7488 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7489 * any interesting requests and then jump to the real instruction 7490 * handler. Unlike the Arm handler, we can't do this as a tail call 7491 * because rIBASE is caller save and we need to reload it. 7492 * 7493 * Note that unlike in the Arm implementation, we should never arrive 7494 * here with a zero breakFlag because we always refresh rIBASE on 7495 * return. 7496 */ 7497 .extern MterpCheckBefore 7498 movl rSELF, %ecx 7499 movl %ecx, OUT_ARG0(%esp) 7500 leal OFF_FP_SHADOWFRAME(rFP), %eax 7501 movl %eax, OUT_ARG1(%esp) 7502 movl rPC, OUT_ARG2(%esp) 7503 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7504 REFRESH_IBASE 7505 jmp .L_op_nop+(47*128) 7506 7507 /* ------------------------------ */ 7508 .balign 128 7509 .L_ALT_op_cmpg_double: /* 0x30 */ 7510 /* File: x86/alt_stub.S */ 7511 /* 7512 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7513 * any interesting requests and then jump to the real instruction 7514 * handler. Unlike the Arm handler, we can't do this as a tail call 7515 * because rIBASE is caller save and we need to reload it. 7516 * 7517 * Note that unlike in the Arm implementation, we should never arrive 7518 * here with a zero breakFlag because we always refresh rIBASE on 7519 * return. 7520 */ 7521 .extern MterpCheckBefore 7522 movl rSELF, %ecx 7523 movl %ecx, OUT_ARG0(%esp) 7524 leal OFF_FP_SHADOWFRAME(rFP), %eax 7525 movl %eax, OUT_ARG1(%esp) 7526 movl rPC, OUT_ARG2(%esp) 7527 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7528 REFRESH_IBASE 7529 jmp .L_op_nop+(48*128) 7530 7531 /* ------------------------------ */ 7532 .balign 128 7533 .L_ALT_op_cmp_long: /* 0x31 */ 7534 /* File: x86/alt_stub.S */ 7535 /* 7536 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7537 * any interesting requests and then jump to the real instruction 7538 * handler. Unlike the Arm handler, we can't do this as a tail call 7539 * because rIBASE is caller save and we need to reload it. 7540 * 7541 * Note that unlike in the Arm implementation, we should never arrive 7542 * here with a zero breakFlag because we always refresh rIBASE on 7543 * return. 7544 */ 7545 .extern MterpCheckBefore 7546 movl rSELF, %ecx 7547 movl %ecx, OUT_ARG0(%esp) 7548 leal OFF_FP_SHADOWFRAME(rFP), %eax 7549 movl %eax, OUT_ARG1(%esp) 7550 movl rPC, OUT_ARG2(%esp) 7551 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7552 REFRESH_IBASE 7553 jmp .L_op_nop+(49*128) 7554 7555 /* ------------------------------ */ 7556 .balign 128 7557 .L_ALT_op_if_eq: /* 0x32 */ 7558 /* File: x86/alt_stub.S */ 7559 /* 7560 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7561 * any interesting requests and then jump to the real instruction 7562 * handler. Unlike the Arm handler, we can't do this as a tail call 7563 * because rIBASE is caller save and we need to reload it. 7564 * 7565 * Note that unlike in the Arm implementation, we should never arrive 7566 * here with a zero breakFlag because we always refresh rIBASE on 7567 * return. 7568 */ 7569 .extern MterpCheckBefore 7570 movl rSELF, %ecx 7571 movl %ecx, OUT_ARG0(%esp) 7572 leal OFF_FP_SHADOWFRAME(rFP), %eax 7573 movl %eax, OUT_ARG1(%esp) 7574 movl rPC, OUT_ARG2(%esp) 7575 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7576 REFRESH_IBASE 7577 jmp .L_op_nop+(50*128) 7578 7579 /* ------------------------------ */ 7580 .balign 128 7581 .L_ALT_op_if_ne: /* 0x33 */ 7582 /* File: x86/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 movl rSELF, %ecx 7595 movl %ecx, OUT_ARG0(%esp) 7596 leal OFF_FP_SHADOWFRAME(rFP), %eax 7597 movl %eax, OUT_ARG1(%esp) 7598 movl rPC, OUT_ARG2(%esp) 7599 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7600 REFRESH_IBASE 7601 jmp .L_op_nop+(51*128) 7602 7603 /* ------------------------------ */ 7604 .balign 128 7605 .L_ALT_op_if_lt: /* 0x34 */ 7606 /* File: x86/alt_stub.S */ 7607 /* 7608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7609 * any interesting requests and then jump to the real instruction 7610 * handler. Unlike the Arm handler, we can't do this as a tail call 7611 * because rIBASE is caller save and we need to reload it. 7612 * 7613 * Note that unlike in the Arm implementation, we should never arrive 7614 * here with a zero breakFlag because we always refresh rIBASE on 7615 * return. 7616 */ 7617 .extern MterpCheckBefore 7618 movl rSELF, %ecx 7619 movl %ecx, OUT_ARG0(%esp) 7620 leal OFF_FP_SHADOWFRAME(rFP), %eax 7621 movl %eax, OUT_ARG1(%esp) 7622 movl rPC, OUT_ARG2(%esp) 7623 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7624 REFRESH_IBASE 7625 jmp .L_op_nop+(52*128) 7626 7627 /* ------------------------------ */ 7628 .balign 128 7629 .L_ALT_op_if_ge: /* 0x35 */ 7630 /* File: x86/alt_stub.S */ 7631 /* 7632 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7633 * any interesting requests and then jump to the real instruction 7634 * handler. Unlike the Arm handler, we can't do this as a tail call 7635 * because rIBASE is caller save and we need to reload it. 7636 * 7637 * Note that unlike in the Arm implementation, we should never arrive 7638 * here with a zero breakFlag because we always refresh rIBASE on 7639 * return. 7640 */ 7641 .extern MterpCheckBefore 7642 movl rSELF, %ecx 7643 movl %ecx, OUT_ARG0(%esp) 7644 leal OFF_FP_SHADOWFRAME(rFP), %eax 7645 movl %eax, OUT_ARG1(%esp) 7646 movl rPC, OUT_ARG2(%esp) 7647 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7648 REFRESH_IBASE 7649 jmp .L_op_nop+(53*128) 7650 7651 /* ------------------------------ */ 7652 .balign 128 7653 .L_ALT_op_if_gt: /* 0x36 */ 7654 /* File: x86/alt_stub.S */ 7655 /* 7656 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7657 * any interesting requests and then jump to the real instruction 7658 * handler. Unlike the Arm handler, we can't do this as a tail call 7659 * because rIBASE is caller save and we need to reload it. 7660 * 7661 * Note that unlike in the Arm implementation, we should never arrive 7662 * here with a zero breakFlag because we always refresh rIBASE on 7663 * return. 7664 */ 7665 .extern MterpCheckBefore 7666 movl rSELF, %ecx 7667 movl %ecx, OUT_ARG0(%esp) 7668 leal OFF_FP_SHADOWFRAME(rFP), %eax 7669 movl %eax, OUT_ARG1(%esp) 7670 movl rPC, OUT_ARG2(%esp) 7671 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7672 REFRESH_IBASE 7673 jmp .L_op_nop+(54*128) 7674 7675 /* ------------------------------ */ 7676 .balign 128 7677 .L_ALT_op_if_le: /* 0x37 */ 7678 /* File: x86/alt_stub.S */ 7679 /* 7680 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7681 * any interesting requests and then jump to the real instruction 7682 * handler. Unlike the Arm handler, we can't do this as a tail call 7683 * because rIBASE is caller save and we need to reload it. 7684 * 7685 * Note that unlike in the Arm implementation, we should never arrive 7686 * here with a zero breakFlag because we always refresh rIBASE on 7687 * return. 7688 */ 7689 .extern MterpCheckBefore 7690 movl rSELF, %ecx 7691 movl %ecx, OUT_ARG0(%esp) 7692 leal OFF_FP_SHADOWFRAME(rFP), %eax 7693 movl %eax, OUT_ARG1(%esp) 7694 movl rPC, OUT_ARG2(%esp) 7695 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7696 REFRESH_IBASE 7697 jmp .L_op_nop+(55*128) 7698 7699 /* ------------------------------ */ 7700 .balign 128 7701 .L_ALT_op_if_eqz: /* 0x38 */ 7702 /* File: x86/alt_stub.S */ 7703 /* 7704 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7705 * any interesting requests and then jump to the real instruction 7706 * handler. Unlike the Arm handler, we can't do this as a tail call 7707 * because rIBASE is caller save and we need to reload it. 7708 * 7709 * Note that unlike in the Arm implementation, we should never arrive 7710 * here with a zero breakFlag because we always refresh rIBASE on 7711 * return. 7712 */ 7713 .extern MterpCheckBefore 7714 movl rSELF, %ecx 7715 movl %ecx, OUT_ARG0(%esp) 7716 leal OFF_FP_SHADOWFRAME(rFP), %eax 7717 movl %eax, OUT_ARG1(%esp) 7718 movl rPC, OUT_ARG2(%esp) 7719 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7720 REFRESH_IBASE 7721 jmp .L_op_nop+(56*128) 7722 7723 /* ------------------------------ */ 7724 .balign 128 7725 .L_ALT_op_if_nez: /* 0x39 */ 7726 /* File: x86/alt_stub.S */ 7727 /* 7728 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7729 * any interesting requests and then jump to the real instruction 7730 * handler. Unlike the Arm handler, we can't do this as a tail call 7731 * because rIBASE is caller save and we need to reload it. 7732 * 7733 * Note that unlike in the Arm implementation, we should never arrive 7734 * here with a zero breakFlag because we always refresh rIBASE on 7735 * return. 7736 */ 7737 .extern MterpCheckBefore 7738 movl rSELF, %ecx 7739 movl %ecx, OUT_ARG0(%esp) 7740 leal OFF_FP_SHADOWFRAME(rFP), %eax 7741 movl %eax, OUT_ARG1(%esp) 7742 movl rPC, OUT_ARG2(%esp) 7743 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7744 REFRESH_IBASE 7745 jmp .L_op_nop+(57*128) 7746 7747 /* ------------------------------ */ 7748 .balign 128 7749 .L_ALT_op_if_ltz: /* 0x3a */ 7750 /* File: x86/alt_stub.S */ 7751 /* 7752 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7753 * any interesting requests and then jump to the real instruction 7754 * handler. Unlike the Arm handler, we can't do this as a tail call 7755 * because rIBASE is caller save and we need to reload it. 7756 * 7757 * Note that unlike in the Arm implementation, we should never arrive 7758 * here with a zero breakFlag because we always refresh rIBASE on 7759 * return. 7760 */ 7761 .extern MterpCheckBefore 7762 movl rSELF, %ecx 7763 movl %ecx, OUT_ARG0(%esp) 7764 leal OFF_FP_SHADOWFRAME(rFP), %eax 7765 movl %eax, OUT_ARG1(%esp) 7766 movl rPC, OUT_ARG2(%esp) 7767 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7768 REFRESH_IBASE 7769 jmp .L_op_nop+(58*128) 7770 7771 /* ------------------------------ */ 7772 .balign 128 7773 .L_ALT_op_if_gez: /* 0x3b */ 7774 /* File: x86/alt_stub.S */ 7775 /* 7776 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7777 * any interesting requests and then jump to the real instruction 7778 * handler. Unlike the Arm handler, we can't do this as a tail call 7779 * because rIBASE is caller save and we need to reload it. 7780 * 7781 * Note that unlike in the Arm implementation, we should never arrive 7782 * here with a zero breakFlag because we always refresh rIBASE on 7783 * return. 7784 */ 7785 .extern MterpCheckBefore 7786 movl rSELF, %ecx 7787 movl %ecx, OUT_ARG0(%esp) 7788 leal OFF_FP_SHADOWFRAME(rFP), %eax 7789 movl %eax, OUT_ARG1(%esp) 7790 movl rPC, OUT_ARG2(%esp) 7791 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7792 REFRESH_IBASE 7793 jmp .L_op_nop+(59*128) 7794 7795 /* ------------------------------ */ 7796 .balign 128 7797 .L_ALT_op_if_gtz: /* 0x3c */ 7798 /* File: x86/alt_stub.S */ 7799 /* 7800 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7801 * any interesting requests and then jump to the real instruction 7802 * handler. Unlike the Arm handler, we can't do this as a tail call 7803 * because rIBASE is caller save and we need to reload it. 7804 * 7805 * Note that unlike in the Arm implementation, we should never arrive 7806 * here with a zero breakFlag because we always refresh rIBASE on 7807 * return. 7808 */ 7809 .extern MterpCheckBefore 7810 movl rSELF, %ecx 7811 movl %ecx, OUT_ARG0(%esp) 7812 leal OFF_FP_SHADOWFRAME(rFP), %eax 7813 movl %eax, OUT_ARG1(%esp) 7814 movl rPC, OUT_ARG2(%esp) 7815 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7816 REFRESH_IBASE 7817 jmp .L_op_nop+(60*128) 7818 7819 /* ------------------------------ */ 7820 .balign 128 7821 .L_ALT_op_if_lez: /* 0x3d */ 7822 /* File: x86/alt_stub.S */ 7823 /* 7824 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7825 * any interesting requests and then jump to the real instruction 7826 * handler. Unlike the Arm handler, we can't do this as a tail call 7827 * because rIBASE is caller save and we need to reload it. 7828 * 7829 * Note that unlike in the Arm implementation, we should never arrive 7830 * here with a zero breakFlag because we always refresh rIBASE on 7831 * return. 7832 */ 7833 .extern MterpCheckBefore 7834 movl rSELF, %ecx 7835 movl %ecx, OUT_ARG0(%esp) 7836 leal OFF_FP_SHADOWFRAME(rFP), %eax 7837 movl %eax, OUT_ARG1(%esp) 7838 movl rPC, OUT_ARG2(%esp) 7839 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7840 REFRESH_IBASE 7841 jmp .L_op_nop+(61*128) 7842 7843 /* ------------------------------ */ 7844 .balign 128 7845 .L_ALT_op_unused_3e: /* 0x3e */ 7846 /* File: x86/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 movl rSELF, %ecx 7859 movl %ecx, OUT_ARG0(%esp) 7860 leal OFF_FP_SHADOWFRAME(rFP), %eax 7861 movl %eax, OUT_ARG1(%esp) 7862 movl rPC, OUT_ARG2(%esp) 7863 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7864 REFRESH_IBASE 7865 jmp .L_op_nop+(62*128) 7866 7867 /* ------------------------------ */ 7868 .balign 128 7869 .L_ALT_op_unused_3f: /* 0x3f */ 7870 /* File: x86/alt_stub.S */ 7871 /* 7872 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7873 * any interesting requests and then jump to the real instruction 7874 * handler. Unlike the Arm handler, we can't do this as a tail call 7875 * because rIBASE is caller save and we need to reload it. 7876 * 7877 * Note that unlike in the Arm implementation, we should never arrive 7878 * here with a zero breakFlag because we always refresh rIBASE on 7879 * return. 7880 */ 7881 .extern MterpCheckBefore 7882 movl rSELF, %ecx 7883 movl %ecx, OUT_ARG0(%esp) 7884 leal OFF_FP_SHADOWFRAME(rFP), %eax 7885 movl %eax, OUT_ARG1(%esp) 7886 movl rPC, OUT_ARG2(%esp) 7887 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7888 REFRESH_IBASE 7889 jmp .L_op_nop+(63*128) 7890 7891 /* ------------------------------ */ 7892 .balign 128 7893 .L_ALT_op_unused_40: /* 0x40 */ 7894 /* File: x86/alt_stub.S */ 7895 /* 7896 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7897 * any interesting requests and then jump to the real instruction 7898 * handler. Unlike the Arm handler, we can't do this as a tail call 7899 * because rIBASE is caller save and we need to reload it. 7900 * 7901 * Note that unlike in the Arm implementation, we should never arrive 7902 * here with a zero breakFlag because we always refresh rIBASE on 7903 * return. 7904 */ 7905 .extern MterpCheckBefore 7906 movl rSELF, %ecx 7907 movl %ecx, OUT_ARG0(%esp) 7908 leal OFF_FP_SHADOWFRAME(rFP), %eax 7909 movl %eax, OUT_ARG1(%esp) 7910 movl rPC, OUT_ARG2(%esp) 7911 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7912 REFRESH_IBASE 7913 jmp .L_op_nop+(64*128) 7914 7915 /* ------------------------------ */ 7916 .balign 128 7917 .L_ALT_op_unused_41: /* 0x41 */ 7918 /* File: x86/alt_stub.S */ 7919 /* 7920 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7921 * any interesting requests and then jump to the real instruction 7922 * handler. Unlike the Arm handler, we can't do this as a tail call 7923 * because rIBASE is caller save and we need to reload it. 7924 * 7925 * Note that unlike in the Arm implementation, we should never arrive 7926 * here with a zero breakFlag because we always refresh rIBASE on 7927 * return. 7928 */ 7929 .extern MterpCheckBefore 7930 movl rSELF, %ecx 7931 movl %ecx, OUT_ARG0(%esp) 7932 leal OFF_FP_SHADOWFRAME(rFP), %eax 7933 movl %eax, OUT_ARG1(%esp) 7934 movl rPC, OUT_ARG2(%esp) 7935 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7936 REFRESH_IBASE 7937 jmp .L_op_nop+(65*128) 7938 7939 /* ------------------------------ */ 7940 .balign 128 7941 .L_ALT_op_unused_42: /* 0x42 */ 7942 /* File: x86/alt_stub.S */ 7943 /* 7944 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7945 * any interesting requests and then jump to the real instruction 7946 * handler. Unlike the Arm handler, we can't do this as a tail call 7947 * because rIBASE is caller save and we need to reload it. 7948 * 7949 * Note that unlike in the Arm implementation, we should never arrive 7950 * here with a zero breakFlag because we always refresh rIBASE on 7951 * return. 7952 */ 7953 .extern MterpCheckBefore 7954 movl rSELF, %ecx 7955 movl %ecx, OUT_ARG0(%esp) 7956 leal OFF_FP_SHADOWFRAME(rFP), %eax 7957 movl %eax, OUT_ARG1(%esp) 7958 movl rPC, OUT_ARG2(%esp) 7959 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7960 REFRESH_IBASE 7961 jmp .L_op_nop+(66*128) 7962 7963 /* ------------------------------ */ 7964 .balign 128 7965 .L_ALT_op_unused_43: /* 0x43 */ 7966 /* File: x86/alt_stub.S */ 7967 /* 7968 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7969 * any interesting requests and then jump to the real instruction 7970 * handler. Unlike the Arm handler, we can't do this as a tail call 7971 * because rIBASE is caller save and we need to reload it. 7972 * 7973 * Note that unlike in the Arm implementation, we should never arrive 7974 * here with a zero breakFlag because we always refresh rIBASE on 7975 * return. 7976 */ 7977 .extern MterpCheckBefore 7978 movl rSELF, %ecx 7979 movl %ecx, OUT_ARG0(%esp) 7980 leal OFF_FP_SHADOWFRAME(rFP), %eax 7981 movl %eax, OUT_ARG1(%esp) 7982 movl rPC, OUT_ARG2(%esp) 7983 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 7984 REFRESH_IBASE 7985 jmp .L_op_nop+(67*128) 7986 7987 /* ------------------------------ */ 7988 .balign 128 7989 .L_ALT_op_aget: /* 0x44 */ 7990 /* File: x86/alt_stub.S */ 7991 /* 7992 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 7993 * any interesting requests and then jump to the real instruction 7994 * handler. Unlike the Arm handler, we can't do this as a tail call 7995 * because rIBASE is caller save and we need to reload it. 7996 * 7997 * Note that unlike in the Arm implementation, we should never arrive 7998 * here with a zero breakFlag because we always refresh rIBASE on 7999 * return. 8000 */ 8001 .extern MterpCheckBefore 8002 movl rSELF, %ecx 8003 movl %ecx, OUT_ARG0(%esp) 8004 leal OFF_FP_SHADOWFRAME(rFP), %eax 8005 movl %eax, OUT_ARG1(%esp) 8006 movl rPC, OUT_ARG2(%esp) 8007 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8008 REFRESH_IBASE 8009 jmp .L_op_nop+(68*128) 8010 8011 /* ------------------------------ */ 8012 .balign 128 8013 .L_ALT_op_aget_wide: /* 0x45 */ 8014 /* File: x86/alt_stub.S */ 8015 /* 8016 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8017 * any interesting requests and then jump to the real instruction 8018 * handler. Unlike the Arm handler, we can't do this as a tail call 8019 * because rIBASE is caller save and we need to reload it. 8020 * 8021 * Note that unlike in the Arm implementation, we should never arrive 8022 * here with a zero breakFlag because we always refresh rIBASE on 8023 * return. 8024 */ 8025 .extern MterpCheckBefore 8026 movl rSELF, %ecx 8027 movl %ecx, OUT_ARG0(%esp) 8028 leal OFF_FP_SHADOWFRAME(rFP), %eax 8029 movl %eax, OUT_ARG1(%esp) 8030 movl rPC, OUT_ARG2(%esp) 8031 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8032 REFRESH_IBASE 8033 jmp .L_op_nop+(69*128) 8034 8035 /* ------------------------------ */ 8036 .balign 128 8037 .L_ALT_op_aget_object: /* 0x46 */ 8038 /* File: x86/alt_stub.S */ 8039 /* 8040 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8041 * any interesting requests and then jump to the real instruction 8042 * handler. Unlike the Arm handler, we can't do this as a tail call 8043 * because rIBASE is caller save and we need to reload it. 8044 * 8045 * Note that unlike in the Arm implementation, we should never arrive 8046 * here with a zero breakFlag because we always refresh rIBASE on 8047 * return. 8048 */ 8049 .extern MterpCheckBefore 8050 movl rSELF, %ecx 8051 movl %ecx, OUT_ARG0(%esp) 8052 leal OFF_FP_SHADOWFRAME(rFP), %eax 8053 movl %eax, OUT_ARG1(%esp) 8054 movl rPC, OUT_ARG2(%esp) 8055 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8056 REFRESH_IBASE 8057 jmp .L_op_nop+(70*128) 8058 8059 /* ------------------------------ */ 8060 .balign 128 8061 .L_ALT_op_aget_boolean: /* 0x47 */ 8062 /* File: x86/alt_stub.S */ 8063 /* 8064 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8065 * any interesting requests and then jump to the real instruction 8066 * handler. Unlike the Arm handler, we can't do this as a tail call 8067 * because rIBASE is caller save and we need to reload it. 8068 * 8069 * Note that unlike in the Arm implementation, we should never arrive 8070 * here with a zero breakFlag because we always refresh rIBASE on 8071 * return. 8072 */ 8073 .extern MterpCheckBefore 8074 movl rSELF, %ecx 8075 movl %ecx, OUT_ARG0(%esp) 8076 leal OFF_FP_SHADOWFRAME(rFP), %eax 8077 movl %eax, OUT_ARG1(%esp) 8078 movl rPC, OUT_ARG2(%esp) 8079 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8080 REFRESH_IBASE 8081 jmp .L_op_nop+(71*128) 8082 8083 /* ------------------------------ */ 8084 .balign 128 8085 .L_ALT_op_aget_byte: /* 0x48 */ 8086 /* File: x86/alt_stub.S */ 8087 /* 8088 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8089 * any interesting requests and then jump to the real instruction 8090 * handler. Unlike the Arm handler, we can't do this as a tail call 8091 * because rIBASE is caller save and we need to reload it. 8092 * 8093 * Note that unlike in the Arm implementation, we should never arrive 8094 * here with a zero breakFlag because we always refresh rIBASE on 8095 * return. 8096 */ 8097 .extern MterpCheckBefore 8098 movl rSELF, %ecx 8099 movl %ecx, OUT_ARG0(%esp) 8100 leal OFF_FP_SHADOWFRAME(rFP), %eax 8101 movl %eax, OUT_ARG1(%esp) 8102 movl rPC, OUT_ARG2(%esp) 8103 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8104 REFRESH_IBASE 8105 jmp .L_op_nop+(72*128) 8106 8107 /* ------------------------------ */ 8108 .balign 128 8109 .L_ALT_op_aget_char: /* 0x49 */ 8110 /* File: x86/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 movl rSELF, %ecx 8123 movl %ecx, OUT_ARG0(%esp) 8124 leal OFF_FP_SHADOWFRAME(rFP), %eax 8125 movl %eax, OUT_ARG1(%esp) 8126 movl rPC, OUT_ARG2(%esp) 8127 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8128 REFRESH_IBASE 8129 jmp .L_op_nop+(73*128) 8130 8131 /* ------------------------------ */ 8132 .balign 128 8133 .L_ALT_op_aget_short: /* 0x4a */ 8134 /* File: x86/alt_stub.S */ 8135 /* 8136 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8137 * any interesting requests and then jump to the real instruction 8138 * handler. Unlike the Arm handler, we can't do this as a tail call 8139 * because rIBASE is caller save and we need to reload it. 8140 * 8141 * Note that unlike in the Arm implementation, we should never arrive 8142 * here with a zero breakFlag because we always refresh rIBASE on 8143 * return. 8144 */ 8145 .extern MterpCheckBefore 8146 movl rSELF, %ecx 8147 movl %ecx, OUT_ARG0(%esp) 8148 leal OFF_FP_SHADOWFRAME(rFP), %eax 8149 movl %eax, OUT_ARG1(%esp) 8150 movl rPC, OUT_ARG2(%esp) 8151 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8152 REFRESH_IBASE 8153 jmp .L_op_nop+(74*128) 8154 8155 /* ------------------------------ */ 8156 .balign 128 8157 .L_ALT_op_aput: /* 0x4b */ 8158 /* File: x86/alt_stub.S */ 8159 /* 8160 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8161 * any interesting requests and then jump to the real instruction 8162 * handler. Unlike the Arm handler, we can't do this as a tail call 8163 * because rIBASE is caller save and we need to reload it. 8164 * 8165 * Note that unlike in the Arm implementation, we should never arrive 8166 * here with a zero breakFlag because we always refresh rIBASE on 8167 * return. 8168 */ 8169 .extern MterpCheckBefore 8170 movl rSELF, %ecx 8171 movl %ecx, OUT_ARG0(%esp) 8172 leal OFF_FP_SHADOWFRAME(rFP), %eax 8173 movl %eax, OUT_ARG1(%esp) 8174 movl rPC, OUT_ARG2(%esp) 8175 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8176 REFRESH_IBASE 8177 jmp .L_op_nop+(75*128) 8178 8179 /* ------------------------------ */ 8180 .balign 128 8181 .L_ALT_op_aput_wide: /* 0x4c */ 8182 /* File: x86/alt_stub.S */ 8183 /* 8184 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8185 * any interesting requests and then jump to the real instruction 8186 * handler. Unlike the Arm handler, we can't do this as a tail call 8187 * because rIBASE is caller save and we need to reload it. 8188 * 8189 * Note that unlike in the Arm implementation, we should never arrive 8190 * here with a zero breakFlag because we always refresh rIBASE on 8191 * return. 8192 */ 8193 .extern MterpCheckBefore 8194 movl rSELF, %ecx 8195 movl %ecx, OUT_ARG0(%esp) 8196 leal OFF_FP_SHADOWFRAME(rFP), %eax 8197 movl %eax, OUT_ARG1(%esp) 8198 movl rPC, OUT_ARG2(%esp) 8199 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8200 REFRESH_IBASE 8201 jmp .L_op_nop+(76*128) 8202 8203 /* ------------------------------ */ 8204 .balign 128 8205 .L_ALT_op_aput_object: /* 0x4d */ 8206 /* File: x86/alt_stub.S */ 8207 /* 8208 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8209 * any interesting requests and then jump to the real instruction 8210 * handler. Unlike the Arm handler, we can't do this as a tail call 8211 * because rIBASE is caller save and we need to reload it. 8212 * 8213 * Note that unlike in the Arm implementation, we should never arrive 8214 * here with a zero breakFlag because we always refresh rIBASE on 8215 * return. 8216 */ 8217 .extern MterpCheckBefore 8218 movl rSELF, %ecx 8219 movl %ecx, OUT_ARG0(%esp) 8220 leal OFF_FP_SHADOWFRAME(rFP), %eax 8221 movl %eax, OUT_ARG1(%esp) 8222 movl rPC, OUT_ARG2(%esp) 8223 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8224 REFRESH_IBASE 8225 jmp .L_op_nop+(77*128) 8226 8227 /* ------------------------------ */ 8228 .balign 128 8229 .L_ALT_op_aput_boolean: /* 0x4e */ 8230 /* File: x86/alt_stub.S */ 8231 /* 8232 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8233 * any interesting requests and then jump to the real instruction 8234 * handler. Unlike the Arm handler, we can't do this as a tail call 8235 * because rIBASE is caller save and we need to reload it. 8236 * 8237 * Note that unlike in the Arm implementation, we should never arrive 8238 * here with a zero breakFlag because we always refresh rIBASE on 8239 * return. 8240 */ 8241 .extern MterpCheckBefore 8242 movl rSELF, %ecx 8243 movl %ecx, OUT_ARG0(%esp) 8244 leal OFF_FP_SHADOWFRAME(rFP), %eax 8245 movl %eax, OUT_ARG1(%esp) 8246 movl rPC, OUT_ARG2(%esp) 8247 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8248 REFRESH_IBASE 8249 jmp .L_op_nop+(78*128) 8250 8251 /* ------------------------------ */ 8252 .balign 128 8253 .L_ALT_op_aput_byte: /* 0x4f */ 8254 /* File: x86/alt_stub.S */ 8255 /* 8256 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8257 * any interesting requests and then jump to the real instruction 8258 * handler. Unlike the Arm handler, we can't do this as a tail call 8259 * because rIBASE is caller save and we need to reload it. 8260 * 8261 * Note that unlike in the Arm implementation, we should never arrive 8262 * here with a zero breakFlag because we always refresh rIBASE on 8263 * return. 8264 */ 8265 .extern MterpCheckBefore 8266 movl rSELF, %ecx 8267 movl %ecx, OUT_ARG0(%esp) 8268 leal OFF_FP_SHADOWFRAME(rFP), %eax 8269 movl %eax, OUT_ARG1(%esp) 8270 movl rPC, OUT_ARG2(%esp) 8271 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8272 REFRESH_IBASE 8273 jmp .L_op_nop+(79*128) 8274 8275 /* ------------------------------ */ 8276 .balign 128 8277 .L_ALT_op_aput_char: /* 0x50 */ 8278 /* File: x86/alt_stub.S */ 8279 /* 8280 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8281 * any interesting requests and then jump to the real instruction 8282 * handler. Unlike the Arm handler, we can't do this as a tail call 8283 * because rIBASE is caller save and we need to reload it. 8284 * 8285 * Note that unlike in the Arm implementation, we should never arrive 8286 * here with a zero breakFlag because we always refresh rIBASE on 8287 * return. 8288 */ 8289 .extern MterpCheckBefore 8290 movl rSELF, %ecx 8291 movl %ecx, OUT_ARG0(%esp) 8292 leal OFF_FP_SHADOWFRAME(rFP), %eax 8293 movl %eax, OUT_ARG1(%esp) 8294 movl rPC, OUT_ARG2(%esp) 8295 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8296 REFRESH_IBASE 8297 jmp .L_op_nop+(80*128) 8298 8299 /* ------------------------------ */ 8300 .balign 128 8301 .L_ALT_op_aput_short: /* 0x51 */ 8302 /* File: x86/alt_stub.S */ 8303 /* 8304 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8305 * any interesting requests and then jump to the real instruction 8306 * handler. Unlike the Arm handler, we can't do this as a tail call 8307 * because rIBASE is caller save and we need to reload it. 8308 * 8309 * Note that unlike in the Arm implementation, we should never arrive 8310 * here with a zero breakFlag because we always refresh rIBASE on 8311 * return. 8312 */ 8313 .extern MterpCheckBefore 8314 movl rSELF, %ecx 8315 movl %ecx, OUT_ARG0(%esp) 8316 leal OFF_FP_SHADOWFRAME(rFP), %eax 8317 movl %eax, OUT_ARG1(%esp) 8318 movl rPC, OUT_ARG2(%esp) 8319 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8320 REFRESH_IBASE 8321 jmp .L_op_nop+(81*128) 8322 8323 /* ------------------------------ */ 8324 .balign 128 8325 .L_ALT_op_iget: /* 0x52 */ 8326 /* File: x86/alt_stub.S */ 8327 /* 8328 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8329 * any interesting requests and then jump to the real instruction 8330 * handler. Unlike the Arm handler, we can't do this as a tail call 8331 * because rIBASE is caller save and we need to reload it. 8332 * 8333 * Note that unlike in the Arm implementation, we should never arrive 8334 * here with a zero breakFlag because we always refresh rIBASE on 8335 * return. 8336 */ 8337 .extern MterpCheckBefore 8338 movl rSELF, %ecx 8339 movl %ecx, OUT_ARG0(%esp) 8340 leal OFF_FP_SHADOWFRAME(rFP), %eax 8341 movl %eax, OUT_ARG1(%esp) 8342 movl rPC, OUT_ARG2(%esp) 8343 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8344 REFRESH_IBASE 8345 jmp .L_op_nop+(82*128) 8346 8347 /* ------------------------------ */ 8348 .balign 128 8349 .L_ALT_op_iget_wide: /* 0x53 */ 8350 /* File: x86/alt_stub.S */ 8351 /* 8352 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8353 * any interesting requests and then jump to the real instruction 8354 * handler. Unlike the Arm handler, we can't do this as a tail call 8355 * because rIBASE is caller save and we need to reload it. 8356 * 8357 * Note that unlike in the Arm implementation, we should never arrive 8358 * here with a zero breakFlag because we always refresh rIBASE on 8359 * return. 8360 */ 8361 .extern MterpCheckBefore 8362 movl rSELF, %ecx 8363 movl %ecx, OUT_ARG0(%esp) 8364 leal OFF_FP_SHADOWFRAME(rFP), %eax 8365 movl %eax, OUT_ARG1(%esp) 8366 movl rPC, OUT_ARG2(%esp) 8367 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8368 REFRESH_IBASE 8369 jmp .L_op_nop+(83*128) 8370 8371 /* ------------------------------ */ 8372 .balign 128 8373 .L_ALT_op_iget_object: /* 0x54 */ 8374 /* File: x86/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 movl rSELF, %ecx 8387 movl %ecx, OUT_ARG0(%esp) 8388 leal OFF_FP_SHADOWFRAME(rFP), %eax 8389 movl %eax, OUT_ARG1(%esp) 8390 movl rPC, OUT_ARG2(%esp) 8391 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8392 REFRESH_IBASE 8393 jmp .L_op_nop+(84*128) 8394 8395 /* ------------------------------ */ 8396 .balign 128 8397 .L_ALT_op_iget_boolean: /* 0x55 */ 8398 /* File: x86/alt_stub.S */ 8399 /* 8400 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8401 * any interesting requests and then jump to the real instruction 8402 * handler. Unlike the Arm handler, we can't do this as a tail call 8403 * because rIBASE is caller save and we need to reload it. 8404 * 8405 * Note that unlike in the Arm implementation, we should never arrive 8406 * here with a zero breakFlag because we always refresh rIBASE on 8407 * return. 8408 */ 8409 .extern MterpCheckBefore 8410 movl rSELF, %ecx 8411 movl %ecx, OUT_ARG0(%esp) 8412 leal OFF_FP_SHADOWFRAME(rFP), %eax 8413 movl %eax, OUT_ARG1(%esp) 8414 movl rPC, OUT_ARG2(%esp) 8415 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8416 REFRESH_IBASE 8417 jmp .L_op_nop+(85*128) 8418 8419 /* ------------------------------ */ 8420 .balign 128 8421 .L_ALT_op_iget_byte: /* 0x56 */ 8422 /* File: x86/alt_stub.S */ 8423 /* 8424 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8425 * any interesting requests and then jump to the real instruction 8426 * handler. Unlike the Arm handler, we can't do this as a tail call 8427 * because rIBASE is caller save and we need to reload it. 8428 * 8429 * Note that unlike in the Arm implementation, we should never arrive 8430 * here with a zero breakFlag because we always refresh rIBASE on 8431 * return. 8432 */ 8433 .extern MterpCheckBefore 8434 movl rSELF, %ecx 8435 movl %ecx, OUT_ARG0(%esp) 8436 leal OFF_FP_SHADOWFRAME(rFP), %eax 8437 movl %eax, OUT_ARG1(%esp) 8438 movl rPC, OUT_ARG2(%esp) 8439 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8440 REFRESH_IBASE 8441 jmp .L_op_nop+(86*128) 8442 8443 /* ------------------------------ */ 8444 .balign 128 8445 .L_ALT_op_iget_char: /* 0x57 */ 8446 /* File: x86/alt_stub.S */ 8447 /* 8448 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8449 * any interesting requests and then jump to the real instruction 8450 * handler. Unlike the Arm handler, we can't do this as a tail call 8451 * because rIBASE is caller save and we need to reload it. 8452 * 8453 * Note that unlike in the Arm implementation, we should never arrive 8454 * here with a zero breakFlag because we always refresh rIBASE on 8455 * return. 8456 */ 8457 .extern MterpCheckBefore 8458 movl rSELF, %ecx 8459 movl %ecx, OUT_ARG0(%esp) 8460 leal OFF_FP_SHADOWFRAME(rFP), %eax 8461 movl %eax, OUT_ARG1(%esp) 8462 movl rPC, OUT_ARG2(%esp) 8463 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8464 REFRESH_IBASE 8465 jmp .L_op_nop+(87*128) 8466 8467 /* ------------------------------ */ 8468 .balign 128 8469 .L_ALT_op_iget_short: /* 0x58 */ 8470 /* File: x86/alt_stub.S */ 8471 /* 8472 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8473 * any interesting requests and then jump to the real instruction 8474 * handler. Unlike the Arm handler, we can't do this as a tail call 8475 * because rIBASE is caller save and we need to reload it. 8476 * 8477 * Note that unlike in the Arm implementation, we should never arrive 8478 * here with a zero breakFlag because we always refresh rIBASE on 8479 * return. 8480 */ 8481 .extern MterpCheckBefore 8482 movl rSELF, %ecx 8483 movl %ecx, OUT_ARG0(%esp) 8484 leal OFF_FP_SHADOWFRAME(rFP), %eax 8485 movl %eax, OUT_ARG1(%esp) 8486 movl rPC, OUT_ARG2(%esp) 8487 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8488 REFRESH_IBASE 8489 jmp .L_op_nop+(88*128) 8490 8491 /* ------------------------------ */ 8492 .balign 128 8493 .L_ALT_op_iput: /* 0x59 */ 8494 /* File: x86/alt_stub.S */ 8495 /* 8496 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8497 * any interesting requests and then jump to the real instruction 8498 * handler. Unlike the Arm handler, we can't do this as a tail call 8499 * because rIBASE is caller save and we need to reload it. 8500 * 8501 * Note that unlike in the Arm implementation, we should never arrive 8502 * here with a zero breakFlag because we always refresh rIBASE on 8503 * return. 8504 */ 8505 .extern MterpCheckBefore 8506 movl rSELF, %ecx 8507 movl %ecx, OUT_ARG0(%esp) 8508 leal OFF_FP_SHADOWFRAME(rFP), %eax 8509 movl %eax, OUT_ARG1(%esp) 8510 movl rPC, OUT_ARG2(%esp) 8511 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8512 REFRESH_IBASE 8513 jmp .L_op_nop+(89*128) 8514 8515 /* ------------------------------ */ 8516 .balign 128 8517 .L_ALT_op_iput_wide: /* 0x5a */ 8518 /* File: x86/alt_stub.S */ 8519 /* 8520 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8521 * any interesting requests and then jump to the real instruction 8522 * handler. Unlike the Arm handler, we can't do this as a tail call 8523 * because rIBASE is caller save and we need to reload it. 8524 * 8525 * Note that unlike in the Arm implementation, we should never arrive 8526 * here with a zero breakFlag because we always refresh rIBASE on 8527 * return. 8528 */ 8529 .extern MterpCheckBefore 8530 movl rSELF, %ecx 8531 movl %ecx, OUT_ARG0(%esp) 8532 leal OFF_FP_SHADOWFRAME(rFP), %eax 8533 movl %eax, OUT_ARG1(%esp) 8534 movl rPC, OUT_ARG2(%esp) 8535 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8536 REFRESH_IBASE 8537 jmp .L_op_nop+(90*128) 8538 8539 /* ------------------------------ */ 8540 .balign 128 8541 .L_ALT_op_iput_object: /* 0x5b */ 8542 /* File: x86/alt_stub.S */ 8543 /* 8544 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8545 * any interesting requests and then jump to the real instruction 8546 * handler. Unlike the Arm handler, we can't do this as a tail call 8547 * because rIBASE is caller save and we need to reload it. 8548 * 8549 * Note that unlike in the Arm implementation, we should never arrive 8550 * here with a zero breakFlag because we always refresh rIBASE on 8551 * return. 8552 */ 8553 .extern MterpCheckBefore 8554 movl rSELF, %ecx 8555 movl %ecx, OUT_ARG0(%esp) 8556 leal OFF_FP_SHADOWFRAME(rFP), %eax 8557 movl %eax, OUT_ARG1(%esp) 8558 movl rPC, OUT_ARG2(%esp) 8559 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8560 REFRESH_IBASE 8561 jmp .L_op_nop+(91*128) 8562 8563 /* ------------------------------ */ 8564 .balign 128 8565 .L_ALT_op_iput_boolean: /* 0x5c */ 8566 /* File: x86/alt_stub.S */ 8567 /* 8568 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8569 * any interesting requests and then jump to the real instruction 8570 * handler. Unlike the Arm handler, we can't do this as a tail call 8571 * because rIBASE is caller save and we need to reload it. 8572 * 8573 * Note that unlike in the Arm implementation, we should never arrive 8574 * here with a zero breakFlag because we always refresh rIBASE on 8575 * return. 8576 */ 8577 .extern MterpCheckBefore 8578 movl rSELF, %ecx 8579 movl %ecx, OUT_ARG0(%esp) 8580 leal OFF_FP_SHADOWFRAME(rFP), %eax 8581 movl %eax, OUT_ARG1(%esp) 8582 movl rPC, OUT_ARG2(%esp) 8583 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8584 REFRESH_IBASE 8585 jmp .L_op_nop+(92*128) 8586 8587 /* ------------------------------ */ 8588 .balign 128 8589 .L_ALT_op_iput_byte: /* 0x5d */ 8590 /* File: x86/alt_stub.S */ 8591 /* 8592 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8593 * any interesting requests and then jump to the real instruction 8594 * handler. Unlike the Arm handler, we can't do this as a tail call 8595 * because rIBASE is caller save and we need to reload it. 8596 * 8597 * Note that unlike in the Arm implementation, we should never arrive 8598 * here with a zero breakFlag because we always refresh rIBASE on 8599 * return. 8600 */ 8601 .extern MterpCheckBefore 8602 movl rSELF, %ecx 8603 movl %ecx, OUT_ARG0(%esp) 8604 leal OFF_FP_SHADOWFRAME(rFP), %eax 8605 movl %eax, OUT_ARG1(%esp) 8606 movl rPC, OUT_ARG2(%esp) 8607 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8608 REFRESH_IBASE 8609 jmp .L_op_nop+(93*128) 8610 8611 /* ------------------------------ */ 8612 .balign 128 8613 .L_ALT_op_iput_char: /* 0x5e */ 8614 /* File: x86/alt_stub.S */ 8615 /* 8616 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8617 * any interesting requests and then jump to the real instruction 8618 * handler. Unlike the Arm handler, we can't do this as a tail call 8619 * because rIBASE is caller save and we need to reload it. 8620 * 8621 * Note that unlike in the Arm implementation, we should never arrive 8622 * here with a zero breakFlag because we always refresh rIBASE on 8623 * return. 8624 */ 8625 .extern MterpCheckBefore 8626 movl rSELF, %ecx 8627 movl %ecx, OUT_ARG0(%esp) 8628 leal OFF_FP_SHADOWFRAME(rFP), %eax 8629 movl %eax, OUT_ARG1(%esp) 8630 movl rPC, OUT_ARG2(%esp) 8631 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8632 REFRESH_IBASE 8633 jmp .L_op_nop+(94*128) 8634 8635 /* ------------------------------ */ 8636 .balign 128 8637 .L_ALT_op_iput_short: /* 0x5f */ 8638 /* File: x86/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 movl rSELF, %ecx 8651 movl %ecx, OUT_ARG0(%esp) 8652 leal OFF_FP_SHADOWFRAME(rFP), %eax 8653 movl %eax, OUT_ARG1(%esp) 8654 movl rPC, OUT_ARG2(%esp) 8655 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8656 REFRESH_IBASE 8657 jmp .L_op_nop+(95*128) 8658 8659 /* ------------------------------ */ 8660 .balign 128 8661 .L_ALT_op_sget: /* 0x60 */ 8662 /* File: x86/alt_stub.S */ 8663 /* 8664 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8665 * any interesting requests and then jump to the real instruction 8666 * handler. Unlike the Arm handler, we can't do this as a tail call 8667 * because rIBASE is caller save and we need to reload it. 8668 * 8669 * Note that unlike in the Arm implementation, we should never arrive 8670 * here with a zero breakFlag because we always refresh rIBASE on 8671 * return. 8672 */ 8673 .extern MterpCheckBefore 8674 movl rSELF, %ecx 8675 movl %ecx, OUT_ARG0(%esp) 8676 leal OFF_FP_SHADOWFRAME(rFP), %eax 8677 movl %eax, OUT_ARG1(%esp) 8678 movl rPC, OUT_ARG2(%esp) 8679 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8680 REFRESH_IBASE 8681 jmp .L_op_nop+(96*128) 8682 8683 /* ------------------------------ */ 8684 .balign 128 8685 .L_ALT_op_sget_wide: /* 0x61 */ 8686 /* File: x86/alt_stub.S */ 8687 /* 8688 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8689 * any interesting requests and then jump to the real instruction 8690 * handler. Unlike the Arm handler, we can't do this as a tail call 8691 * because rIBASE is caller save and we need to reload it. 8692 * 8693 * Note that unlike in the Arm implementation, we should never arrive 8694 * here with a zero breakFlag because we always refresh rIBASE on 8695 * return. 8696 */ 8697 .extern MterpCheckBefore 8698 movl rSELF, %ecx 8699 movl %ecx, OUT_ARG0(%esp) 8700 leal OFF_FP_SHADOWFRAME(rFP), %eax 8701 movl %eax, OUT_ARG1(%esp) 8702 movl rPC, OUT_ARG2(%esp) 8703 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8704 REFRESH_IBASE 8705 jmp .L_op_nop+(97*128) 8706 8707 /* ------------------------------ */ 8708 .balign 128 8709 .L_ALT_op_sget_object: /* 0x62 */ 8710 /* File: x86/alt_stub.S */ 8711 /* 8712 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8713 * any interesting requests and then jump to the real instruction 8714 * handler. Unlike the Arm handler, we can't do this as a tail call 8715 * because rIBASE is caller save and we need to reload it. 8716 * 8717 * Note that unlike in the Arm implementation, we should never arrive 8718 * here with a zero breakFlag because we always refresh rIBASE on 8719 * return. 8720 */ 8721 .extern MterpCheckBefore 8722 movl rSELF, %ecx 8723 movl %ecx, OUT_ARG0(%esp) 8724 leal OFF_FP_SHADOWFRAME(rFP), %eax 8725 movl %eax, OUT_ARG1(%esp) 8726 movl rPC, OUT_ARG2(%esp) 8727 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8728 REFRESH_IBASE 8729 jmp .L_op_nop+(98*128) 8730 8731 /* ------------------------------ */ 8732 .balign 128 8733 .L_ALT_op_sget_boolean: /* 0x63 */ 8734 /* File: x86/alt_stub.S */ 8735 /* 8736 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8737 * any interesting requests and then jump to the real instruction 8738 * handler. Unlike the Arm handler, we can't do this as a tail call 8739 * because rIBASE is caller save and we need to reload it. 8740 * 8741 * Note that unlike in the Arm implementation, we should never arrive 8742 * here with a zero breakFlag because we always refresh rIBASE on 8743 * return. 8744 */ 8745 .extern MterpCheckBefore 8746 movl rSELF, %ecx 8747 movl %ecx, OUT_ARG0(%esp) 8748 leal OFF_FP_SHADOWFRAME(rFP), %eax 8749 movl %eax, OUT_ARG1(%esp) 8750 movl rPC, OUT_ARG2(%esp) 8751 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8752 REFRESH_IBASE 8753 jmp .L_op_nop+(99*128) 8754 8755 /* ------------------------------ */ 8756 .balign 128 8757 .L_ALT_op_sget_byte: /* 0x64 */ 8758 /* File: x86/alt_stub.S */ 8759 /* 8760 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8761 * any interesting requests and then jump to the real instruction 8762 * handler. Unlike the Arm handler, we can't do this as a tail call 8763 * because rIBASE is caller save and we need to reload it. 8764 * 8765 * Note that unlike in the Arm implementation, we should never arrive 8766 * here with a zero breakFlag because we always refresh rIBASE on 8767 * return. 8768 */ 8769 .extern MterpCheckBefore 8770 movl rSELF, %ecx 8771 movl %ecx, OUT_ARG0(%esp) 8772 leal OFF_FP_SHADOWFRAME(rFP), %eax 8773 movl %eax, OUT_ARG1(%esp) 8774 movl rPC, OUT_ARG2(%esp) 8775 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8776 REFRESH_IBASE 8777 jmp .L_op_nop+(100*128) 8778 8779 /* ------------------------------ */ 8780 .balign 128 8781 .L_ALT_op_sget_char: /* 0x65 */ 8782 /* File: x86/alt_stub.S */ 8783 /* 8784 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8785 * any interesting requests and then jump to the real instruction 8786 * handler. Unlike the Arm handler, we can't do this as a tail call 8787 * because rIBASE is caller save and we need to reload it. 8788 * 8789 * Note that unlike in the Arm implementation, we should never arrive 8790 * here with a zero breakFlag because we always refresh rIBASE on 8791 * return. 8792 */ 8793 .extern MterpCheckBefore 8794 movl rSELF, %ecx 8795 movl %ecx, OUT_ARG0(%esp) 8796 leal OFF_FP_SHADOWFRAME(rFP), %eax 8797 movl %eax, OUT_ARG1(%esp) 8798 movl rPC, OUT_ARG2(%esp) 8799 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8800 REFRESH_IBASE 8801 jmp .L_op_nop+(101*128) 8802 8803 /* ------------------------------ */ 8804 .balign 128 8805 .L_ALT_op_sget_short: /* 0x66 */ 8806 /* File: x86/alt_stub.S */ 8807 /* 8808 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8809 * any interesting requests and then jump to the real instruction 8810 * handler. Unlike the Arm handler, we can't do this as a tail call 8811 * because rIBASE is caller save and we need to reload it. 8812 * 8813 * Note that unlike in the Arm implementation, we should never arrive 8814 * here with a zero breakFlag because we always refresh rIBASE on 8815 * return. 8816 */ 8817 .extern MterpCheckBefore 8818 movl rSELF, %ecx 8819 movl %ecx, OUT_ARG0(%esp) 8820 leal OFF_FP_SHADOWFRAME(rFP), %eax 8821 movl %eax, OUT_ARG1(%esp) 8822 movl rPC, OUT_ARG2(%esp) 8823 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8824 REFRESH_IBASE 8825 jmp .L_op_nop+(102*128) 8826 8827 /* ------------------------------ */ 8828 .balign 128 8829 .L_ALT_op_sput: /* 0x67 */ 8830 /* File: x86/alt_stub.S */ 8831 /* 8832 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8833 * any interesting requests and then jump to the real instruction 8834 * handler. Unlike the Arm handler, we can't do this as a tail call 8835 * because rIBASE is caller save and we need to reload it. 8836 * 8837 * Note that unlike in the Arm implementation, we should never arrive 8838 * here with a zero breakFlag because we always refresh rIBASE on 8839 * return. 8840 */ 8841 .extern MterpCheckBefore 8842 movl rSELF, %ecx 8843 movl %ecx, OUT_ARG0(%esp) 8844 leal OFF_FP_SHADOWFRAME(rFP), %eax 8845 movl %eax, OUT_ARG1(%esp) 8846 movl rPC, OUT_ARG2(%esp) 8847 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8848 REFRESH_IBASE 8849 jmp .L_op_nop+(103*128) 8850 8851 /* ------------------------------ */ 8852 .balign 128 8853 .L_ALT_op_sput_wide: /* 0x68 */ 8854 /* File: x86/alt_stub.S */ 8855 /* 8856 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8857 * any interesting requests and then jump to the real instruction 8858 * handler. Unlike the Arm handler, we can't do this as a tail call 8859 * because rIBASE is caller save and we need to reload it. 8860 * 8861 * Note that unlike in the Arm implementation, we should never arrive 8862 * here with a zero breakFlag because we always refresh rIBASE on 8863 * return. 8864 */ 8865 .extern MterpCheckBefore 8866 movl rSELF, %ecx 8867 movl %ecx, OUT_ARG0(%esp) 8868 leal OFF_FP_SHADOWFRAME(rFP), %eax 8869 movl %eax, OUT_ARG1(%esp) 8870 movl rPC, OUT_ARG2(%esp) 8871 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8872 REFRESH_IBASE 8873 jmp .L_op_nop+(104*128) 8874 8875 /* ------------------------------ */ 8876 .balign 128 8877 .L_ALT_op_sput_object: /* 0x69 */ 8878 /* File: x86/alt_stub.S */ 8879 /* 8880 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8881 * any interesting requests and then jump to the real instruction 8882 * handler. Unlike the Arm handler, we can't do this as a tail call 8883 * because rIBASE is caller save and we need to reload it. 8884 * 8885 * Note that unlike in the Arm implementation, we should never arrive 8886 * here with a zero breakFlag because we always refresh rIBASE on 8887 * return. 8888 */ 8889 .extern MterpCheckBefore 8890 movl rSELF, %ecx 8891 movl %ecx, OUT_ARG0(%esp) 8892 leal OFF_FP_SHADOWFRAME(rFP), %eax 8893 movl %eax, OUT_ARG1(%esp) 8894 movl rPC, OUT_ARG2(%esp) 8895 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8896 REFRESH_IBASE 8897 jmp .L_op_nop+(105*128) 8898 8899 /* ------------------------------ */ 8900 .balign 128 8901 .L_ALT_op_sput_boolean: /* 0x6a */ 8902 /* File: x86/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 movl rSELF, %ecx 8915 movl %ecx, OUT_ARG0(%esp) 8916 leal OFF_FP_SHADOWFRAME(rFP), %eax 8917 movl %eax, OUT_ARG1(%esp) 8918 movl rPC, OUT_ARG2(%esp) 8919 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8920 REFRESH_IBASE 8921 jmp .L_op_nop+(106*128) 8922 8923 /* ------------------------------ */ 8924 .balign 128 8925 .L_ALT_op_sput_byte: /* 0x6b */ 8926 /* File: x86/alt_stub.S */ 8927 /* 8928 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8929 * any interesting requests and then jump to the real instruction 8930 * handler. Unlike the Arm handler, we can't do this as a tail call 8931 * because rIBASE is caller save and we need to reload it. 8932 * 8933 * Note that unlike in the Arm implementation, we should never arrive 8934 * here with a zero breakFlag because we always refresh rIBASE on 8935 * return. 8936 */ 8937 .extern MterpCheckBefore 8938 movl rSELF, %ecx 8939 movl %ecx, OUT_ARG0(%esp) 8940 leal OFF_FP_SHADOWFRAME(rFP), %eax 8941 movl %eax, OUT_ARG1(%esp) 8942 movl rPC, OUT_ARG2(%esp) 8943 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8944 REFRESH_IBASE 8945 jmp .L_op_nop+(107*128) 8946 8947 /* ------------------------------ */ 8948 .balign 128 8949 .L_ALT_op_sput_char: /* 0x6c */ 8950 /* File: x86/alt_stub.S */ 8951 /* 8952 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8953 * any interesting requests and then jump to the real instruction 8954 * handler. Unlike the Arm handler, we can't do this as a tail call 8955 * because rIBASE is caller save and we need to reload it. 8956 * 8957 * Note that unlike in the Arm implementation, we should never arrive 8958 * here with a zero breakFlag because we always refresh rIBASE on 8959 * return. 8960 */ 8961 .extern MterpCheckBefore 8962 movl rSELF, %ecx 8963 movl %ecx, OUT_ARG0(%esp) 8964 leal OFF_FP_SHADOWFRAME(rFP), %eax 8965 movl %eax, OUT_ARG1(%esp) 8966 movl rPC, OUT_ARG2(%esp) 8967 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8968 REFRESH_IBASE 8969 jmp .L_op_nop+(108*128) 8970 8971 /* ------------------------------ */ 8972 .balign 128 8973 .L_ALT_op_sput_short: /* 0x6d */ 8974 /* File: x86/alt_stub.S */ 8975 /* 8976 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 8977 * any interesting requests and then jump to the real instruction 8978 * handler. Unlike the Arm handler, we can't do this as a tail call 8979 * because rIBASE is caller save and we need to reload it. 8980 * 8981 * Note that unlike in the Arm implementation, we should never arrive 8982 * here with a zero breakFlag because we always refresh rIBASE on 8983 * return. 8984 */ 8985 .extern MterpCheckBefore 8986 movl rSELF, %ecx 8987 movl %ecx, OUT_ARG0(%esp) 8988 leal OFF_FP_SHADOWFRAME(rFP), %eax 8989 movl %eax, OUT_ARG1(%esp) 8990 movl rPC, OUT_ARG2(%esp) 8991 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 8992 REFRESH_IBASE 8993 jmp .L_op_nop+(109*128) 8994 8995 /* ------------------------------ */ 8996 .balign 128 8997 .L_ALT_op_invoke_virtual: /* 0x6e */ 8998 /* File: x86/alt_stub.S */ 8999 /* 9000 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9001 * any interesting requests and then jump to the real instruction 9002 * handler. Unlike the Arm handler, we can't do this as a tail call 9003 * because rIBASE is caller save and we need to reload it. 9004 * 9005 * Note that unlike in the Arm implementation, we should never arrive 9006 * here with a zero breakFlag because we always refresh rIBASE on 9007 * return. 9008 */ 9009 .extern MterpCheckBefore 9010 movl rSELF, %ecx 9011 movl %ecx, OUT_ARG0(%esp) 9012 leal OFF_FP_SHADOWFRAME(rFP), %eax 9013 movl %eax, OUT_ARG1(%esp) 9014 movl rPC, OUT_ARG2(%esp) 9015 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9016 REFRESH_IBASE 9017 jmp .L_op_nop+(110*128) 9018 9019 /* ------------------------------ */ 9020 .balign 128 9021 .L_ALT_op_invoke_super: /* 0x6f */ 9022 /* File: x86/alt_stub.S */ 9023 /* 9024 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9025 * any interesting requests and then jump to the real instruction 9026 * handler. Unlike the Arm handler, we can't do this as a tail call 9027 * because rIBASE is caller save and we need to reload it. 9028 * 9029 * Note that unlike in the Arm implementation, we should never arrive 9030 * here with a zero breakFlag because we always refresh rIBASE on 9031 * return. 9032 */ 9033 .extern MterpCheckBefore 9034 movl rSELF, %ecx 9035 movl %ecx, OUT_ARG0(%esp) 9036 leal OFF_FP_SHADOWFRAME(rFP), %eax 9037 movl %eax, OUT_ARG1(%esp) 9038 movl rPC, OUT_ARG2(%esp) 9039 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9040 REFRESH_IBASE 9041 jmp .L_op_nop+(111*128) 9042 9043 /* ------------------------------ */ 9044 .balign 128 9045 .L_ALT_op_invoke_direct: /* 0x70 */ 9046 /* File: x86/alt_stub.S */ 9047 /* 9048 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9049 * any interesting requests and then jump to the real instruction 9050 * handler. Unlike the Arm handler, we can't do this as a tail call 9051 * because rIBASE is caller save and we need to reload it. 9052 * 9053 * Note that unlike in the Arm implementation, we should never arrive 9054 * here with a zero breakFlag because we always refresh rIBASE on 9055 * return. 9056 */ 9057 .extern MterpCheckBefore 9058 movl rSELF, %ecx 9059 movl %ecx, OUT_ARG0(%esp) 9060 leal OFF_FP_SHADOWFRAME(rFP), %eax 9061 movl %eax, OUT_ARG1(%esp) 9062 movl rPC, OUT_ARG2(%esp) 9063 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9064 REFRESH_IBASE 9065 jmp .L_op_nop+(112*128) 9066 9067 /* ------------------------------ */ 9068 .balign 128 9069 .L_ALT_op_invoke_static: /* 0x71 */ 9070 /* File: x86/alt_stub.S */ 9071 /* 9072 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9073 * any interesting requests and then jump to the real instruction 9074 * handler. Unlike the Arm handler, we can't do this as a tail call 9075 * because rIBASE is caller save and we need to reload it. 9076 * 9077 * Note that unlike in the Arm implementation, we should never arrive 9078 * here with a zero breakFlag because we always refresh rIBASE on 9079 * return. 9080 */ 9081 .extern MterpCheckBefore 9082 movl rSELF, %ecx 9083 movl %ecx, OUT_ARG0(%esp) 9084 leal OFF_FP_SHADOWFRAME(rFP), %eax 9085 movl %eax, OUT_ARG1(%esp) 9086 movl rPC, OUT_ARG2(%esp) 9087 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9088 REFRESH_IBASE 9089 jmp .L_op_nop+(113*128) 9090 9091 /* ------------------------------ */ 9092 .balign 128 9093 .L_ALT_op_invoke_interface: /* 0x72 */ 9094 /* File: x86/alt_stub.S */ 9095 /* 9096 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9097 * any interesting requests and then jump to the real instruction 9098 * handler. Unlike the Arm handler, we can't do this as a tail call 9099 * because rIBASE is caller save and we need to reload it. 9100 * 9101 * Note that unlike in the Arm implementation, we should never arrive 9102 * here with a zero breakFlag because we always refresh rIBASE on 9103 * return. 9104 */ 9105 .extern MterpCheckBefore 9106 movl rSELF, %ecx 9107 movl %ecx, OUT_ARG0(%esp) 9108 leal OFF_FP_SHADOWFRAME(rFP), %eax 9109 movl %eax, OUT_ARG1(%esp) 9110 movl rPC, OUT_ARG2(%esp) 9111 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9112 REFRESH_IBASE 9113 jmp .L_op_nop+(114*128) 9114 9115 /* ------------------------------ */ 9116 .balign 128 9117 .L_ALT_op_return_void_no_barrier: /* 0x73 */ 9118 /* File: x86/alt_stub.S */ 9119 /* 9120 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9121 * any interesting requests and then jump to the real instruction 9122 * handler. Unlike the Arm handler, we can't do this as a tail call 9123 * because rIBASE is caller save and we need to reload it. 9124 * 9125 * Note that unlike in the Arm implementation, we should never arrive 9126 * here with a zero breakFlag because we always refresh rIBASE on 9127 * return. 9128 */ 9129 .extern MterpCheckBefore 9130 movl rSELF, %ecx 9131 movl %ecx, OUT_ARG0(%esp) 9132 leal OFF_FP_SHADOWFRAME(rFP), %eax 9133 movl %eax, OUT_ARG1(%esp) 9134 movl rPC, OUT_ARG2(%esp) 9135 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9136 REFRESH_IBASE 9137 jmp .L_op_nop+(115*128) 9138 9139 /* ------------------------------ */ 9140 .balign 128 9141 .L_ALT_op_invoke_virtual_range: /* 0x74 */ 9142 /* File: x86/alt_stub.S */ 9143 /* 9144 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9145 * any interesting requests and then jump to the real instruction 9146 * handler. Unlike the Arm handler, we can't do this as a tail call 9147 * because rIBASE is caller save and we need to reload it. 9148 * 9149 * Note that unlike in the Arm implementation, we should never arrive 9150 * here with a zero breakFlag because we always refresh rIBASE on 9151 * return. 9152 */ 9153 .extern MterpCheckBefore 9154 movl rSELF, %ecx 9155 movl %ecx, OUT_ARG0(%esp) 9156 leal OFF_FP_SHADOWFRAME(rFP), %eax 9157 movl %eax, OUT_ARG1(%esp) 9158 movl rPC, OUT_ARG2(%esp) 9159 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9160 REFRESH_IBASE 9161 jmp .L_op_nop+(116*128) 9162 9163 /* ------------------------------ */ 9164 .balign 128 9165 .L_ALT_op_invoke_super_range: /* 0x75 */ 9166 /* File: x86/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 movl rSELF, %ecx 9179 movl %ecx, OUT_ARG0(%esp) 9180 leal OFF_FP_SHADOWFRAME(rFP), %eax 9181 movl %eax, OUT_ARG1(%esp) 9182 movl rPC, OUT_ARG2(%esp) 9183 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9184 REFRESH_IBASE 9185 jmp .L_op_nop+(117*128) 9186 9187 /* ------------------------------ */ 9188 .balign 128 9189 .L_ALT_op_invoke_direct_range: /* 0x76 */ 9190 /* File: x86/alt_stub.S */ 9191 /* 9192 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9193 * any interesting requests and then jump to the real instruction 9194 * handler. Unlike the Arm handler, we can't do this as a tail call 9195 * because rIBASE is caller save and we need to reload it. 9196 * 9197 * Note that unlike in the Arm implementation, we should never arrive 9198 * here with a zero breakFlag because we always refresh rIBASE on 9199 * return. 9200 */ 9201 .extern MterpCheckBefore 9202 movl rSELF, %ecx 9203 movl %ecx, OUT_ARG0(%esp) 9204 leal OFF_FP_SHADOWFRAME(rFP), %eax 9205 movl %eax, OUT_ARG1(%esp) 9206 movl rPC, OUT_ARG2(%esp) 9207 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9208 REFRESH_IBASE 9209 jmp .L_op_nop+(118*128) 9210 9211 /* ------------------------------ */ 9212 .balign 128 9213 .L_ALT_op_invoke_static_range: /* 0x77 */ 9214 /* File: x86/alt_stub.S */ 9215 /* 9216 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9217 * any interesting requests and then jump to the real instruction 9218 * handler. Unlike the Arm handler, we can't do this as a tail call 9219 * because rIBASE is caller save and we need to reload it. 9220 * 9221 * Note that unlike in the Arm implementation, we should never arrive 9222 * here with a zero breakFlag because we always refresh rIBASE on 9223 * return. 9224 */ 9225 .extern MterpCheckBefore 9226 movl rSELF, %ecx 9227 movl %ecx, OUT_ARG0(%esp) 9228 leal OFF_FP_SHADOWFRAME(rFP), %eax 9229 movl %eax, OUT_ARG1(%esp) 9230 movl rPC, OUT_ARG2(%esp) 9231 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9232 REFRESH_IBASE 9233 jmp .L_op_nop+(119*128) 9234 9235 /* ------------------------------ */ 9236 .balign 128 9237 .L_ALT_op_invoke_interface_range: /* 0x78 */ 9238 /* File: x86/alt_stub.S */ 9239 /* 9240 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9241 * any interesting requests and then jump to the real instruction 9242 * handler. Unlike the Arm handler, we can't do this as a tail call 9243 * because rIBASE is caller save and we need to reload it. 9244 * 9245 * Note that unlike in the Arm implementation, we should never arrive 9246 * here with a zero breakFlag because we always refresh rIBASE on 9247 * return. 9248 */ 9249 .extern MterpCheckBefore 9250 movl rSELF, %ecx 9251 movl %ecx, OUT_ARG0(%esp) 9252 leal OFF_FP_SHADOWFRAME(rFP), %eax 9253 movl %eax, OUT_ARG1(%esp) 9254 movl rPC, OUT_ARG2(%esp) 9255 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9256 REFRESH_IBASE 9257 jmp .L_op_nop+(120*128) 9258 9259 /* ------------------------------ */ 9260 .balign 128 9261 .L_ALT_op_unused_79: /* 0x79 */ 9262 /* File: x86/alt_stub.S */ 9263 /* 9264 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9265 * any interesting requests and then jump to the real instruction 9266 * handler. Unlike the Arm handler, we can't do this as a tail call 9267 * because rIBASE is caller save and we need to reload it. 9268 * 9269 * Note that unlike in the Arm implementation, we should never arrive 9270 * here with a zero breakFlag because we always refresh rIBASE on 9271 * return. 9272 */ 9273 .extern MterpCheckBefore 9274 movl rSELF, %ecx 9275 movl %ecx, OUT_ARG0(%esp) 9276 leal OFF_FP_SHADOWFRAME(rFP), %eax 9277 movl %eax, OUT_ARG1(%esp) 9278 movl rPC, OUT_ARG2(%esp) 9279 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9280 REFRESH_IBASE 9281 jmp .L_op_nop+(121*128) 9282 9283 /* ------------------------------ */ 9284 .balign 128 9285 .L_ALT_op_unused_7a: /* 0x7a */ 9286 /* File: x86/alt_stub.S */ 9287 /* 9288 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9289 * any interesting requests and then jump to the real instruction 9290 * handler. Unlike the Arm handler, we can't do this as a tail call 9291 * because rIBASE is caller save and we need to reload it. 9292 * 9293 * Note that unlike in the Arm implementation, we should never arrive 9294 * here with a zero breakFlag because we always refresh rIBASE on 9295 * return. 9296 */ 9297 .extern MterpCheckBefore 9298 movl rSELF, %ecx 9299 movl %ecx, OUT_ARG0(%esp) 9300 leal OFF_FP_SHADOWFRAME(rFP), %eax 9301 movl %eax, OUT_ARG1(%esp) 9302 movl rPC, OUT_ARG2(%esp) 9303 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9304 REFRESH_IBASE 9305 jmp .L_op_nop+(122*128) 9306 9307 /* ------------------------------ */ 9308 .balign 128 9309 .L_ALT_op_neg_int: /* 0x7b */ 9310 /* File: x86/alt_stub.S */ 9311 /* 9312 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9313 * any interesting requests and then jump to the real instruction 9314 * handler. Unlike the Arm handler, we can't do this as a tail call 9315 * because rIBASE is caller save and we need to reload it. 9316 * 9317 * Note that unlike in the Arm implementation, we should never arrive 9318 * here with a zero breakFlag because we always refresh rIBASE on 9319 * return. 9320 */ 9321 .extern MterpCheckBefore 9322 movl rSELF, %ecx 9323 movl %ecx, OUT_ARG0(%esp) 9324 leal OFF_FP_SHADOWFRAME(rFP), %eax 9325 movl %eax, OUT_ARG1(%esp) 9326 movl rPC, OUT_ARG2(%esp) 9327 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9328 REFRESH_IBASE 9329 jmp .L_op_nop+(123*128) 9330 9331 /* ------------------------------ */ 9332 .balign 128 9333 .L_ALT_op_not_int: /* 0x7c */ 9334 /* File: x86/alt_stub.S */ 9335 /* 9336 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9337 * any interesting requests and then jump to the real instruction 9338 * handler. Unlike the Arm handler, we can't do this as a tail call 9339 * because rIBASE is caller save and we need to reload it. 9340 * 9341 * Note that unlike in the Arm implementation, we should never arrive 9342 * here with a zero breakFlag because we always refresh rIBASE on 9343 * return. 9344 */ 9345 .extern MterpCheckBefore 9346 movl rSELF, %ecx 9347 movl %ecx, OUT_ARG0(%esp) 9348 leal OFF_FP_SHADOWFRAME(rFP), %eax 9349 movl %eax, OUT_ARG1(%esp) 9350 movl rPC, OUT_ARG2(%esp) 9351 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9352 REFRESH_IBASE 9353 jmp .L_op_nop+(124*128) 9354 9355 /* ------------------------------ */ 9356 .balign 128 9357 .L_ALT_op_neg_long: /* 0x7d */ 9358 /* File: x86/alt_stub.S */ 9359 /* 9360 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9361 * any interesting requests and then jump to the real instruction 9362 * handler. Unlike the Arm handler, we can't do this as a tail call 9363 * because rIBASE is caller save and we need to reload it. 9364 * 9365 * Note that unlike in the Arm implementation, we should never arrive 9366 * here with a zero breakFlag because we always refresh rIBASE on 9367 * return. 9368 */ 9369 .extern MterpCheckBefore 9370 movl rSELF, %ecx 9371 movl %ecx, OUT_ARG0(%esp) 9372 leal OFF_FP_SHADOWFRAME(rFP), %eax 9373 movl %eax, OUT_ARG1(%esp) 9374 movl rPC, OUT_ARG2(%esp) 9375 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9376 REFRESH_IBASE 9377 jmp .L_op_nop+(125*128) 9378 9379 /* ------------------------------ */ 9380 .balign 128 9381 .L_ALT_op_not_long: /* 0x7e */ 9382 /* File: x86/alt_stub.S */ 9383 /* 9384 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9385 * any interesting requests and then jump to the real instruction 9386 * handler. Unlike the Arm handler, we can't do this as a tail call 9387 * because rIBASE is caller save and we need to reload it. 9388 * 9389 * Note that unlike in the Arm implementation, we should never arrive 9390 * here with a zero breakFlag because we always refresh rIBASE on 9391 * return. 9392 */ 9393 .extern MterpCheckBefore 9394 movl rSELF, %ecx 9395 movl %ecx, OUT_ARG0(%esp) 9396 leal OFF_FP_SHADOWFRAME(rFP), %eax 9397 movl %eax, OUT_ARG1(%esp) 9398 movl rPC, OUT_ARG2(%esp) 9399 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9400 REFRESH_IBASE 9401 jmp .L_op_nop+(126*128) 9402 9403 /* ------------------------------ */ 9404 .balign 128 9405 .L_ALT_op_neg_float: /* 0x7f */ 9406 /* File: x86/alt_stub.S */ 9407 /* 9408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9409 * any interesting requests and then jump to the real instruction 9410 * handler. Unlike the Arm handler, we can't do this as a tail call 9411 * because rIBASE is caller save and we need to reload it. 9412 * 9413 * Note that unlike in the Arm implementation, we should never arrive 9414 * here with a zero breakFlag because we always refresh rIBASE on 9415 * return. 9416 */ 9417 .extern MterpCheckBefore 9418 movl rSELF, %ecx 9419 movl %ecx, OUT_ARG0(%esp) 9420 leal OFF_FP_SHADOWFRAME(rFP), %eax 9421 movl %eax, OUT_ARG1(%esp) 9422 movl rPC, OUT_ARG2(%esp) 9423 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9424 REFRESH_IBASE 9425 jmp .L_op_nop+(127*128) 9426 9427 /* ------------------------------ */ 9428 .balign 128 9429 .L_ALT_op_neg_double: /* 0x80 */ 9430 /* File: x86/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 movl rSELF, %ecx 9443 movl %ecx, OUT_ARG0(%esp) 9444 leal OFF_FP_SHADOWFRAME(rFP), %eax 9445 movl %eax, OUT_ARG1(%esp) 9446 movl rPC, OUT_ARG2(%esp) 9447 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9448 REFRESH_IBASE 9449 jmp .L_op_nop+(128*128) 9450 9451 /* ------------------------------ */ 9452 .balign 128 9453 .L_ALT_op_int_to_long: /* 0x81 */ 9454 /* File: x86/alt_stub.S */ 9455 /* 9456 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9457 * any interesting requests and then jump to the real instruction 9458 * handler. Unlike the Arm handler, we can't do this as a tail call 9459 * because rIBASE is caller save and we need to reload it. 9460 * 9461 * Note that unlike in the Arm implementation, we should never arrive 9462 * here with a zero breakFlag because we always refresh rIBASE on 9463 * return. 9464 */ 9465 .extern MterpCheckBefore 9466 movl rSELF, %ecx 9467 movl %ecx, OUT_ARG0(%esp) 9468 leal OFF_FP_SHADOWFRAME(rFP), %eax 9469 movl %eax, OUT_ARG1(%esp) 9470 movl rPC, OUT_ARG2(%esp) 9471 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9472 REFRESH_IBASE 9473 jmp .L_op_nop+(129*128) 9474 9475 /* ------------------------------ */ 9476 .balign 128 9477 .L_ALT_op_int_to_float: /* 0x82 */ 9478 /* File: x86/alt_stub.S */ 9479 /* 9480 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9481 * any interesting requests and then jump to the real instruction 9482 * handler. Unlike the Arm handler, we can't do this as a tail call 9483 * because rIBASE is caller save and we need to reload it. 9484 * 9485 * Note that unlike in the Arm implementation, we should never arrive 9486 * here with a zero breakFlag because we always refresh rIBASE on 9487 * return. 9488 */ 9489 .extern MterpCheckBefore 9490 movl rSELF, %ecx 9491 movl %ecx, OUT_ARG0(%esp) 9492 leal OFF_FP_SHADOWFRAME(rFP), %eax 9493 movl %eax, OUT_ARG1(%esp) 9494 movl rPC, OUT_ARG2(%esp) 9495 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9496 REFRESH_IBASE 9497 jmp .L_op_nop+(130*128) 9498 9499 /* ------------------------------ */ 9500 .balign 128 9501 .L_ALT_op_int_to_double: /* 0x83 */ 9502 /* File: x86/alt_stub.S */ 9503 /* 9504 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9505 * any interesting requests and then jump to the real instruction 9506 * handler. Unlike the Arm handler, we can't do this as a tail call 9507 * because rIBASE is caller save and we need to reload it. 9508 * 9509 * Note that unlike in the Arm implementation, we should never arrive 9510 * here with a zero breakFlag because we always refresh rIBASE on 9511 * return. 9512 */ 9513 .extern MterpCheckBefore 9514 movl rSELF, %ecx 9515 movl %ecx, OUT_ARG0(%esp) 9516 leal OFF_FP_SHADOWFRAME(rFP), %eax 9517 movl %eax, OUT_ARG1(%esp) 9518 movl rPC, OUT_ARG2(%esp) 9519 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9520 REFRESH_IBASE 9521 jmp .L_op_nop+(131*128) 9522 9523 /* ------------------------------ */ 9524 .balign 128 9525 .L_ALT_op_long_to_int: /* 0x84 */ 9526 /* File: x86/alt_stub.S */ 9527 /* 9528 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9529 * any interesting requests and then jump to the real instruction 9530 * handler. Unlike the Arm handler, we can't do this as a tail call 9531 * because rIBASE is caller save and we need to reload it. 9532 * 9533 * Note that unlike in the Arm implementation, we should never arrive 9534 * here with a zero breakFlag because we always refresh rIBASE on 9535 * return. 9536 */ 9537 .extern MterpCheckBefore 9538 movl rSELF, %ecx 9539 movl %ecx, OUT_ARG0(%esp) 9540 leal OFF_FP_SHADOWFRAME(rFP), %eax 9541 movl %eax, OUT_ARG1(%esp) 9542 movl rPC, OUT_ARG2(%esp) 9543 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9544 REFRESH_IBASE 9545 jmp .L_op_nop+(132*128) 9546 9547 /* ------------------------------ */ 9548 .balign 128 9549 .L_ALT_op_long_to_float: /* 0x85 */ 9550 /* File: x86/alt_stub.S */ 9551 /* 9552 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9553 * any interesting requests and then jump to the real instruction 9554 * handler. Unlike the Arm handler, we can't do this as a tail call 9555 * because rIBASE is caller save and we need to reload it. 9556 * 9557 * Note that unlike in the Arm implementation, we should never arrive 9558 * here with a zero breakFlag because we always refresh rIBASE on 9559 * return. 9560 */ 9561 .extern MterpCheckBefore 9562 movl rSELF, %ecx 9563 movl %ecx, OUT_ARG0(%esp) 9564 leal OFF_FP_SHADOWFRAME(rFP), %eax 9565 movl %eax, OUT_ARG1(%esp) 9566 movl rPC, OUT_ARG2(%esp) 9567 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9568 REFRESH_IBASE 9569 jmp .L_op_nop+(133*128) 9570 9571 /* ------------------------------ */ 9572 .balign 128 9573 .L_ALT_op_long_to_double: /* 0x86 */ 9574 /* File: x86/alt_stub.S */ 9575 /* 9576 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9577 * any interesting requests and then jump to the real instruction 9578 * handler. Unlike the Arm handler, we can't do this as a tail call 9579 * because rIBASE is caller save and we need to reload it. 9580 * 9581 * Note that unlike in the Arm implementation, we should never arrive 9582 * here with a zero breakFlag because we always refresh rIBASE on 9583 * return. 9584 */ 9585 .extern MterpCheckBefore 9586 movl rSELF, %ecx 9587 movl %ecx, OUT_ARG0(%esp) 9588 leal OFF_FP_SHADOWFRAME(rFP), %eax 9589 movl %eax, OUT_ARG1(%esp) 9590 movl rPC, OUT_ARG2(%esp) 9591 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9592 REFRESH_IBASE 9593 jmp .L_op_nop+(134*128) 9594 9595 /* ------------------------------ */ 9596 .balign 128 9597 .L_ALT_op_float_to_int: /* 0x87 */ 9598 /* File: x86/alt_stub.S */ 9599 /* 9600 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9601 * any interesting requests and then jump to the real instruction 9602 * handler. Unlike the Arm handler, we can't do this as a tail call 9603 * because rIBASE is caller save and we need to reload it. 9604 * 9605 * Note that unlike in the Arm implementation, we should never arrive 9606 * here with a zero breakFlag because we always refresh rIBASE on 9607 * return. 9608 */ 9609 .extern MterpCheckBefore 9610 movl rSELF, %ecx 9611 movl %ecx, OUT_ARG0(%esp) 9612 leal OFF_FP_SHADOWFRAME(rFP), %eax 9613 movl %eax, OUT_ARG1(%esp) 9614 movl rPC, OUT_ARG2(%esp) 9615 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9616 REFRESH_IBASE 9617 jmp .L_op_nop+(135*128) 9618 9619 /* ------------------------------ */ 9620 .balign 128 9621 .L_ALT_op_float_to_long: /* 0x88 */ 9622 /* File: x86/alt_stub.S */ 9623 /* 9624 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9625 * any interesting requests and then jump to the real instruction 9626 * handler. Unlike the Arm handler, we can't do this as a tail call 9627 * because rIBASE is caller save and we need to reload it. 9628 * 9629 * Note that unlike in the Arm implementation, we should never arrive 9630 * here with a zero breakFlag because we always refresh rIBASE on 9631 * return. 9632 */ 9633 .extern MterpCheckBefore 9634 movl rSELF, %ecx 9635 movl %ecx, OUT_ARG0(%esp) 9636 leal OFF_FP_SHADOWFRAME(rFP), %eax 9637 movl %eax, OUT_ARG1(%esp) 9638 movl rPC, OUT_ARG2(%esp) 9639 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9640 REFRESH_IBASE 9641 jmp .L_op_nop+(136*128) 9642 9643 /* ------------------------------ */ 9644 .balign 128 9645 .L_ALT_op_float_to_double: /* 0x89 */ 9646 /* File: x86/alt_stub.S */ 9647 /* 9648 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9649 * any interesting requests and then jump to the real instruction 9650 * handler. Unlike the Arm handler, we can't do this as a tail call 9651 * because rIBASE is caller save and we need to reload it. 9652 * 9653 * Note that unlike in the Arm implementation, we should never arrive 9654 * here with a zero breakFlag because we always refresh rIBASE on 9655 * return. 9656 */ 9657 .extern MterpCheckBefore 9658 movl rSELF, %ecx 9659 movl %ecx, OUT_ARG0(%esp) 9660 leal OFF_FP_SHADOWFRAME(rFP), %eax 9661 movl %eax, OUT_ARG1(%esp) 9662 movl rPC, OUT_ARG2(%esp) 9663 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9664 REFRESH_IBASE 9665 jmp .L_op_nop+(137*128) 9666 9667 /* ------------------------------ */ 9668 .balign 128 9669 .L_ALT_op_double_to_int: /* 0x8a */ 9670 /* File: x86/alt_stub.S */ 9671 /* 9672 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9673 * any interesting requests and then jump to the real instruction 9674 * handler. Unlike the Arm handler, we can't do this as a tail call 9675 * because rIBASE is caller save and we need to reload it. 9676 * 9677 * Note that unlike in the Arm implementation, we should never arrive 9678 * here with a zero breakFlag because we always refresh rIBASE on 9679 * return. 9680 */ 9681 .extern MterpCheckBefore 9682 movl rSELF, %ecx 9683 movl %ecx, OUT_ARG0(%esp) 9684 leal OFF_FP_SHADOWFRAME(rFP), %eax 9685 movl %eax, OUT_ARG1(%esp) 9686 movl rPC, OUT_ARG2(%esp) 9687 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9688 REFRESH_IBASE 9689 jmp .L_op_nop+(138*128) 9690 9691 /* ------------------------------ */ 9692 .balign 128 9693 .L_ALT_op_double_to_long: /* 0x8b */ 9694 /* File: x86/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 movl rSELF, %ecx 9707 movl %ecx, OUT_ARG0(%esp) 9708 leal OFF_FP_SHADOWFRAME(rFP), %eax 9709 movl %eax, OUT_ARG1(%esp) 9710 movl rPC, OUT_ARG2(%esp) 9711 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9712 REFRESH_IBASE 9713 jmp .L_op_nop+(139*128) 9714 9715 /* ------------------------------ */ 9716 .balign 128 9717 .L_ALT_op_double_to_float: /* 0x8c */ 9718 /* File: x86/alt_stub.S */ 9719 /* 9720 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9721 * any interesting requests and then jump to the real instruction 9722 * handler. Unlike the Arm handler, we can't do this as a tail call 9723 * because rIBASE is caller save and we need to reload it. 9724 * 9725 * Note that unlike in the Arm implementation, we should never arrive 9726 * here with a zero breakFlag because we always refresh rIBASE on 9727 * return. 9728 */ 9729 .extern MterpCheckBefore 9730 movl rSELF, %ecx 9731 movl %ecx, OUT_ARG0(%esp) 9732 leal OFF_FP_SHADOWFRAME(rFP), %eax 9733 movl %eax, OUT_ARG1(%esp) 9734 movl rPC, OUT_ARG2(%esp) 9735 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9736 REFRESH_IBASE 9737 jmp .L_op_nop+(140*128) 9738 9739 /* ------------------------------ */ 9740 .balign 128 9741 .L_ALT_op_int_to_byte: /* 0x8d */ 9742 /* File: x86/alt_stub.S */ 9743 /* 9744 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9745 * any interesting requests and then jump to the real instruction 9746 * handler. Unlike the Arm handler, we can't do this as a tail call 9747 * because rIBASE is caller save and we need to reload it. 9748 * 9749 * Note that unlike in the Arm implementation, we should never arrive 9750 * here with a zero breakFlag because we always refresh rIBASE on 9751 * return. 9752 */ 9753 .extern MterpCheckBefore 9754 movl rSELF, %ecx 9755 movl %ecx, OUT_ARG0(%esp) 9756 leal OFF_FP_SHADOWFRAME(rFP), %eax 9757 movl %eax, OUT_ARG1(%esp) 9758 movl rPC, OUT_ARG2(%esp) 9759 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9760 REFRESH_IBASE 9761 jmp .L_op_nop+(141*128) 9762 9763 /* ------------------------------ */ 9764 .balign 128 9765 .L_ALT_op_int_to_char: /* 0x8e */ 9766 /* File: x86/alt_stub.S */ 9767 /* 9768 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9769 * any interesting requests and then jump to the real instruction 9770 * handler. Unlike the Arm handler, we can't do this as a tail call 9771 * because rIBASE is caller save and we need to reload it. 9772 * 9773 * Note that unlike in the Arm implementation, we should never arrive 9774 * here with a zero breakFlag because we always refresh rIBASE on 9775 * return. 9776 */ 9777 .extern MterpCheckBefore 9778 movl rSELF, %ecx 9779 movl %ecx, OUT_ARG0(%esp) 9780 leal OFF_FP_SHADOWFRAME(rFP), %eax 9781 movl %eax, OUT_ARG1(%esp) 9782 movl rPC, OUT_ARG2(%esp) 9783 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9784 REFRESH_IBASE 9785 jmp .L_op_nop+(142*128) 9786 9787 /* ------------------------------ */ 9788 .balign 128 9789 .L_ALT_op_int_to_short: /* 0x8f */ 9790 /* File: x86/alt_stub.S */ 9791 /* 9792 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9793 * any interesting requests and then jump to the real instruction 9794 * handler. Unlike the Arm handler, we can't do this as a tail call 9795 * because rIBASE is caller save and we need to reload it. 9796 * 9797 * Note that unlike in the Arm implementation, we should never arrive 9798 * here with a zero breakFlag because we always refresh rIBASE on 9799 * return. 9800 */ 9801 .extern MterpCheckBefore 9802 movl rSELF, %ecx 9803 movl %ecx, OUT_ARG0(%esp) 9804 leal OFF_FP_SHADOWFRAME(rFP), %eax 9805 movl %eax, OUT_ARG1(%esp) 9806 movl rPC, OUT_ARG2(%esp) 9807 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9808 REFRESH_IBASE 9809 jmp .L_op_nop+(143*128) 9810 9811 /* ------------------------------ */ 9812 .balign 128 9813 .L_ALT_op_add_int: /* 0x90 */ 9814 /* File: x86/alt_stub.S */ 9815 /* 9816 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9817 * any interesting requests and then jump to the real instruction 9818 * handler. Unlike the Arm handler, we can't do this as a tail call 9819 * because rIBASE is caller save and we need to reload it. 9820 * 9821 * Note that unlike in the Arm implementation, we should never arrive 9822 * here with a zero breakFlag because we always refresh rIBASE on 9823 * return. 9824 */ 9825 .extern MterpCheckBefore 9826 movl rSELF, %ecx 9827 movl %ecx, OUT_ARG0(%esp) 9828 leal OFF_FP_SHADOWFRAME(rFP), %eax 9829 movl %eax, OUT_ARG1(%esp) 9830 movl rPC, OUT_ARG2(%esp) 9831 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9832 REFRESH_IBASE 9833 jmp .L_op_nop+(144*128) 9834 9835 /* ------------------------------ */ 9836 .balign 128 9837 .L_ALT_op_sub_int: /* 0x91 */ 9838 /* File: x86/alt_stub.S */ 9839 /* 9840 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9841 * any interesting requests and then jump to the real instruction 9842 * handler. Unlike the Arm handler, we can't do this as a tail call 9843 * because rIBASE is caller save and we need to reload it. 9844 * 9845 * Note that unlike in the Arm implementation, we should never arrive 9846 * here with a zero breakFlag because we always refresh rIBASE on 9847 * return. 9848 */ 9849 .extern MterpCheckBefore 9850 movl rSELF, %ecx 9851 movl %ecx, OUT_ARG0(%esp) 9852 leal OFF_FP_SHADOWFRAME(rFP), %eax 9853 movl %eax, OUT_ARG1(%esp) 9854 movl rPC, OUT_ARG2(%esp) 9855 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9856 REFRESH_IBASE 9857 jmp .L_op_nop+(145*128) 9858 9859 /* ------------------------------ */ 9860 .balign 128 9861 .L_ALT_op_mul_int: /* 0x92 */ 9862 /* File: x86/alt_stub.S */ 9863 /* 9864 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9865 * any interesting requests and then jump to the real instruction 9866 * handler. Unlike the Arm handler, we can't do this as a tail call 9867 * because rIBASE is caller save and we need to reload it. 9868 * 9869 * Note that unlike in the Arm implementation, we should never arrive 9870 * here with a zero breakFlag because we always refresh rIBASE on 9871 * return. 9872 */ 9873 .extern MterpCheckBefore 9874 movl rSELF, %ecx 9875 movl %ecx, OUT_ARG0(%esp) 9876 leal OFF_FP_SHADOWFRAME(rFP), %eax 9877 movl %eax, OUT_ARG1(%esp) 9878 movl rPC, OUT_ARG2(%esp) 9879 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9880 REFRESH_IBASE 9881 jmp .L_op_nop+(146*128) 9882 9883 /* ------------------------------ */ 9884 .balign 128 9885 .L_ALT_op_div_int: /* 0x93 */ 9886 /* File: x86/alt_stub.S */ 9887 /* 9888 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9889 * any interesting requests and then jump to the real instruction 9890 * handler. Unlike the Arm handler, we can't do this as a tail call 9891 * because rIBASE is caller save and we need to reload it. 9892 * 9893 * Note that unlike in the Arm implementation, we should never arrive 9894 * here with a zero breakFlag because we always refresh rIBASE on 9895 * return. 9896 */ 9897 .extern MterpCheckBefore 9898 movl rSELF, %ecx 9899 movl %ecx, OUT_ARG0(%esp) 9900 leal OFF_FP_SHADOWFRAME(rFP), %eax 9901 movl %eax, OUT_ARG1(%esp) 9902 movl rPC, OUT_ARG2(%esp) 9903 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9904 REFRESH_IBASE 9905 jmp .L_op_nop+(147*128) 9906 9907 /* ------------------------------ */ 9908 .balign 128 9909 .L_ALT_op_rem_int: /* 0x94 */ 9910 /* File: x86/alt_stub.S */ 9911 /* 9912 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9913 * any interesting requests and then jump to the real instruction 9914 * handler. Unlike the Arm handler, we can't do this as a tail call 9915 * because rIBASE is caller save and we need to reload it. 9916 * 9917 * Note that unlike in the Arm implementation, we should never arrive 9918 * here with a zero breakFlag because we always refresh rIBASE on 9919 * return. 9920 */ 9921 .extern MterpCheckBefore 9922 movl rSELF, %ecx 9923 movl %ecx, OUT_ARG0(%esp) 9924 leal OFF_FP_SHADOWFRAME(rFP), %eax 9925 movl %eax, OUT_ARG1(%esp) 9926 movl rPC, OUT_ARG2(%esp) 9927 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9928 REFRESH_IBASE 9929 jmp .L_op_nop+(148*128) 9930 9931 /* ------------------------------ */ 9932 .balign 128 9933 .L_ALT_op_and_int: /* 0x95 */ 9934 /* File: x86/alt_stub.S */ 9935 /* 9936 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9937 * any interesting requests and then jump to the real instruction 9938 * handler. Unlike the Arm handler, we can't do this as a tail call 9939 * because rIBASE is caller save and we need to reload it. 9940 * 9941 * Note that unlike in the Arm implementation, we should never arrive 9942 * here with a zero breakFlag because we always refresh rIBASE on 9943 * return. 9944 */ 9945 .extern MterpCheckBefore 9946 movl rSELF, %ecx 9947 movl %ecx, OUT_ARG0(%esp) 9948 leal OFF_FP_SHADOWFRAME(rFP), %eax 9949 movl %eax, OUT_ARG1(%esp) 9950 movl rPC, OUT_ARG2(%esp) 9951 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9952 REFRESH_IBASE 9953 jmp .L_op_nop+(149*128) 9954 9955 /* ------------------------------ */ 9956 .balign 128 9957 .L_ALT_op_or_int: /* 0x96 */ 9958 /* File: x86/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 movl rSELF, %ecx 9971 movl %ecx, OUT_ARG0(%esp) 9972 leal OFF_FP_SHADOWFRAME(rFP), %eax 9973 movl %eax, OUT_ARG1(%esp) 9974 movl rPC, OUT_ARG2(%esp) 9975 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 9976 REFRESH_IBASE 9977 jmp .L_op_nop+(150*128) 9978 9979 /* ------------------------------ */ 9980 .balign 128 9981 .L_ALT_op_xor_int: /* 0x97 */ 9982 /* File: x86/alt_stub.S */ 9983 /* 9984 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 9985 * any interesting requests and then jump to the real instruction 9986 * handler. Unlike the Arm handler, we can't do this as a tail call 9987 * because rIBASE is caller save and we need to reload it. 9988 * 9989 * Note that unlike in the Arm implementation, we should never arrive 9990 * here with a zero breakFlag because we always refresh rIBASE on 9991 * return. 9992 */ 9993 .extern MterpCheckBefore 9994 movl rSELF, %ecx 9995 movl %ecx, OUT_ARG0(%esp) 9996 leal OFF_FP_SHADOWFRAME(rFP), %eax 9997 movl %eax, OUT_ARG1(%esp) 9998 movl rPC, OUT_ARG2(%esp) 9999 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10000 REFRESH_IBASE 10001 jmp .L_op_nop+(151*128) 10002 10003 /* ------------------------------ */ 10004 .balign 128 10005 .L_ALT_op_shl_int: /* 0x98 */ 10006 /* File: x86/alt_stub.S */ 10007 /* 10008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10009 * any interesting requests and then jump to the real instruction 10010 * handler. Unlike the Arm handler, we can't do this as a tail call 10011 * because rIBASE is caller save and we need to reload it. 10012 * 10013 * Note that unlike in the Arm implementation, we should never arrive 10014 * here with a zero breakFlag because we always refresh rIBASE on 10015 * return. 10016 */ 10017 .extern MterpCheckBefore 10018 movl rSELF, %ecx 10019 movl %ecx, OUT_ARG0(%esp) 10020 leal OFF_FP_SHADOWFRAME(rFP), %eax 10021 movl %eax, OUT_ARG1(%esp) 10022 movl rPC, OUT_ARG2(%esp) 10023 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10024 REFRESH_IBASE 10025 jmp .L_op_nop+(152*128) 10026 10027 /* ------------------------------ */ 10028 .balign 128 10029 .L_ALT_op_shr_int: /* 0x99 */ 10030 /* File: x86/alt_stub.S */ 10031 /* 10032 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10033 * any interesting requests and then jump to the real instruction 10034 * handler. Unlike the Arm handler, we can't do this as a tail call 10035 * because rIBASE is caller save and we need to reload it. 10036 * 10037 * Note that unlike in the Arm implementation, we should never arrive 10038 * here with a zero breakFlag because we always refresh rIBASE on 10039 * return. 10040 */ 10041 .extern MterpCheckBefore 10042 movl rSELF, %ecx 10043 movl %ecx, OUT_ARG0(%esp) 10044 leal OFF_FP_SHADOWFRAME(rFP), %eax 10045 movl %eax, OUT_ARG1(%esp) 10046 movl rPC, OUT_ARG2(%esp) 10047 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10048 REFRESH_IBASE 10049 jmp .L_op_nop+(153*128) 10050 10051 /* ------------------------------ */ 10052 .balign 128 10053 .L_ALT_op_ushr_int: /* 0x9a */ 10054 /* File: x86/alt_stub.S */ 10055 /* 10056 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10057 * any interesting requests and then jump to the real instruction 10058 * handler. Unlike the Arm handler, we can't do this as a tail call 10059 * because rIBASE is caller save and we need to reload it. 10060 * 10061 * Note that unlike in the Arm implementation, we should never arrive 10062 * here with a zero breakFlag because we always refresh rIBASE on 10063 * return. 10064 */ 10065 .extern MterpCheckBefore 10066 movl rSELF, %ecx 10067 movl %ecx, OUT_ARG0(%esp) 10068 leal OFF_FP_SHADOWFRAME(rFP), %eax 10069 movl %eax, OUT_ARG1(%esp) 10070 movl rPC, OUT_ARG2(%esp) 10071 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10072 REFRESH_IBASE 10073 jmp .L_op_nop+(154*128) 10074 10075 /* ------------------------------ */ 10076 .balign 128 10077 .L_ALT_op_add_long: /* 0x9b */ 10078 /* File: x86/alt_stub.S */ 10079 /* 10080 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10081 * any interesting requests and then jump to the real instruction 10082 * handler. Unlike the Arm handler, we can't do this as a tail call 10083 * because rIBASE is caller save and we need to reload it. 10084 * 10085 * Note that unlike in the Arm implementation, we should never arrive 10086 * here with a zero breakFlag because we always refresh rIBASE on 10087 * return. 10088 */ 10089 .extern MterpCheckBefore 10090 movl rSELF, %ecx 10091 movl %ecx, OUT_ARG0(%esp) 10092 leal OFF_FP_SHADOWFRAME(rFP), %eax 10093 movl %eax, OUT_ARG1(%esp) 10094 movl rPC, OUT_ARG2(%esp) 10095 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10096 REFRESH_IBASE 10097 jmp .L_op_nop+(155*128) 10098 10099 /* ------------------------------ */ 10100 .balign 128 10101 .L_ALT_op_sub_long: /* 0x9c */ 10102 /* File: x86/alt_stub.S */ 10103 /* 10104 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10105 * any interesting requests and then jump to the real instruction 10106 * handler. Unlike the Arm handler, we can't do this as a tail call 10107 * because rIBASE is caller save and we need to reload it. 10108 * 10109 * Note that unlike in the Arm implementation, we should never arrive 10110 * here with a zero breakFlag because we always refresh rIBASE on 10111 * return. 10112 */ 10113 .extern MterpCheckBefore 10114 movl rSELF, %ecx 10115 movl %ecx, OUT_ARG0(%esp) 10116 leal OFF_FP_SHADOWFRAME(rFP), %eax 10117 movl %eax, OUT_ARG1(%esp) 10118 movl rPC, OUT_ARG2(%esp) 10119 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10120 REFRESH_IBASE 10121 jmp .L_op_nop+(156*128) 10122 10123 /* ------------------------------ */ 10124 .balign 128 10125 .L_ALT_op_mul_long: /* 0x9d */ 10126 /* File: x86/alt_stub.S */ 10127 /* 10128 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10129 * any interesting requests and then jump to the real instruction 10130 * handler. Unlike the Arm handler, we can't do this as a tail call 10131 * because rIBASE is caller save and we need to reload it. 10132 * 10133 * Note that unlike in the Arm implementation, we should never arrive 10134 * here with a zero breakFlag because we always refresh rIBASE on 10135 * return. 10136 */ 10137 .extern MterpCheckBefore 10138 movl rSELF, %ecx 10139 movl %ecx, OUT_ARG0(%esp) 10140 leal OFF_FP_SHADOWFRAME(rFP), %eax 10141 movl %eax, OUT_ARG1(%esp) 10142 movl rPC, OUT_ARG2(%esp) 10143 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10144 REFRESH_IBASE 10145 jmp .L_op_nop+(157*128) 10146 10147 /* ------------------------------ */ 10148 .balign 128 10149 .L_ALT_op_div_long: /* 0x9e */ 10150 /* File: x86/alt_stub.S */ 10151 /* 10152 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10153 * any interesting requests and then jump to the real instruction 10154 * handler. Unlike the Arm handler, we can't do this as a tail call 10155 * because rIBASE is caller save and we need to reload it. 10156 * 10157 * Note that unlike in the Arm implementation, we should never arrive 10158 * here with a zero breakFlag because we always refresh rIBASE on 10159 * return. 10160 */ 10161 .extern MterpCheckBefore 10162 movl rSELF, %ecx 10163 movl %ecx, OUT_ARG0(%esp) 10164 leal OFF_FP_SHADOWFRAME(rFP), %eax 10165 movl %eax, OUT_ARG1(%esp) 10166 movl rPC, OUT_ARG2(%esp) 10167 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10168 REFRESH_IBASE 10169 jmp .L_op_nop+(158*128) 10170 10171 /* ------------------------------ */ 10172 .balign 128 10173 .L_ALT_op_rem_long: /* 0x9f */ 10174 /* File: x86/alt_stub.S */ 10175 /* 10176 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10177 * any interesting requests and then jump to the real instruction 10178 * handler. Unlike the Arm handler, we can't do this as a tail call 10179 * because rIBASE is caller save and we need to reload it. 10180 * 10181 * Note that unlike in the Arm implementation, we should never arrive 10182 * here with a zero breakFlag because we always refresh rIBASE on 10183 * return. 10184 */ 10185 .extern MterpCheckBefore 10186 movl rSELF, %ecx 10187 movl %ecx, OUT_ARG0(%esp) 10188 leal OFF_FP_SHADOWFRAME(rFP), %eax 10189 movl %eax, OUT_ARG1(%esp) 10190 movl rPC, OUT_ARG2(%esp) 10191 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10192 REFRESH_IBASE 10193 jmp .L_op_nop+(159*128) 10194 10195 /* ------------------------------ */ 10196 .balign 128 10197 .L_ALT_op_and_long: /* 0xa0 */ 10198 /* File: x86/alt_stub.S */ 10199 /* 10200 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10201 * any interesting requests and then jump to the real instruction 10202 * handler. Unlike the Arm handler, we can't do this as a tail call 10203 * because rIBASE is caller save and we need to reload it. 10204 * 10205 * Note that unlike in the Arm implementation, we should never arrive 10206 * here with a zero breakFlag because we always refresh rIBASE on 10207 * return. 10208 */ 10209 .extern MterpCheckBefore 10210 movl rSELF, %ecx 10211 movl %ecx, OUT_ARG0(%esp) 10212 leal OFF_FP_SHADOWFRAME(rFP), %eax 10213 movl %eax, OUT_ARG1(%esp) 10214 movl rPC, OUT_ARG2(%esp) 10215 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10216 REFRESH_IBASE 10217 jmp .L_op_nop+(160*128) 10218 10219 /* ------------------------------ */ 10220 .balign 128 10221 .L_ALT_op_or_long: /* 0xa1 */ 10222 /* File: x86/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 movl rSELF, %ecx 10235 movl %ecx, OUT_ARG0(%esp) 10236 leal OFF_FP_SHADOWFRAME(rFP), %eax 10237 movl %eax, OUT_ARG1(%esp) 10238 movl rPC, OUT_ARG2(%esp) 10239 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10240 REFRESH_IBASE 10241 jmp .L_op_nop+(161*128) 10242 10243 /* ------------------------------ */ 10244 .balign 128 10245 .L_ALT_op_xor_long: /* 0xa2 */ 10246 /* File: x86/alt_stub.S */ 10247 /* 10248 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10249 * any interesting requests and then jump to the real instruction 10250 * handler. Unlike the Arm handler, we can't do this as a tail call 10251 * because rIBASE is caller save and we need to reload it. 10252 * 10253 * Note that unlike in the Arm implementation, we should never arrive 10254 * here with a zero breakFlag because we always refresh rIBASE on 10255 * return. 10256 */ 10257 .extern MterpCheckBefore 10258 movl rSELF, %ecx 10259 movl %ecx, OUT_ARG0(%esp) 10260 leal OFF_FP_SHADOWFRAME(rFP), %eax 10261 movl %eax, OUT_ARG1(%esp) 10262 movl rPC, OUT_ARG2(%esp) 10263 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10264 REFRESH_IBASE 10265 jmp .L_op_nop+(162*128) 10266 10267 /* ------------------------------ */ 10268 .balign 128 10269 .L_ALT_op_shl_long: /* 0xa3 */ 10270 /* File: x86/alt_stub.S */ 10271 /* 10272 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10273 * any interesting requests and then jump to the real instruction 10274 * handler. Unlike the Arm handler, we can't do this as a tail call 10275 * because rIBASE is caller save and we need to reload it. 10276 * 10277 * Note that unlike in the Arm implementation, we should never arrive 10278 * here with a zero breakFlag because we always refresh rIBASE on 10279 * return. 10280 */ 10281 .extern MterpCheckBefore 10282 movl rSELF, %ecx 10283 movl %ecx, OUT_ARG0(%esp) 10284 leal OFF_FP_SHADOWFRAME(rFP), %eax 10285 movl %eax, OUT_ARG1(%esp) 10286 movl rPC, OUT_ARG2(%esp) 10287 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10288 REFRESH_IBASE 10289 jmp .L_op_nop+(163*128) 10290 10291 /* ------------------------------ */ 10292 .balign 128 10293 .L_ALT_op_shr_long: /* 0xa4 */ 10294 /* File: x86/alt_stub.S */ 10295 /* 10296 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10297 * any interesting requests and then jump to the real instruction 10298 * handler. Unlike the Arm handler, we can't do this as a tail call 10299 * because rIBASE is caller save and we need to reload it. 10300 * 10301 * Note that unlike in the Arm implementation, we should never arrive 10302 * here with a zero breakFlag because we always refresh rIBASE on 10303 * return. 10304 */ 10305 .extern MterpCheckBefore 10306 movl rSELF, %ecx 10307 movl %ecx, OUT_ARG0(%esp) 10308 leal OFF_FP_SHADOWFRAME(rFP), %eax 10309 movl %eax, OUT_ARG1(%esp) 10310 movl rPC, OUT_ARG2(%esp) 10311 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10312 REFRESH_IBASE 10313 jmp .L_op_nop+(164*128) 10314 10315 /* ------------------------------ */ 10316 .balign 128 10317 .L_ALT_op_ushr_long: /* 0xa5 */ 10318 /* File: x86/alt_stub.S */ 10319 /* 10320 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10321 * any interesting requests and then jump to the real instruction 10322 * handler. Unlike the Arm handler, we can't do this as a tail call 10323 * because rIBASE is caller save and we need to reload it. 10324 * 10325 * Note that unlike in the Arm implementation, we should never arrive 10326 * here with a zero breakFlag because we always refresh rIBASE on 10327 * return. 10328 */ 10329 .extern MterpCheckBefore 10330 movl rSELF, %ecx 10331 movl %ecx, OUT_ARG0(%esp) 10332 leal OFF_FP_SHADOWFRAME(rFP), %eax 10333 movl %eax, OUT_ARG1(%esp) 10334 movl rPC, OUT_ARG2(%esp) 10335 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10336 REFRESH_IBASE 10337 jmp .L_op_nop+(165*128) 10338 10339 /* ------------------------------ */ 10340 .balign 128 10341 .L_ALT_op_add_float: /* 0xa6 */ 10342 /* File: x86/alt_stub.S */ 10343 /* 10344 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10345 * any interesting requests and then jump to the real instruction 10346 * handler. Unlike the Arm handler, we can't do this as a tail call 10347 * because rIBASE is caller save and we need to reload it. 10348 * 10349 * Note that unlike in the Arm implementation, we should never arrive 10350 * here with a zero breakFlag because we always refresh rIBASE on 10351 * return. 10352 */ 10353 .extern MterpCheckBefore 10354 movl rSELF, %ecx 10355 movl %ecx, OUT_ARG0(%esp) 10356 leal OFF_FP_SHADOWFRAME(rFP), %eax 10357 movl %eax, OUT_ARG1(%esp) 10358 movl rPC, OUT_ARG2(%esp) 10359 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10360 REFRESH_IBASE 10361 jmp .L_op_nop+(166*128) 10362 10363 /* ------------------------------ */ 10364 .balign 128 10365 .L_ALT_op_sub_float: /* 0xa7 */ 10366 /* File: x86/alt_stub.S */ 10367 /* 10368 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10369 * any interesting requests and then jump to the real instruction 10370 * handler. Unlike the Arm handler, we can't do this as a tail call 10371 * because rIBASE is caller save and we need to reload it. 10372 * 10373 * Note that unlike in the Arm implementation, we should never arrive 10374 * here with a zero breakFlag because we always refresh rIBASE on 10375 * return. 10376 */ 10377 .extern MterpCheckBefore 10378 movl rSELF, %ecx 10379 movl %ecx, OUT_ARG0(%esp) 10380 leal OFF_FP_SHADOWFRAME(rFP), %eax 10381 movl %eax, OUT_ARG1(%esp) 10382 movl rPC, OUT_ARG2(%esp) 10383 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10384 REFRESH_IBASE 10385 jmp .L_op_nop+(167*128) 10386 10387 /* ------------------------------ */ 10388 .balign 128 10389 .L_ALT_op_mul_float: /* 0xa8 */ 10390 /* File: x86/alt_stub.S */ 10391 /* 10392 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10393 * any interesting requests and then jump to the real instruction 10394 * handler. Unlike the Arm handler, we can't do this as a tail call 10395 * because rIBASE is caller save and we need to reload it. 10396 * 10397 * Note that unlike in the Arm implementation, we should never arrive 10398 * here with a zero breakFlag because we always refresh rIBASE on 10399 * return. 10400 */ 10401 .extern MterpCheckBefore 10402 movl rSELF, %ecx 10403 movl %ecx, OUT_ARG0(%esp) 10404 leal OFF_FP_SHADOWFRAME(rFP), %eax 10405 movl %eax, OUT_ARG1(%esp) 10406 movl rPC, OUT_ARG2(%esp) 10407 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10408 REFRESH_IBASE 10409 jmp .L_op_nop+(168*128) 10410 10411 /* ------------------------------ */ 10412 .balign 128 10413 .L_ALT_op_div_float: /* 0xa9 */ 10414 /* File: x86/alt_stub.S */ 10415 /* 10416 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10417 * any interesting requests and then jump to the real instruction 10418 * handler. Unlike the Arm handler, we can't do this as a tail call 10419 * because rIBASE is caller save and we need to reload it. 10420 * 10421 * Note that unlike in the Arm implementation, we should never arrive 10422 * here with a zero breakFlag because we always refresh rIBASE on 10423 * return. 10424 */ 10425 .extern MterpCheckBefore 10426 movl rSELF, %ecx 10427 movl %ecx, OUT_ARG0(%esp) 10428 leal OFF_FP_SHADOWFRAME(rFP), %eax 10429 movl %eax, OUT_ARG1(%esp) 10430 movl rPC, OUT_ARG2(%esp) 10431 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10432 REFRESH_IBASE 10433 jmp .L_op_nop+(169*128) 10434 10435 /* ------------------------------ */ 10436 .balign 128 10437 .L_ALT_op_rem_float: /* 0xaa */ 10438 /* File: x86/alt_stub.S */ 10439 /* 10440 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10441 * any interesting requests and then jump to the real instruction 10442 * handler. Unlike the Arm handler, we can't do this as a tail call 10443 * because rIBASE is caller save and we need to reload it. 10444 * 10445 * Note that unlike in the Arm implementation, we should never arrive 10446 * here with a zero breakFlag because we always refresh rIBASE on 10447 * return. 10448 */ 10449 .extern MterpCheckBefore 10450 movl rSELF, %ecx 10451 movl %ecx, OUT_ARG0(%esp) 10452 leal OFF_FP_SHADOWFRAME(rFP), %eax 10453 movl %eax, OUT_ARG1(%esp) 10454 movl rPC, OUT_ARG2(%esp) 10455 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10456 REFRESH_IBASE 10457 jmp .L_op_nop+(170*128) 10458 10459 /* ------------------------------ */ 10460 .balign 128 10461 .L_ALT_op_add_double: /* 0xab */ 10462 /* File: x86/alt_stub.S */ 10463 /* 10464 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10465 * any interesting requests and then jump to the real instruction 10466 * handler. Unlike the Arm handler, we can't do this as a tail call 10467 * because rIBASE is caller save and we need to reload it. 10468 * 10469 * Note that unlike in the Arm implementation, we should never arrive 10470 * here with a zero breakFlag because we always refresh rIBASE on 10471 * return. 10472 */ 10473 .extern MterpCheckBefore 10474 movl rSELF, %ecx 10475 movl %ecx, OUT_ARG0(%esp) 10476 leal OFF_FP_SHADOWFRAME(rFP), %eax 10477 movl %eax, OUT_ARG1(%esp) 10478 movl rPC, OUT_ARG2(%esp) 10479 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10480 REFRESH_IBASE 10481 jmp .L_op_nop+(171*128) 10482 10483 /* ------------------------------ */ 10484 .balign 128 10485 .L_ALT_op_sub_double: /* 0xac */ 10486 /* File: x86/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 movl rSELF, %ecx 10499 movl %ecx, OUT_ARG0(%esp) 10500 leal OFF_FP_SHADOWFRAME(rFP), %eax 10501 movl %eax, OUT_ARG1(%esp) 10502 movl rPC, OUT_ARG2(%esp) 10503 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10504 REFRESH_IBASE 10505 jmp .L_op_nop+(172*128) 10506 10507 /* ------------------------------ */ 10508 .balign 128 10509 .L_ALT_op_mul_double: /* 0xad */ 10510 /* File: x86/alt_stub.S */ 10511 /* 10512 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10513 * any interesting requests and then jump to the real instruction 10514 * handler. Unlike the Arm handler, we can't do this as a tail call 10515 * because rIBASE is caller save and we need to reload it. 10516 * 10517 * Note that unlike in the Arm implementation, we should never arrive 10518 * here with a zero breakFlag because we always refresh rIBASE on 10519 * return. 10520 */ 10521 .extern MterpCheckBefore 10522 movl rSELF, %ecx 10523 movl %ecx, OUT_ARG0(%esp) 10524 leal OFF_FP_SHADOWFRAME(rFP), %eax 10525 movl %eax, OUT_ARG1(%esp) 10526 movl rPC, OUT_ARG2(%esp) 10527 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10528 REFRESH_IBASE 10529 jmp .L_op_nop+(173*128) 10530 10531 /* ------------------------------ */ 10532 .balign 128 10533 .L_ALT_op_div_double: /* 0xae */ 10534 /* File: x86/alt_stub.S */ 10535 /* 10536 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10537 * any interesting requests and then jump to the real instruction 10538 * handler. Unlike the Arm handler, we can't do this as a tail call 10539 * because rIBASE is caller save and we need to reload it. 10540 * 10541 * Note that unlike in the Arm implementation, we should never arrive 10542 * here with a zero breakFlag because we always refresh rIBASE on 10543 * return. 10544 */ 10545 .extern MterpCheckBefore 10546 movl rSELF, %ecx 10547 movl %ecx, OUT_ARG0(%esp) 10548 leal OFF_FP_SHADOWFRAME(rFP), %eax 10549 movl %eax, OUT_ARG1(%esp) 10550 movl rPC, OUT_ARG2(%esp) 10551 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10552 REFRESH_IBASE 10553 jmp .L_op_nop+(174*128) 10554 10555 /* ------------------------------ */ 10556 .balign 128 10557 .L_ALT_op_rem_double: /* 0xaf */ 10558 /* File: x86/alt_stub.S */ 10559 /* 10560 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10561 * any interesting requests and then jump to the real instruction 10562 * handler. Unlike the Arm handler, we can't do this as a tail call 10563 * because rIBASE is caller save and we need to reload it. 10564 * 10565 * Note that unlike in the Arm implementation, we should never arrive 10566 * here with a zero breakFlag because we always refresh rIBASE on 10567 * return. 10568 */ 10569 .extern MterpCheckBefore 10570 movl rSELF, %ecx 10571 movl %ecx, OUT_ARG0(%esp) 10572 leal OFF_FP_SHADOWFRAME(rFP), %eax 10573 movl %eax, OUT_ARG1(%esp) 10574 movl rPC, OUT_ARG2(%esp) 10575 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10576 REFRESH_IBASE 10577 jmp .L_op_nop+(175*128) 10578 10579 /* ------------------------------ */ 10580 .balign 128 10581 .L_ALT_op_add_int_2addr: /* 0xb0 */ 10582 /* File: x86/alt_stub.S */ 10583 /* 10584 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10585 * any interesting requests and then jump to the real instruction 10586 * handler. Unlike the Arm handler, we can't do this as a tail call 10587 * because rIBASE is caller save and we need to reload it. 10588 * 10589 * Note that unlike in the Arm implementation, we should never arrive 10590 * here with a zero breakFlag because we always refresh rIBASE on 10591 * return. 10592 */ 10593 .extern MterpCheckBefore 10594 movl rSELF, %ecx 10595 movl %ecx, OUT_ARG0(%esp) 10596 leal OFF_FP_SHADOWFRAME(rFP), %eax 10597 movl %eax, OUT_ARG1(%esp) 10598 movl rPC, OUT_ARG2(%esp) 10599 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10600 REFRESH_IBASE 10601 jmp .L_op_nop+(176*128) 10602 10603 /* ------------------------------ */ 10604 .balign 128 10605 .L_ALT_op_sub_int_2addr: /* 0xb1 */ 10606 /* File: x86/alt_stub.S */ 10607 /* 10608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10609 * any interesting requests and then jump to the real instruction 10610 * handler. Unlike the Arm handler, we can't do this as a tail call 10611 * because rIBASE is caller save and we need to reload it. 10612 * 10613 * Note that unlike in the Arm implementation, we should never arrive 10614 * here with a zero breakFlag because we always refresh rIBASE on 10615 * return. 10616 */ 10617 .extern MterpCheckBefore 10618 movl rSELF, %ecx 10619 movl %ecx, OUT_ARG0(%esp) 10620 leal OFF_FP_SHADOWFRAME(rFP), %eax 10621 movl %eax, OUT_ARG1(%esp) 10622 movl rPC, OUT_ARG2(%esp) 10623 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10624 REFRESH_IBASE 10625 jmp .L_op_nop+(177*128) 10626 10627 /* ------------------------------ */ 10628 .balign 128 10629 .L_ALT_op_mul_int_2addr: /* 0xb2 */ 10630 /* File: x86/alt_stub.S */ 10631 /* 10632 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10633 * any interesting requests and then jump to the real instruction 10634 * handler. Unlike the Arm handler, we can't do this as a tail call 10635 * because rIBASE is caller save and we need to reload it. 10636 * 10637 * Note that unlike in the Arm implementation, we should never arrive 10638 * here with a zero breakFlag because we always refresh rIBASE on 10639 * return. 10640 */ 10641 .extern MterpCheckBefore 10642 movl rSELF, %ecx 10643 movl %ecx, OUT_ARG0(%esp) 10644 leal OFF_FP_SHADOWFRAME(rFP), %eax 10645 movl %eax, OUT_ARG1(%esp) 10646 movl rPC, OUT_ARG2(%esp) 10647 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10648 REFRESH_IBASE 10649 jmp .L_op_nop+(178*128) 10650 10651 /* ------------------------------ */ 10652 .balign 128 10653 .L_ALT_op_div_int_2addr: /* 0xb3 */ 10654 /* File: x86/alt_stub.S */ 10655 /* 10656 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10657 * any interesting requests and then jump to the real instruction 10658 * handler. Unlike the Arm handler, we can't do this as a tail call 10659 * because rIBASE is caller save and we need to reload it. 10660 * 10661 * Note that unlike in the Arm implementation, we should never arrive 10662 * here with a zero breakFlag because we always refresh rIBASE on 10663 * return. 10664 */ 10665 .extern MterpCheckBefore 10666 movl rSELF, %ecx 10667 movl %ecx, OUT_ARG0(%esp) 10668 leal OFF_FP_SHADOWFRAME(rFP), %eax 10669 movl %eax, OUT_ARG1(%esp) 10670 movl rPC, OUT_ARG2(%esp) 10671 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10672 REFRESH_IBASE 10673 jmp .L_op_nop+(179*128) 10674 10675 /* ------------------------------ */ 10676 .balign 128 10677 .L_ALT_op_rem_int_2addr: /* 0xb4 */ 10678 /* File: x86/alt_stub.S */ 10679 /* 10680 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10681 * any interesting requests and then jump to the real instruction 10682 * handler. Unlike the Arm handler, we can't do this as a tail call 10683 * because rIBASE is caller save and we need to reload it. 10684 * 10685 * Note that unlike in the Arm implementation, we should never arrive 10686 * here with a zero breakFlag because we always refresh rIBASE on 10687 * return. 10688 */ 10689 .extern MterpCheckBefore 10690 movl rSELF, %ecx 10691 movl %ecx, OUT_ARG0(%esp) 10692 leal OFF_FP_SHADOWFRAME(rFP), %eax 10693 movl %eax, OUT_ARG1(%esp) 10694 movl rPC, OUT_ARG2(%esp) 10695 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10696 REFRESH_IBASE 10697 jmp .L_op_nop+(180*128) 10698 10699 /* ------------------------------ */ 10700 .balign 128 10701 .L_ALT_op_and_int_2addr: /* 0xb5 */ 10702 /* File: x86/alt_stub.S */ 10703 /* 10704 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10705 * any interesting requests and then jump to the real instruction 10706 * handler. Unlike the Arm handler, we can't do this as a tail call 10707 * because rIBASE is caller save and we need to reload it. 10708 * 10709 * Note that unlike in the Arm implementation, we should never arrive 10710 * here with a zero breakFlag because we always refresh rIBASE on 10711 * return. 10712 */ 10713 .extern MterpCheckBefore 10714 movl rSELF, %ecx 10715 movl %ecx, OUT_ARG0(%esp) 10716 leal OFF_FP_SHADOWFRAME(rFP), %eax 10717 movl %eax, OUT_ARG1(%esp) 10718 movl rPC, OUT_ARG2(%esp) 10719 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10720 REFRESH_IBASE 10721 jmp .L_op_nop+(181*128) 10722 10723 /* ------------------------------ */ 10724 .balign 128 10725 .L_ALT_op_or_int_2addr: /* 0xb6 */ 10726 /* File: x86/alt_stub.S */ 10727 /* 10728 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10729 * any interesting requests and then jump to the real instruction 10730 * handler. Unlike the Arm handler, we can't do this as a tail call 10731 * because rIBASE is caller save and we need to reload it. 10732 * 10733 * Note that unlike in the Arm implementation, we should never arrive 10734 * here with a zero breakFlag because we always refresh rIBASE on 10735 * return. 10736 */ 10737 .extern MterpCheckBefore 10738 movl rSELF, %ecx 10739 movl %ecx, OUT_ARG0(%esp) 10740 leal OFF_FP_SHADOWFRAME(rFP), %eax 10741 movl %eax, OUT_ARG1(%esp) 10742 movl rPC, OUT_ARG2(%esp) 10743 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10744 REFRESH_IBASE 10745 jmp .L_op_nop+(182*128) 10746 10747 /* ------------------------------ */ 10748 .balign 128 10749 .L_ALT_op_xor_int_2addr: /* 0xb7 */ 10750 /* File: x86/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 movl rSELF, %ecx 10763 movl %ecx, OUT_ARG0(%esp) 10764 leal OFF_FP_SHADOWFRAME(rFP), %eax 10765 movl %eax, OUT_ARG1(%esp) 10766 movl rPC, OUT_ARG2(%esp) 10767 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10768 REFRESH_IBASE 10769 jmp .L_op_nop+(183*128) 10770 10771 /* ------------------------------ */ 10772 .balign 128 10773 .L_ALT_op_shl_int_2addr: /* 0xb8 */ 10774 /* File: x86/alt_stub.S */ 10775 /* 10776 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10777 * any interesting requests and then jump to the real instruction 10778 * handler. Unlike the Arm handler, we can't do this as a tail call 10779 * because rIBASE is caller save and we need to reload it. 10780 * 10781 * Note that unlike in the Arm implementation, we should never arrive 10782 * here with a zero breakFlag because we always refresh rIBASE on 10783 * return. 10784 */ 10785 .extern MterpCheckBefore 10786 movl rSELF, %ecx 10787 movl %ecx, OUT_ARG0(%esp) 10788 leal OFF_FP_SHADOWFRAME(rFP), %eax 10789 movl %eax, OUT_ARG1(%esp) 10790 movl rPC, OUT_ARG2(%esp) 10791 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10792 REFRESH_IBASE 10793 jmp .L_op_nop+(184*128) 10794 10795 /* ------------------------------ */ 10796 .balign 128 10797 .L_ALT_op_shr_int_2addr: /* 0xb9 */ 10798 /* File: x86/alt_stub.S */ 10799 /* 10800 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10801 * any interesting requests and then jump to the real instruction 10802 * handler. Unlike the Arm handler, we can't do this as a tail call 10803 * because rIBASE is caller save and we need to reload it. 10804 * 10805 * Note that unlike in the Arm implementation, we should never arrive 10806 * here with a zero breakFlag because we always refresh rIBASE on 10807 * return. 10808 */ 10809 .extern MterpCheckBefore 10810 movl rSELF, %ecx 10811 movl %ecx, OUT_ARG0(%esp) 10812 leal OFF_FP_SHADOWFRAME(rFP), %eax 10813 movl %eax, OUT_ARG1(%esp) 10814 movl rPC, OUT_ARG2(%esp) 10815 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10816 REFRESH_IBASE 10817 jmp .L_op_nop+(185*128) 10818 10819 /* ------------------------------ */ 10820 .balign 128 10821 .L_ALT_op_ushr_int_2addr: /* 0xba */ 10822 /* File: x86/alt_stub.S */ 10823 /* 10824 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10825 * any interesting requests and then jump to the real instruction 10826 * handler. Unlike the Arm handler, we can't do this as a tail call 10827 * because rIBASE is caller save and we need to reload it. 10828 * 10829 * Note that unlike in the Arm implementation, we should never arrive 10830 * here with a zero breakFlag because we always refresh rIBASE on 10831 * return. 10832 */ 10833 .extern MterpCheckBefore 10834 movl rSELF, %ecx 10835 movl %ecx, OUT_ARG0(%esp) 10836 leal OFF_FP_SHADOWFRAME(rFP), %eax 10837 movl %eax, OUT_ARG1(%esp) 10838 movl rPC, OUT_ARG2(%esp) 10839 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10840 REFRESH_IBASE 10841 jmp .L_op_nop+(186*128) 10842 10843 /* ------------------------------ */ 10844 .balign 128 10845 .L_ALT_op_add_long_2addr: /* 0xbb */ 10846 /* File: x86/alt_stub.S */ 10847 /* 10848 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10849 * any interesting requests and then jump to the real instruction 10850 * handler. Unlike the Arm handler, we can't do this as a tail call 10851 * because rIBASE is caller save and we need to reload it. 10852 * 10853 * Note that unlike in the Arm implementation, we should never arrive 10854 * here with a zero breakFlag because we always refresh rIBASE on 10855 * return. 10856 */ 10857 .extern MterpCheckBefore 10858 movl rSELF, %ecx 10859 movl %ecx, OUT_ARG0(%esp) 10860 leal OFF_FP_SHADOWFRAME(rFP), %eax 10861 movl %eax, OUT_ARG1(%esp) 10862 movl rPC, OUT_ARG2(%esp) 10863 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10864 REFRESH_IBASE 10865 jmp .L_op_nop+(187*128) 10866 10867 /* ------------------------------ */ 10868 .balign 128 10869 .L_ALT_op_sub_long_2addr: /* 0xbc */ 10870 /* File: x86/alt_stub.S */ 10871 /* 10872 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10873 * any interesting requests and then jump to the real instruction 10874 * handler. Unlike the Arm handler, we can't do this as a tail call 10875 * because rIBASE is caller save and we need to reload it. 10876 * 10877 * Note that unlike in the Arm implementation, we should never arrive 10878 * here with a zero breakFlag because we always refresh rIBASE on 10879 * return. 10880 */ 10881 .extern MterpCheckBefore 10882 movl rSELF, %ecx 10883 movl %ecx, OUT_ARG0(%esp) 10884 leal OFF_FP_SHADOWFRAME(rFP), %eax 10885 movl %eax, OUT_ARG1(%esp) 10886 movl rPC, OUT_ARG2(%esp) 10887 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10888 REFRESH_IBASE 10889 jmp .L_op_nop+(188*128) 10890 10891 /* ------------------------------ */ 10892 .balign 128 10893 .L_ALT_op_mul_long_2addr: /* 0xbd */ 10894 /* File: x86/alt_stub.S */ 10895 /* 10896 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10897 * any interesting requests and then jump to the real instruction 10898 * handler. Unlike the Arm handler, we can't do this as a tail call 10899 * because rIBASE is caller save and we need to reload it. 10900 * 10901 * Note that unlike in the Arm implementation, we should never arrive 10902 * here with a zero breakFlag because we always refresh rIBASE on 10903 * return. 10904 */ 10905 .extern MterpCheckBefore 10906 movl rSELF, %ecx 10907 movl %ecx, OUT_ARG0(%esp) 10908 leal OFF_FP_SHADOWFRAME(rFP), %eax 10909 movl %eax, OUT_ARG1(%esp) 10910 movl rPC, OUT_ARG2(%esp) 10911 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10912 REFRESH_IBASE 10913 jmp .L_op_nop+(189*128) 10914 10915 /* ------------------------------ */ 10916 .balign 128 10917 .L_ALT_op_div_long_2addr: /* 0xbe */ 10918 /* File: x86/alt_stub.S */ 10919 /* 10920 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10921 * any interesting requests and then jump to the real instruction 10922 * handler. Unlike the Arm handler, we can't do this as a tail call 10923 * because rIBASE is caller save and we need to reload it. 10924 * 10925 * Note that unlike in the Arm implementation, we should never arrive 10926 * here with a zero breakFlag because we always refresh rIBASE on 10927 * return. 10928 */ 10929 .extern MterpCheckBefore 10930 movl rSELF, %ecx 10931 movl %ecx, OUT_ARG0(%esp) 10932 leal OFF_FP_SHADOWFRAME(rFP), %eax 10933 movl %eax, OUT_ARG1(%esp) 10934 movl rPC, OUT_ARG2(%esp) 10935 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10936 REFRESH_IBASE 10937 jmp .L_op_nop+(190*128) 10938 10939 /* ------------------------------ */ 10940 .balign 128 10941 .L_ALT_op_rem_long_2addr: /* 0xbf */ 10942 /* File: x86/alt_stub.S */ 10943 /* 10944 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10945 * any interesting requests and then jump to the real instruction 10946 * handler. Unlike the Arm handler, we can't do this as a tail call 10947 * because rIBASE is caller save and we need to reload it. 10948 * 10949 * Note that unlike in the Arm implementation, we should never arrive 10950 * here with a zero breakFlag because we always refresh rIBASE on 10951 * return. 10952 */ 10953 .extern MterpCheckBefore 10954 movl rSELF, %ecx 10955 movl %ecx, OUT_ARG0(%esp) 10956 leal OFF_FP_SHADOWFRAME(rFP), %eax 10957 movl %eax, OUT_ARG1(%esp) 10958 movl rPC, OUT_ARG2(%esp) 10959 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10960 REFRESH_IBASE 10961 jmp .L_op_nop+(191*128) 10962 10963 /* ------------------------------ */ 10964 .balign 128 10965 .L_ALT_op_and_long_2addr: /* 0xc0 */ 10966 /* File: x86/alt_stub.S */ 10967 /* 10968 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10969 * any interesting requests and then jump to the real instruction 10970 * handler. Unlike the Arm handler, we can't do this as a tail call 10971 * because rIBASE is caller save and we need to reload it. 10972 * 10973 * Note that unlike in the Arm implementation, we should never arrive 10974 * here with a zero breakFlag because we always refresh rIBASE on 10975 * return. 10976 */ 10977 .extern MterpCheckBefore 10978 movl rSELF, %ecx 10979 movl %ecx, OUT_ARG0(%esp) 10980 leal OFF_FP_SHADOWFRAME(rFP), %eax 10981 movl %eax, OUT_ARG1(%esp) 10982 movl rPC, OUT_ARG2(%esp) 10983 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 10984 REFRESH_IBASE 10985 jmp .L_op_nop+(192*128) 10986 10987 /* ------------------------------ */ 10988 .balign 128 10989 .L_ALT_op_or_long_2addr: /* 0xc1 */ 10990 /* File: x86/alt_stub.S */ 10991 /* 10992 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 10993 * any interesting requests and then jump to the real instruction 10994 * handler. Unlike the Arm handler, we can't do this as a tail call 10995 * because rIBASE is caller save and we need to reload it. 10996 * 10997 * Note that unlike in the Arm implementation, we should never arrive 10998 * here with a zero breakFlag because we always refresh rIBASE on 10999 * return. 11000 */ 11001 .extern MterpCheckBefore 11002 movl rSELF, %ecx 11003 movl %ecx, OUT_ARG0(%esp) 11004 leal OFF_FP_SHADOWFRAME(rFP), %eax 11005 movl %eax, OUT_ARG1(%esp) 11006 movl rPC, OUT_ARG2(%esp) 11007 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11008 REFRESH_IBASE 11009 jmp .L_op_nop+(193*128) 11010 11011 /* ------------------------------ */ 11012 .balign 128 11013 .L_ALT_op_xor_long_2addr: /* 0xc2 */ 11014 /* File: x86/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 movl rSELF, %ecx 11027 movl %ecx, OUT_ARG0(%esp) 11028 leal OFF_FP_SHADOWFRAME(rFP), %eax 11029 movl %eax, OUT_ARG1(%esp) 11030 movl rPC, OUT_ARG2(%esp) 11031 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11032 REFRESH_IBASE 11033 jmp .L_op_nop+(194*128) 11034 11035 /* ------------------------------ */ 11036 .balign 128 11037 .L_ALT_op_shl_long_2addr: /* 0xc3 */ 11038 /* File: x86/alt_stub.S */ 11039 /* 11040 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11041 * any interesting requests and then jump to the real instruction 11042 * handler. Unlike the Arm handler, we can't do this as a tail call 11043 * because rIBASE is caller save and we need to reload it. 11044 * 11045 * Note that unlike in the Arm implementation, we should never arrive 11046 * here with a zero breakFlag because we always refresh rIBASE on 11047 * return. 11048 */ 11049 .extern MterpCheckBefore 11050 movl rSELF, %ecx 11051 movl %ecx, OUT_ARG0(%esp) 11052 leal OFF_FP_SHADOWFRAME(rFP), %eax 11053 movl %eax, OUT_ARG1(%esp) 11054 movl rPC, OUT_ARG2(%esp) 11055 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11056 REFRESH_IBASE 11057 jmp .L_op_nop+(195*128) 11058 11059 /* ------------------------------ */ 11060 .balign 128 11061 .L_ALT_op_shr_long_2addr: /* 0xc4 */ 11062 /* File: x86/alt_stub.S */ 11063 /* 11064 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11065 * any interesting requests and then jump to the real instruction 11066 * handler. Unlike the Arm handler, we can't do this as a tail call 11067 * because rIBASE is caller save and we need to reload it. 11068 * 11069 * Note that unlike in the Arm implementation, we should never arrive 11070 * here with a zero breakFlag because we always refresh rIBASE on 11071 * return. 11072 */ 11073 .extern MterpCheckBefore 11074 movl rSELF, %ecx 11075 movl %ecx, OUT_ARG0(%esp) 11076 leal OFF_FP_SHADOWFRAME(rFP), %eax 11077 movl %eax, OUT_ARG1(%esp) 11078 movl rPC, OUT_ARG2(%esp) 11079 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11080 REFRESH_IBASE 11081 jmp .L_op_nop+(196*128) 11082 11083 /* ------------------------------ */ 11084 .balign 128 11085 .L_ALT_op_ushr_long_2addr: /* 0xc5 */ 11086 /* File: x86/alt_stub.S */ 11087 /* 11088 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11089 * any interesting requests and then jump to the real instruction 11090 * handler. Unlike the Arm handler, we can't do this as a tail call 11091 * because rIBASE is caller save and we need to reload it. 11092 * 11093 * Note that unlike in the Arm implementation, we should never arrive 11094 * here with a zero breakFlag because we always refresh rIBASE on 11095 * return. 11096 */ 11097 .extern MterpCheckBefore 11098 movl rSELF, %ecx 11099 movl %ecx, OUT_ARG0(%esp) 11100 leal OFF_FP_SHADOWFRAME(rFP), %eax 11101 movl %eax, OUT_ARG1(%esp) 11102 movl rPC, OUT_ARG2(%esp) 11103 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11104 REFRESH_IBASE 11105 jmp .L_op_nop+(197*128) 11106 11107 /* ------------------------------ */ 11108 .balign 128 11109 .L_ALT_op_add_float_2addr: /* 0xc6 */ 11110 /* File: x86/alt_stub.S */ 11111 /* 11112 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11113 * any interesting requests and then jump to the real instruction 11114 * handler. Unlike the Arm handler, we can't do this as a tail call 11115 * because rIBASE is caller save and we need to reload it. 11116 * 11117 * Note that unlike in the Arm implementation, we should never arrive 11118 * here with a zero breakFlag because we always refresh rIBASE on 11119 * return. 11120 */ 11121 .extern MterpCheckBefore 11122 movl rSELF, %ecx 11123 movl %ecx, OUT_ARG0(%esp) 11124 leal OFF_FP_SHADOWFRAME(rFP), %eax 11125 movl %eax, OUT_ARG1(%esp) 11126 movl rPC, OUT_ARG2(%esp) 11127 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11128 REFRESH_IBASE 11129 jmp .L_op_nop+(198*128) 11130 11131 /* ------------------------------ */ 11132 .balign 128 11133 .L_ALT_op_sub_float_2addr: /* 0xc7 */ 11134 /* File: x86/alt_stub.S */ 11135 /* 11136 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11137 * any interesting requests and then jump to the real instruction 11138 * handler. Unlike the Arm handler, we can't do this as a tail call 11139 * because rIBASE is caller save and we need to reload it. 11140 * 11141 * Note that unlike in the Arm implementation, we should never arrive 11142 * here with a zero breakFlag because we always refresh rIBASE on 11143 * return. 11144 */ 11145 .extern MterpCheckBefore 11146 movl rSELF, %ecx 11147 movl %ecx, OUT_ARG0(%esp) 11148 leal OFF_FP_SHADOWFRAME(rFP), %eax 11149 movl %eax, OUT_ARG1(%esp) 11150 movl rPC, OUT_ARG2(%esp) 11151 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11152 REFRESH_IBASE 11153 jmp .L_op_nop+(199*128) 11154 11155 /* ------------------------------ */ 11156 .balign 128 11157 .L_ALT_op_mul_float_2addr: /* 0xc8 */ 11158 /* File: x86/alt_stub.S */ 11159 /* 11160 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11161 * any interesting requests and then jump to the real instruction 11162 * handler. Unlike the Arm handler, we can't do this as a tail call 11163 * because rIBASE is caller save and we need to reload it. 11164 * 11165 * Note that unlike in the Arm implementation, we should never arrive 11166 * here with a zero breakFlag because we always refresh rIBASE on 11167 * return. 11168 */ 11169 .extern MterpCheckBefore 11170 movl rSELF, %ecx 11171 movl %ecx, OUT_ARG0(%esp) 11172 leal OFF_FP_SHADOWFRAME(rFP), %eax 11173 movl %eax, OUT_ARG1(%esp) 11174 movl rPC, OUT_ARG2(%esp) 11175 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11176 REFRESH_IBASE 11177 jmp .L_op_nop+(200*128) 11178 11179 /* ------------------------------ */ 11180 .balign 128 11181 .L_ALT_op_div_float_2addr: /* 0xc9 */ 11182 /* File: x86/alt_stub.S */ 11183 /* 11184 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11185 * any interesting requests and then jump to the real instruction 11186 * handler. Unlike the Arm handler, we can't do this as a tail call 11187 * because rIBASE is caller save and we need to reload it. 11188 * 11189 * Note that unlike in the Arm implementation, we should never arrive 11190 * here with a zero breakFlag because we always refresh rIBASE on 11191 * return. 11192 */ 11193 .extern MterpCheckBefore 11194 movl rSELF, %ecx 11195 movl %ecx, OUT_ARG0(%esp) 11196 leal OFF_FP_SHADOWFRAME(rFP), %eax 11197 movl %eax, OUT_ARG1(%esp) 11198 movl rPC, OUT_ARG2(%esp) 11199 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11200 REFRESH_IBASE 11201 jmp .L_op_nop+(201*128) 11202 11203 /* ------------------------------ */ 11204 .balign 128 11205 .L_ALT_op_rem_float_2addr: /* 0xca */ 11206 /* File: x86/alt_stub.S */ 11207 /* 11208 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11209 * any interesting requests and then jump to the real instruction 11210 * handler. Unlike the Arm handler, we can't do this as a tail call 11211 * because rIBASE is caller save and we need to reload it. 11212 * 11213 * Note that unlike in the Arm implementation, we should never arrive 11214 * here with a zero breakFlag because we always refresh rIBASE on 11215 * return. 11216 */ 11217 .extern MterpCheckBefore 11218 movl rSELF, %ecx 11219 movl %ecx, OUT_ARG0(%esp) 11220 leal OFF_FP_SHADOWFRAME(rFP), %eax 11221 movl %eax, OUT_ARG1(%esp) 11222 movl rPC, OUT_ARG2(%esp) 11223 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11224 REFRESH_IBASE 11225 jmp .L_op_nop+(202*128) 11226 11227 /* ------------------------------ */ 11228 .balign 128 11229 .L_ALT_op_add_double_2addr: /* 0xcb */ 11230 /* File: x86/alt_stub.S */ 11231 /* 11232 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11233 * any interesting requests and then jump to the real instruction 11234 * handler. Unlike the Arm handler, we can't do this as a tail call 11235 * because rIBASE is caller save and we need to reload it. 11236 * 11237 * Note that unlike in the Arm implementation, we should never arrive 11238 * here with a zero breakFlag because we always refresh rIBASE on 11239 * return. 11240 */ 11241 .extern MterpCheckBefore 11242 movl rSELF, %ecx 11243 movl %ecx, OUT_ARG0(%esp) 11244 leal OFF_FP_SHADOWFRAME(rFP), %eax 11245 movl %eax, OUT_ARG1(%esp) 11246 movl rPC, OUT_ARG2(%esp) 11247 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11248 REFRESH_IBASE 11249 jmp .L_op_nop+(203*128) 11250 11251 /* ------------------------------ */ 11252 .balign 128 11253 .L_ALT_op_sub_double_2addr: /* 0xcc */ 11254 /* File: x86/alt_stub.S */ 11255 /* 11256 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11257 * any interesting requests and then jump to the real instruction 11258 * handler. Unlike the Arm handler, we can't do this as a tail call 11259 * because rIBASE is caller save and we need to reload it. 11260 * 11261 * Note that unlike in the Arm implementation, we should never arrive 11262 * here with a zero breakFlag because we always refresh rIBASE on 11263 * return. 11264 */ 11265 .extern MterpCheckBefore 11266 movl rSELF, %ecx 11267 movl %ecx, OUT_ARG0(%esp) 11268 leal OFF_FP_SHADOWFRAME(rFP), %eax 11269 movl %eax, OUT_ARG1(%esp) 11270 movl rPC, OUT_ARG2(%esp) 11271 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11272 REFRESH_IBASE 11273 jmp .L_op_nop+(204*128) 11274 11275 /* ------------------------------ */ 11276 .balign 128 11277 .L_ALT_op_mul_double_2addr: /* 0xcd */ 11278 /* File: x86/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 movl rSELF, %ecx 11291 movl %ecx, OUT_ARG0(%esp) 11292 leal OFF_FP_SHADOWFRAME(rFP), %eax 11293 movl %eax, OUT_ARG1(%esp) 11294 movl rPC, OUT_ARG2(%esp) 11295 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11296 REFRESH_IBASE 11297 jmp .L_op_nop+(205*128) 11298 11299 /* ------------------------------ */ 11300 .balign 128 11301 .L_ALT_op_div_double_2addr: /* 0xce */ 11302 /* File: x86/alt_stub.S */ 11303 /* 11304 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11305 * any interesting requests and then jump to the real instruction 11306 * handler. Unlike the Arm handler, we can't do this as a tail call 11307 * because rIBASE is caller save and we need to reload it. 11308 * 11309 * Note that unlike in the Arm implementation, we should never arrive 11310 * here with a zero breakFlag because we always refresh rIBASE on 11311 * return. 11312 */ 11313 .extern MterpCheckBefore 11314 movl rSELF, %ecx 11315 movl %ecx, OUT_ARG0(%esp) 11316 leal OFF_FP_SHADOWFRAME(rFP), %eax 11317 movl %eax, OUT_ARG1(%esp) 11318 movl rPC, OUT_ARG2(%esp) 11319 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11320 REFRESH_IBASE 11321 jmp .L_op_nop+(206*128) 11322 11323 /* ------------------------------ */ 11324 .balign 128 11325 .L_ALT_op_rem_double_2addr: /* 0xcf */ 11326 /* File: x86/alt_stub.S */ 11327 /* 11328 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11329 * any interesting requests and then jump to the real instruction 11330 * handler. Unlike the Arm handler, we can't do this as a tail call 11331 * because rIBASE is caller save and we need to reload it. 11332 * 11333 * Note that unlike in the Arm implementation, we should never arrive 11334 * here with a zero breakFlag because we always refresh rIBASE on 11335 * return. 11336 */ 11337 .extern MterpCheckBefore 11338 movl rSELF, %ecx 11339 movl %ecx, OUT_ARG0(%esp) 11340 leal OFF_FP_SHADOWFRAME(rFP), %eax 11341 movl %eax, OUT_ARG1(%esp) 11342 movl rPC, OUT_ARG2(%esp) 11343 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11344 REFRESH_IBASE 11345 jmp .L_op_nop+(207*128) 11346 11347 /* ------------------------------ */ 11348 .balign 128 11349 .L_ALT_op_add_int_lit16: /* 0xd0 */ 11350 /* File: x86/alt_stub.S */ 11351 /* 11352 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11353 * any interesting requests and then jump to the real instruction 11354 * handler. Unlike the Arm handler, we can't do this as a tail call 11355 * because rIBASE is caller save and we need to reload it. 11356 * 11357 * Note that unlike in the Arm implementation, we should never arrive 11358 * here with a zero breakFlag because we always refresh rIBASE on 11359 * return. 11360 */ 11361 .extern MterpCheckBefore 11362 movl rSELF, %ecx 11363 movl %ecx, OUT_ARG0(%esp) 11364 leal OFF_FP_SHADOWFRAME(rFP), %eax 11365 movl %eax, OUT_ARG1(%esp) 11366 movl rPC, OUT_ARG2(%esp) 11367 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11368 REFRESH_IBASE 11369 jmp .L_op_nop+(208*128) 11370 11371 /* ------------------------------ */ 11372 .balign 128 11373 .L_ALT_op_rsub_int: /* 0xd1 */ 11374 /* File: x86/alt_stub.S */ 11375 /* 11376 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11377 * any interesting requests and then jump to the real instruction 11378 * handler. Unlike the Arm handler, we can't do this as a tail call 11379 * because rIBASE is caller save and we need to reload it. 11380 * 11381 * Note that unlike in the Arm implementation, we should never arrive 11382 * here with a zero breakFlag because we always refresh rIBASE on 11383 * return. 11384 */ 11385 .extern MterpCheckBefore 11386 movl rSELF, %ecx 11387 movl %ecx, OUT_ARG0(%esp) 11388 leal OFF_FP_SHADOWFRAME(rFP), %eax 11389 movl %eax, OUT_ARG1(%esp) 11390 movl rPC, OUT_ARG2(%esp) 11391 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11392 REFRESH_IBASE 11393 jmp .L_op_nop+(209*128) 11394 11395 /* ------------------------------ */ 11396 .balign 128 11397 .L_ALT_op_mul_int_lit16: /* 0xd2 */ 11398 /* File: x86/alt_stub.S */ 11399 /* 11400 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11401 * any interesting requests and then jump to the real instruction 11402 * handler. Unlike the Arm handler, we can't do this as a tail call 11403 * because rIBASE is caller save and we need to reload it. 11404 * 11405 * Note that unlike in the Arm implementation, we should never arrive 11406 * here with a zero breakFlag because we always refresh rIBASE on 11407 * return. 11408 */ 11409 .extern MterpCheckBefore 11410 movl rSELF, %ecx 11411 movl %ecx, OUT_ARG0(%esp) 11412 leal OFF_FP_SHADOWFRAME(rFP), %eax 11413 movl %eax, OUT_ARG1(%esp) 11414 movl rPC, OUT_ARG2(%esp) 11415 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11416 REFRESH_IBASE 11417 jmp .L_op_nop+(210*128) 11418 11419 /* ------------------------------ */ 11420 .balign 128 11421 .L_ALT_op_div_int_lit16: /* 0xd3 */ 11422 /* File: x86/alt_stub.S */ 11423 /* 11424 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11425 * any interesting requests and then jump to the real instruction 11426 * handler. Unlike the Arm handler, we can't do this as a tail call 11427 * because rIBASE is caller save and we need to reload it. 11428 * 11429 * Note that unlike in the Arm implementation, we should never arrive 11430 * here with a zero breakFlag because we always refresh rIBASE on 11431 * return. 11432 */ 11433 .extern MterpCheckBefore 11434 movl rSELF, %ecx 11435 movl %ecx, OUT_ARG0(%esp) 11436 leal OFF_FP_SHADOWFRAME(rFP), %eax 11437 movl %eax, OUT_ARG1(%esp) 11438 movl rPC, OUT_ARG2(%esp) 11439 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11440 REFRESH_IBASE 11441 jmp .L_op_nop+(211*128) 11442 11443 /* ------------------------------ */ 11444 .balign 128 11445 .L_ALT_op_rem_int_lit16: /* 0xd4 */ 11446 /* File: x86/alt_stub.S */ 11447 /* 11448 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11449 * any interesting requests and then jump to the real instruction 11450 * handler. Unlike the Arm handler, we can't do this as a tail call 11451 * because rIBASE is caller save and we need to reload it. 11452 * 11453 * Note that unlike in the Arm implementation, we should never arrive 11454 * here with a zero breakFlag because we always refresh rIBASE on 11455 * return. 11456 */ 11457 .extern MterpCheckBefore 11458 movl rSELF, %ecx 11459 movl %ecx, OUT_ARG0(%esp) 11460 leal OFF_FP_SHADOWFRAME(rFP), %eax 11461 movl %eax, OUT_ARG1(%esp) 11462 movl rPC, OUT_ARG2(%esp) 11463 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11464 REFRESH_IBASE 11465 jmp .L_op_nop+(212*128) 11466 11467 /* ------------------------------ */ 11468 .balign 128 11469 .L_ALT_op_and_int_lit16: /* 0xd5 */ 11470 /* File: x86/alt_stub.S */ 11471 /* 11472 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11473 * any interesting requests and then jump to the real instruction 11474 * handler. Unlike the Arm handler, we can't do this as a tail call 11475 * because rIBASE is caller save and we need to reload it. 11476 * 11477 * Note that unlike in the Arm implementation, we should never arrive 11478 * here with a zero breakFlag because we always refresh rIBASE on 11479 * return. 11480 */ 11481 .extern MterpCheckBefore 11482 movl rSELF, %ecx 11483 movl %ecx, OUT_ARG0(%esp) 11484 leal OFF_FP_SHADOWFRAME(rFP), %eax 11485 movl %eax, OUT_ARG1(%esp) 11486 movl rPC, OUT_ARG2(%esp) 11487 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11488 REFRESH_IBASE 11489 jmp .L_op_nop+(213*128) 11490 11491 /* ------------------------------ */ 11492 .balign 128 11493 .L_ALT_op_or_int_lit16: /* 0xd6 */ 11494 /* File: x86/alt_stub.S */ 11495 /* 11496 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11497 * any interesting requests and then jump to the real instruction 11498 * handler. Unlike the Arm handler, we can't do this as a tail call 11499 * because rIBASE is caller save and we need to reload it. 11500 * 11501 * Note that unlike in the Arm implementation, we should never arrive 11502 * here with a zero breakFlag because we always refresh rIBASE on 11503 * return. 11504 */ 11505 .extern MterpCheckBefore 11506 movl rSELF, %ecx 11507 movl %ecx, OUT_ARG0(%esp) 11508 leal OFF_FP_SHADOWFRAME(rFP), %eax 11509 movl %eax, OUT_ARG1(%esp) 11510 movl rPC, OUT_ARG2(%esp) 11511 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11512 REFRESH_IBASE 11513 jmp .L_op_nop+(214*128) 11514 11515 /* ------------------------------ */ 11516 .balign 128 11517 .L_ALT_op_xor_int_lit16: /* 0xd7 */ 11518 /* File: x86/alt_stub.S */ 11519 /* 11520 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11521 * any interesting requests and then jump to the real instruction 11522 * handler. Unlike the Arm handler, we can't do this as a tail call 11523 * because rIBASE is caller save and we need to reload it. 11524 * 11525 * Note that unlike in the Arm implementation, we should never arrive 11526 * here with a zero breakFlag because we always refresh rIBASE on 11527 * return. 11528 */ 11529 .extern MterpCheckBefore 11530 movl rSELF, %ecx 11531 movl %ecx, OUT_ARG0(%esp) 11532 leal OFF_FP_SHADOWFRAME(rFP), %eax 11533 movl %eax, OUT_ARG1(%esp) 11534 movl rPC, OUT_ARG2(%esp) 11535 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11536 REFRESH_IBASE 11537 jmp .L_op_nop+(215*128) 11538 11539 /* ------------------------------ */ 11540 .balign 128 11541 .L_ALT_op_add_int_lit8: /* 0xd8 */ 11542 /* File: x86/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 movl rSELF, %ecx 11555 movl %ecx, OUT_ARG0(%esp) 11556 leal OFF_FP_SHADOWFRAME(rFP), %eax 11557 movl %eax, OUT_ARG1(%esp) 11558 movl rPC, OUT_ARG2(%esp) 11559 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11560 REFRESH_IBASE 11561 jmp .L_op_nop+(216*128) 11562 11563 /* ------------------------------ */ 11564 .balign 128 11565 .L_ALT_op_rsub_int_lit8: /* 0xd9 */ 11566 /* File: x86/alt_stub.S */ 11567 /* 11568 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11569 * any interesting requests and then jump to the real instruction 11570 * handler. Unlike the Arm handler, we can't do this as a tail call 11571 * because rIBASE is caller save and we need to reload it. 11572 * 11573 * Note that unlike in the Arm implementation, we should never arrive 11574 * here with a zero breakFlag because we always refresh rIBASE on 11575 * return. 11576 */ 11577 .extern MterpCheckBefore 11578 movl rSELF, %ecx 11579 movl %ecx, OUT_ARG0(%esp) 11580 leal OFF_FP_SHADOWFRAME(rFP), %eax 11581 movl %eax, OUT_ARG1(%esp) 11582 movl rPC, OUT_ARG2(%esp) 11583 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11584 REFRESH_IBASE 11585 jmp .L_op_nop+(217*128) 11586 11587 /* ------------------------------ */ 11588 .balign 128 11589 .L_ALT_op_mul_int_lit8: /* 0xda */ 11590 /* File: x86/alt_stub.S */ 11591 /* 11592 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11593 * any interesting requests and then jump to the real instruction 11594 * handler. Unlike the Arm handler, we can't do this as a tail call 11595 * because rIBASE is caller save and we need to reload it. 11596 * 11597 * Note that unlike in the Arm implementation, we should never arrive 11598 * here with a zero breakFlag because we always refresh rIBASE on 11599 * return. 11600 */ 11601 .extern MterpCheckBefore 11602 movl rSELF, %ecx 11603 movl %ecx, OUT_ARG0(%esp) 11604 leal OFF_FP_SHADOWFRAME(rFP), %eax 11605 movl %eax, OUT_ARG1(%esp) 11606 movl rPC, OUT_ARG2(%esp) 11607 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11608 REFRESH_IBASE 11609 jmp .L_op_nop+(218*128) 11610 11611 /* ------------------------------ */ 11612 .balign 128 11613 .L_ALT_op_div_int_lit8: /* 0xdb */ 11614 /* File: x86/alt_stub.S */ 11615 /* 11616 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11617 * any interesting requests and then jump to the real instruction 11618 * handler. Unlike the Arm handler, we can't do this as a tail call 11619 * because rIBASE is caller save and we need to reload it. 11620 * 11621 * Note that unlike in the Arm implementation, we should never arrive 11622 * here with a zero breakFlag because we always refresh rIBASE on 11623 * return. 11624 */ 11625 .extern MterpCheckBefore 11626 movl rSELF, %ecx 11627 movl %ecx, OUT_ARG0(%esp) 11628 leal OFF_FP_SHADOWFRAME(rFP), %eax 11629 movl %eax, OUT_ARG1(%esp) 11630 movl rPC, OUT_ARG2(%esp) 11631 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11632 REFRESH_IBASE 11633 jmp .L_op_nop+(219*128) 11634 11635 /* ------------------------------ */ 11636 .balign 128 11637 .L_ALT_op_rem_int_lit8: /* 0xdc */ 11638 /* File: x86/alt_stub.S */ 11639 /* 11640 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11641 * any interesting requests and then jump to the real instruction 11642 * handler. Unlike the Arm handler, we can't do this as a tail call 11643 * because rIBASE is caller save and we need to reload it. 11644 * 11645 * Note that unlike in the Arm implementation, we should never arrive 11646 * here with a zero breakFlag because we always refresh rIBASE on 11647 * return. 11648 */ 11649 .extern MterpCheckBefore 11650 movl rSELF, %ecx 11651 movl %ecx, OUT_ARG0(%esp) 11652 leal OFF_FP_SHADOWFRAME(rFP), %eax 11653 movl %eax, OUT_ARG1(%esp) 11654 movl rPC, OUT_ARG2(%esp) 11655 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11656 REFRESH_IBASE 11657 jmp .L_op_nop+(220*128) 11658 11659 /* ------------------------------ */ 11660 .balign 128 11661 .L_ALT_op_and_int_lit8: /* 0xdd */ 11662 /* File: x86/alt_stub.S */ 11663 /* 11664 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11665 * any interesting requests and then jump to the real instruction 11666 * handler. Unlike the Arm handler, we can't do this as a tail call 11667 * because rIBASE is caller save and we need to reload it. 11668 * 11669 * Note that unlike in the Arm implementation, we should never arrive 11670 * here with a zero breakFlag because we always refresh rIBASE on 11671 * return. 11672 */ 11673 .extern MterpCheckBefore 11674 movl rSELF, %ecx 11675 movl %ecx, OUT_ARG0(%esp) 11676 leal OFF_FP_SHADOWFRAME(rFP), %eax 11677 movl %eax, OUT_ARG1(%esp) 11678 movl rPC, OUT_ARG2(%esp) 11679 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11680 REFRESH_IBASE 11681 jmp .L_op_nop+(221*128) 11682 11683 /* ------------------------------ */ 11684 .balign 128 11685 .L_ALT_op_or_int_lit8: /* 0xde */ 11686 /* File: x86/alt_stub.S */ 11687 /* 11688 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11689 * any interesting requests and then jump to the real instruction 11690 * handler. Unlike the Arm handler, we can't do this as a tail call 11691 * because rIBASE is caller save and we need to reload it. 11692 * 11693 * Note that unlike in the Arm implementation, we should never arrive 11694 * here with a zero breakFlag because we always refresh rIBASE on 11695 * return. 11696 */ 11697 .extern MterpCheckBefore 11698 movl rSELF, %ecx 11699 movl %ecx, OUT_ARG0(%esp) 11700 leal OFF_FP_SHADOWFRAME(rFP), %eax 11701 movl %eax, OUT_ARG1(%esp) 11702 movl rPC, OUT_ARG2(%esp) 11703 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11704 REFRESH_IBASE 11705 jmp .L_op_nop+(222*128) 11706 11707 /* ------------------------------ */ 11708 .balign 128 11709 .L_ALT_op_xor_int_lit8: /* 0xdf */ 11710 /* File: x86/alt_stub.S */ 11711 /* 11712 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11713 * any interesting requests and then jump to the real instruction 11714 * handler. Unlike the Arm handler, we can't do this as a tail call 11715 * because rIBASE is caller save and we need to reload it. 11716 * 11717 * Note that unlike in the Arm implementation, we should never arrive 11718 * here with a zero breakFlag because we always refresh rIBASE on 11719 * return. 11720 */ 11721 .extern MterpCheckBefore 11722 movl rSELF, %ecx 11723 movl %ecx, OUT_ARG0(%esp) 11724 leal OFF_FP_SHADOWFRAME(rFP), %eax 11725 movl %eax, OUT_ARG1(%esp) 11726 movl rPC, OUT_ARG2(%esp) 11727 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11728 REFRESH_IBASE 11729 jmp .L_op_nop+(223*128) 11730 11731 /* ------------------------------ */ 11732 .balign 128 11733 .L_ALT_op_shl_int_lit8: /* 0xe0 */ 11734 /* File: x86/alt_stub.S */ 11735 /* 11736 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11737 * any interesting requests and then jump to the real instruction 11738 * handler. Unlike the Arm handler, we can't do this as a tail call 11739 * because rIBASE is caller save and we need to reload it. 11740 * 11741 * Note that unlike in the Arm implementation, we should never arrive 11742 * here with a zero breakFlag because we always refresh rIBASE on 11743 * return. 11744 */ 11745 .extern MterpCheckBefore 11746 movl rSELF, %ecx 11747 movl %ecx, OUT_ARG0(%esp) 11748 leal OFF_FP_SHADOWFRAME(rFP), %eax 11749 movl %eax, OUT_ARG1(%esp) 11750 movl rPC, OUT_ARG2(%esp) 11751 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11752 REFRESH_IBASE 11753 jmp .L_op_nop+(224*128) 11754 11755 /* ------------------------------ */ 11756 .balign 128 11757 .L_ALT_op_shr_int_lit8: /* 0xe1 */ 11758 /* File: x86/alt_stub.S */ 11759 /* 11760 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11761 * any interesting requests and then jump to the real instruction 11762 * handler. Unlike the Arm handler, we can't do this as a tail call 11763 * because rIBASE is caller save and we need to reload it. 11764 * 11765 * Note that unlike in the Arm implementation, we should never arrive 11766 * here with a zero breakFlag because we always refresh rIBASE on 11767 * return. 11768 */ 11769 .extern MterpCheckBefore 11770 movl rSELF, %ecx 11771 movl %ecx, OUT_ARG0(%esp) 11772 leal OFF_FP_SHADOWFRAME(rFP), %eax 11773 movl %eax, OUT_ARG1(%esp) 11774 movl rPC, OUT_ARG2(%esp) 11775 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11776 REFRESH_IBASE 11777 jmp .L_op_nop+(225*128) 11778 11779 /* ------------------------------ */ 11780 .balign 128 11781 .L_ALT_op_ushr_int_lit8: /* 0xe2 */ 11782 /* File: x86/alt_stub.S */ 11783 /* 11784 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11785 * any interesting requests and then jump to the real instruction 11786 * handler. Unlike the Arm handler, we can't do this as a tail call 11787 * because rIBASE is caller save and we need to reload it. 11788 * 11789 * Note that unlike in the Arm implementation, we should never arrive 11790 * here with a zero breakFlag because we always refresh rIBASE on 11791 * return. 11792 */ 11793 .extern MterpCheckBefore 11794 movl rSELF, %ecx 11795 movl %ecx, OUT_ARG0(%esp) 11796 leal OFF_FP_SHADOWFRAME(rFP), %eax 11797 movl %eax, OUT_ARG1(%esp) 11798 movl rPC, OUT_ARG2(%esp) 11799 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11800 REFRESH_IBASE 11801 jmp .L_op_nop+(226*128) 11802 11803 /* ------------------------------ */ 11804 .balign 128 11805 .L_ALT_op_iget_quick: /* 0xe3 */ 11806 /* File: x86/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 movl rSELF, %ecx 11819 movl %ecx, OUT_ARG0(%esp) 11820 leal OFF_FP_SHADOWFRAME(rFP), %eax 11821 movl %eax, OUT_ARG1(%esp) 11822 movl rPC, OUT_ARG2(%esp) 11823 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11824 REFRESH_IBASE 11825 jmp .L_op_nop+(227*128) 11826 11827 /* ------------------------------ */ 11828 .balign 128 11829 .L_ALT_op_iget_wide_quick: /* 0xe4 */ 11830 /* File: x86/alt_stub.S */ 11831 /* 11832 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11833 * any interesting requests and then jump to the real instruction 11834 * handler. Unlike the Arm handler, we can't do this as a tail call 11835 * because rIBASE is caller save and we need to reload it. 11836 * 11837 * Note that unlike in the Arm implementation, we should never arrive 11838 * here with a zero breakFlag because we always refresh rIBASE on 11839 * return. 11840 */ 11841 .extern MterpCheckBefore 11842 movl rSELF, %ecx 11843 movl %ecx, OUT_ARG0(%esp) 11844 leal OFF_FP_SHADOWFRAME(rFP), %eax 11845 movl %eax, OUT_ARG1(%esp) 11846 movl rPC, OUT_ARG2(%esp) 11847 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11848 REFRESH_IBASE 11849 jmp .L_op_nop+(228*128) 11850 11851 /* ------------------------------ */ 11852 .balign 128 11853 .L_ALT_op_iget_object_quick: /* 0xe5 */ 11854 /* File: x86/alt_stub.S */ 11855 /* 11856 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11857 * any interesting requests and then jump to the real instruction 11858 * handler. Unlike the Arm handler, we can't do this as a tail call 11859 * because rIBASE is caller save and we need to reload it. 11860 * 11861 * Note that unlike in the Arm implementation, we should never arrive 11862 * here with a zero breakFlag because we always refresh rIBASE on 11863 * return. 11864 */ 11865 .extern MterpCheckBefore 11866 movl rSELF, %ecx 11867 movl %ecx, OUT_ARG0(%esp) 11868 leal OFF_FP_SHADOWFRAME(rFP), %eax 11869 movl %eax, OUT_ARG1(%esp) 11870 movl rPC, OUT_ARG2(%esp) 11871 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11872 REFRESH_IBASE 11873 jmp .L_op_nop+(229*128) 11874 11875 /* ------------------------------ */ 11876 .balign 128 11877 .L_ALT_op_iput_quick: /* 0xe6 */ 11878 /* File: x86/alt_stub.S */ 11879 /* 11880 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11881 * any interesting requests and then jump to the real instruction 11882 * handler. Unlike the Arm handler, we can't do this as a tail call 11883 * because rIBASE is caller save and we need to reload it. 11884 * 11885 * Note that unlike in the Arm implementation, we should never arrive 11886 * here with a zero breakFlag because we always refresh rIBASE on 11887 * return. 11888 */ 11889 .extern MterpCheckBefore 11890 movl rSELF, %ecx 11891 movl %ecx, OUT_ARG0(%esp) 11892 leal OFF_FP_SHADOWFRAME(rFP), %eax 11893 movl %eax, OUT_ARG1(%esp) 11894 movl rPC, OUT_ARG2(%esp) 11895 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11896 REFRESH_IBASE 11897 jmp .L_op_nop+(230*128) 11898 11899 /* ------------------------------ */ 11900 .balign 128 11901 .L_ALT_op_iput_wide_quick: /* 0xe7 */ 11902 /* File: x86/alt_stub.S */ 11903 /* 11904 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11905 * any interesting requests and then jump to the real instruction 11906 * handler. Unlike the Arm handler, we can't do this as a tail call 11907 * because rIBASE is caller save and we need to reload it. 11908 * 11909 * Note that unlike in the Arm implementation, we should never arrive 11910 * here with a zero breakFlag because we always refresh rIBASE on 11911 * return. 11912 */ 11913 .extern MterpCheckBefore 11914 movl rSELF, %ecx 11915 movl %ecx, OUT_ARG0(%esp) 11916 leal OFF_FP_SHADOWFRAME(rFP), %eax 11917 movl %eax, OUT_ARG1(%esp) 11918 movl rPC, OUT_ARG2(%esp) 11919 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11920 REFRESH_IBASE 11921 jmp .L_op_nop+(231*128) 11922 11923 /* ------------------------------ */ 11924 .balign 128 11925 .L_ALT_op_iput_object_quick: /* 0xe8 */ 11926 /* File: x86/alt_stub.S */ 11927 /* 11928 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11929 * any interesting requests and then jump to the real instruction 11930 * handler. Unlike the Arm handler, we can't do this as a tail call 11931 * because rIBASE is caller save and we need to reload it. 11932 * 11933 * Note that unlike in the Arm implementation, we should never arrive 11934 * here with a zero breakFlag because we always refresh rIBASE on 11935 * return. 11936 */ 11937 .extern MterpCheckBefore 11938 movl rSELF, %ecx 11939 movl %ecx, OUT_ARG0(%esp) 11940 leal OFF_FP_SHADOWFRAME(rFP), %eax 11941 movl %eax, OUT_ARG1(%esp) 11942 movl rPC, OUT_ARG2(%esp) 11943 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11944 REFRESH_IBASE 11945 jmp .L_op_nop+(232*128) 11946 11947 /* ------------------------------ */ 11948 .balign 128 11949 .L_ALT_op_invoke_virtual_quick: /* 0xe9 */ 11950 /* File: x86/alt_stub.S */ 11951 /* 11952 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11953 * any interesting requests and then jump to the real instruction 11954 * handler. Unlike the Arm handler, we can't do this as a tail call 11955 * because rIBASE is caller save and we need to reload it. 11956 * 11957 * Note that unlike in the Arm implementation, we should never arrive 11958 * here with a zero breakFlag because we always refresh rIBASE on 11959 * return. 11960 */ 11961 .extern MterpCheckBefore 11962 movl rSELF, %ecx 11963 movl %ecx, OUT_ARG0(%esp) 11964 leal OFF_FP_SHADOWFRAME(rFP), %eax 11965 movl %eax, OUT_ARG1(%esp) 11966 movl rPC, OUT_ARG2(%esp) 11967 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11968 REFRESH_IBASE 11969 jmp .L_op_nop+(233*128) 11970 11971 /* ------------------------------ */ 11972 .balign 128 11973 .L_ALT_op_invoke_virtual_range_quick: /* 0xea */ 11974 /* File: x86/alt_stub.S */ 11975 /* 11976 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 11977 * any interesting requests and then jump to the real instruction 11978 * handler. Unlike the Arm handler, we can't do this as a tail call 11979 * because rIBASE is caller save and we need to reload it. 11980 * 11981 * Note that unlike in the Arm implementation, we should never arrive 11982 * here with a zero breakFlag because we always refresh rIBASE on 11983 * return. 11984 */ 11985 .extern MterpCheckBefore 11986 movl rSELF, %ecx 11987 movl %ecx, OUT_ARG0(%esp) 11988 leal OFF_FP_SHADOWFRAME(rFP), %eax 11989 movl %eax, OUT_ARG1(%esp) 11990 movl rPC, OUT_ARG2(%esp) 11991 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 11992 REFRESH_IBASE 11993 jmp .L_op_nop+(234*128) 11994 11995 /* ------------------------------ */ 11996 .balign 128 11997 .L_ALT_op_iput_boolean_quick: /* 0xeb */ 11998 /* File: x86/alt_stub.S */ 11999 /* 12000 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12001 * any interesting requests and then jump to the real instruction 12002 * handler. Unlike the Arm handler, we can't do this as a tail call 12003 * because rIBASE is caller save and we need to reload it. 12004 * 12005 * Note that unlike in the Arm implementation, we should never arrive 12006 * here with a zero breakFlag because we always refresh rIBASE on 12007 * return. 12008 */ 12009 .extern MterpCheckBefore 12010 movl rSELF, %ecx 12011 movl %ecx, OUT_ARG0(%esp) 12012 leal OFF_FP_SHADOWFRAME(rFP), %eax 12013 movl %eax, OUT_ARG1(%esp) 12014 movl rPC, OUT_ARG2(%esp) 12015 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12016 REFRESH_IBASE 12017 jmp .L_op_nop+(235*128) 12018 12019 /* ------------------------------ */ 12020 .balign 128 12021 .L_ALT_op_iput_byte_quick: /* 0xec */ 12022 /* File: x86/alt_stub.S */ 12023 /* 12024 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12025 * any interesting requests and then jump to the real instruction 12026 * handler. Unlike the Arm handler, we can't do this as a tail call 12027 * because rIBASE is caller save and we need to reload it. 12028 * 12029 * Note that unlike in the Arm implementation, we should never arrive 12030 * here with a zero breakFlag because we always refresh rIBASE on 12031 * return. 12032 */ 12033 .extern MterpCheckBefore 12034 movl rSELF, %ecx 12035 movl %ecx, OUT_ARG0(%esp) 12036 leal OFF_FP_SHADOWFRAME(rFP), %eax 12037 movl %eax, OUT_ARG1(%esp) 12038 movl rPC, OUT_ARG2(%esp) 12039 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12040 REFRESH_IBASE 12041 jmp .L_op_nop+(236*128) 12042 12043 /* ------------------------------ */ 12044 .balign 128 12045 .L_ALT_op_iput_char_quick: /* 0xed */ 12046 /* File: x86/alt_stub.S */ 12047 /* 12048 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12049 * any interesting requests and then jump to the real instruction 12050 * handler. Unlike the Arm handler, we can't do this as a tail call 12051 * because rIBASE is caller save and we need to reload it. 12052 * 12053 * Note that unlike in the Arm implementation, we should never arrive 12054 * here with a zero breakFlag because we always refresh rIBASE on 12055 * return. 12056 */ 12057 .extern MterpCheckBefore 12058 movl rSELF, %ecx 12059 movl %ecx, OUT_ARG0(%esp) 12060 leal OFF_FP_SHADOWFRAME(rFP), %eax 12061 movl %eax, OUT_ARG1(%esp) 12062 movl rPC, OUT_ARG2(%esp) 12063 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12064 REFRESH_IBASE 12065 jmp .L_op_nop+(237*128) 12066 12067 /* ------------------------------ */ 12068 .balign 128 12069 .L_ALT_op_iput_short_quick: /* 0xee */ 12070 /* File: x86/alt_stub.S */ 12071 /* 12072 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12073 * any interesting requests and then jump to the real instruction 12074 * handler. Unlike the Arm handler, we can't do this as a tail call 12075 * because rIBASE is caller save and we need to reload it. 12076 * 12077 * Note that unlike in the Arm implementation, we should never arrive 12078 * here with a zero breakFlag because we always refresh rIBASE on 12079 * return. 12080 */ 12081 .extern MterpCheckBefore 12082 movl rSELF, %ecx 12083 movl %ecx, OUT_ARG0(%esp) 12084 leal OFF_FP_SHADOWFRAME(rFP), %eax 12085 movl %eax, OUT_ARG1(%esp) 12086 movl rPC, OUT_ARG2(%esp) 12087 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12088 REFRESH_IBASE 12089 jmp .L_op_nop+(238*128) 12090 12091 /* ------------------------------ */ 12092 .balign 128 12093 .L_ALT_op_iget_boolean_quick: /* 0xef */ 12094 /* File: x86/alt_stub.S */ 12095 /* 12096 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12097 * any interesting requests and then jump to the real instruction 12098 * handler. Unlike the Arm handler, we can't do this as a tail call 12099 * because rIBASE is caller save and we need to reload it. 12100 * 12101 * Note that unlike in the Arm implementation, we should never arrive 12102 * here with a zero breakFlag because we always refresh rIBASE on 12103 * return. 12104 */ 12105 .extern MterpCheckBefore 12106 movl rSELF, %ecx 12107 movl %ecx, OUT_ARG0(%esp) 12108 leal OFF_FP_SHADOWFRAME(rFP), %eax 12109 movl %eax, OUT_ARG1(%esp) 12110 movl rPC, OUT_ARG2(%esp) 12111 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12112 REFRESH_IBASE 12113 jmp .L_op_nop+(239*128) 12114 12115 /* ------------------------------ */ 12116 .balign 128 12117 .L_ALT_op_iget_byte_quick: /* 0xf0 */ 12118 /* File: x86/alt_stub.S */ 12119 /* 12120 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12121 * any interesting requests and then jump to the real instruction 12122 * handler. Unlike the Arm handler, we can't do this as a tail call 12123 * because rIBASE is caller save and we need to reload it. 12124 * 12125 * Note that unlike in the Arm implementation, we should never arrive 12126 * here with a zero breakFlag because we always refresh rIBASE on 12127 * return. 12128 */ 12129 .extern MterpCheckBefore 12130 movl rSELF, %ecx 12131 movl %ecx, OUT_ARG0(%esp) 12132 leal OFF_FP_SHADOWFRAME(rFP), %eax 12133 movl %eax, OUT_ARG1(%esp) 12134 movl rPC, OUT_ARG2(%esp) 12135 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12136 REFRESH_IBASE 12137 jmp .L_op_nop+(240*128) 12138 12139 /* ------------------------------ */ 12140 .balign 128 12141 .L_ALT_op_iget_char_quick: /* 0xf1 */ 12142 /* File: x86/alt_stub.S */ 12143 /* 12144 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12145 * any interesting requests and then jump to the real instruction 12146 * handler. Unlike the Arm handler, we can't do this as a tail call 12147 * because rIBASE is caller save and we need to reload it. 12148 * 12149 * Note that unlike in the Arm implementation, we should never arrive 12150 * here with a zero breakFlag because we always refresh rIBASE on 12151 * return. 12152 */ 12153 .extern MterpCheckBefore 12154 movl rSELF, %ecx 12155 movl %ecx, OUT_ARG0(%esp) 12156 leal OFF_FP_SHADOWFRAME(rFP), %eax 12157 movl %eax, OUT_ARG1(%esp) 12158 movl rPC, OUT_ARG2(%esp) 12159 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12160 REFRESH_IBASE 12161 jmp .L_op_nop+(241*128) 12162 12163 /* ------------------------------ */ 12164 .balign 128 12165 .L_ALT_op_iget_short_quick: /* 0xf2 */ 12166 /* File: x86/alt_stub.S */ 12167 /* 12168 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12169 * any interesting requests and then jump to the real instruction 12170 * handler. Unlike the Arm handler, we can't do this as a tail call 12171 * because rIBASE is caller save and we need to reload it. 12172 * 12173 * Note that unlike in the Arm implementation, we should never arrive 12174 * here with a zero breakFlag because we always refresh rIBASE on 12175 * return. 12176 */ 12177 .extern MterpCheckBefore 12178 movl rSELF, %ecx 12179 movl %ecx, OUT_ARG0(%esp) 12180 leal OFF_FP_SHADOWFRAME(rFP), %eax 12181 movl %eax, OUT_ARG1(%esp) 12182 movl rPC, OUT_ARG2(%esp) 12183 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12184 REFRESH_IBASE 12185 jmp .L_op_nop+(242*128) 12186 12187 /* ------------------------------ */ 12188 .balign 128 12189 .L_ALT_op_unused_f3: /* 0xf3 */ 12190 /* File: x86/alt_stub.S */ 12191 /* 12192 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12193 * any interesting requests and then jump to the real instruction 12194 * handler. Unlike the Arm handler, we can't do this as a tail call 12195 * because rIBASE is caller save and we need to reload it. 12196 * 12197 * Note that unlike in the Arm implementation, we should never arrive 12198 * here with a zero breakFlag because we always refresh rIBASE on 12199 * return. 12200 */ 12201 .extern MterpCheckBefore 12202 movl rSELF, %ecx 12203 movl %ecx, OUT_ARG0(%esp) 12204 leal OFF_FP_SHADOWFRAME(rFP), %eax 12205 movl %eax, OUT_ARG1(%esp) 12206 movl rPC, OUT_ARG2(%esp) 12207 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12208 REFRESH_IBASE 12209 jmp .L_op_nop+(243*128) 12210 12211 /* ------------------------------ */ 12212 .balign 128 12213 .L_ALT_op_unused_f4: /* 0xf4 */ 12214 /* File: x86/alt_stub.S */ 12215 /* 12216 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12217 * any interesting requests and then jump to the real instruction 12218 * handler. Unlike the Arm handler, we can't do this as a tail call 12219 * because rIBASE is caller save and we need to reload it. 12220 * 12221 * Note that unlike in the Arm implementation, we should never arrive 12222 * here with a zero breakFlag because we always refresh rIBASE on 12223 * return. 12224 */ 12225 .extern MterpCheckBefore 12226 movl rSELF, %ecx 12227 movl %ecx, OUT_ARG0(%esp) 12228 leal OFF_FP_SHADOWFRAME(rFP), %eax 12229 movl %eax, OUT_ARG1(%esp) 12230 movl rPC, OUT_ARG2(%esp) 12231 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12232 REFRESH_IBASE 12233 jmp .L_op_nop+(244*128) 12234 12235 /* ------------------------------ */ 12236 .balign 128 12237 .L_ALT_op_unused_f5: /* 0xf5 */ 12238 /* File: x86/alt_stub.S */ 12239 /* 12240 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12241 * any interesting requests and then jump to the real instruction 12242 * handler. Unlike the Arm handler, we can't do this as a tail call 12243 * because rIBASE is caller save and we need to reload it. 12244 * 12245 * Note that unlike in the Arm implementation, we should never arrive 12246 * here with a zero breakFlag because we always refresh rIBASE on 12247 * return. 12248 */ 12249 .extern MterpCheckBefore 12250 movl rSELF, %ecx 12251 movl %ecx, OUT_ARG0(%esp) 12252 leal OFF_FP_SHADOWFRAME(rFP), %eax 12253 movl %eax, OUT_ARG1(%esp) 12254 movl rPC, OUT_ARG2(%esp) 12255 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12256 REFRESH_IBASE 12257 jmp .L_op_nop+(245*128) 12258 12259 /* ------------------------------ */ 12260 .balign 128 12261 .L_ALT_op_unused_f6: /* 0xf6 */ 12262 /* File: x86/alt_stub.S */ 12263 /* 12264 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12265 * any interesting requests and then jump to the real instruction 12266 * handler. Unlike the Arm handler, we can't do this as a tail call 12267 * because rIBASE is caller save and we need to reload it. 12268 * 12269 * Note that unlike in the Arm implementation, we should never arrive 12270 * here with a zero breakFlag because we always refresh rIBASE on 12271 * return. 12272 */ 12273 .extern MterpCheckBefore 12274 movl rSELF, %ecx 12275 movl %ecx, OUT_ARG0(%esp) 12276 leal OFF_FP_SHADOWFRAME(rFP), %eax 12277 movl %eax, OUT_ARG1(%esp) 12278 movl rPC, OUT_ARG2(%esp) 12279 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12280 REFRESH_IBASE 12281 jmp .L_op_nop+(246*128) 12282 12283 /* ------------------------------ */ 12284 .balign 128 12285 .L_ALT_op_unused_f7: /* 0xf7 */ 12286 /* File: x86/alt_stub.S */ 12287 /* 12288 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12289 * any interesting requests and then jump to the real instruction 12290 * handler. Unlike the Arm handler, we can't do this as a tail call 12291 * because rIBASE is caller save and we need to reload it. 12292 * 12293 * Note that unlike in the Arm implementation, we should never arrive 12294 * here with a zero breakFlag because we always refresh rIBASE on 12295 * return. 12296 */ 12297 .extern MterpCheckBefore 12298 movl rSELF, %ecx 12299 movl %ecx, OUT_ARG0(%esp) 12300 leal OFF_FP_SHADOWFRAME(rFP), %eax 12301 movl %eax, OUT_ARG1(%esp) 12302 movl rPC, OUT_ARG2(%esp) 12303 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12304 REFRESH_IBASE 12305 jmp .L_op_nop+(247*128) 12306 12307 /* ------------------------------ */ 12308 .balign 128 12309 .L_ALT_op_unused_f8: /* 0xf8 */ 12310 /* File: x86/alt_stub.S */ 12311 /* 12312 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12313 * any interesting requests and then jump to the real instruction 12314 * handler. Unlike the Arm handler, we can't do this as a tail call 12315 * because rIBASE is caller save and we need to reload it. 12316 * 12317 * Note that unlike in the Arm implementation, we should never arrive 12318 * here with a zero breakFlag because we always refresh rIBASE on 12319 * return. 12320 */ 12321 .extern MterpCheckBefore 12322 movl rSELF, %ecx 12323 movl %ecx, OUT_ARG0(%esp) 12324 leal OFF_FP_SHADOWFRAME(rFP), %eax 12325 movl %eax, OUT_ARG1(%esp) 12326 movl rPC, OUT_ARG2(%esp) 12327 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12328 REFRESH_IBASE 12329 jmp .L_op_nop+(248*128) 12330 12331 /* ------------------------------ */ 12332 .balign 128 12333 .L_ALT_op_unused_f9: /* 0xf9 */ 12334 /* File: x86/alt_stub.S */ 12335 /* 12336 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12337 * any interesting requests and then jump to the real instruction 12338 * handler. Unlike the Arm handler, we can't do this as a tail call 12339 * because rIBASE is caller save and we need to reload it. 12340 * 12341 * Note that unlike in the Arm implementation, we should never arrive 12342 * here with a zero breakFlag because we always refresh rIBASE on 12343 * return. 12344 */ 12345 .extern MterpCheckBefore 12346 movl rSELF, %ecx 12347 movl %ecx, OUT_ARG0(%esp) 12348 leal OFF_FP_SHADOWFRAME(rFP), %eax 12349 movl %eax, OUT_ARG1(%esp) 12350 movl rPC, OUT_ARG2(%esp) 12351 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12352 REFRESH_IBASE 12353 jmp .L_op_nop+(249*128) 12354 12355 /* ------------------------------ */ 12356 .balign 128 12357 .L_ALT_op_invoke_polymorphic: /* 0xfa */ 12358 /* File: x86/alt_stub.S */ 12359 /* 12360 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12361 * any interesting requests and then jump to the real instruction 12362 * handler. Unlike the Arm handler, we can't do this as a tail call 12363 * because rIBASE is caller save and we need to reload it. 12364 * 12365 * Note that unlike in the Arm implementation, we should never arrive 12366 * here with a zero breakFlag because we always refresh rIBASE on 12367 * return. 12368 */ 12369 .extern MterpCheckBefore 12370 movl rSELF, %ecx 12371 movl %ecx, OUT_ARG0(%esp) 12372 leal OFF_FP_SHADOWFRAME(rFP), %eax 12373 movl %eax, OUT_ARG1(%esp) 12374 movl rPC, OUT_ARG2(%esp) 12375 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12376 REFRESH_IBASE 12377 jmp .L_op_nop+(250*128) 12378 12379 /* ------------------------------ */ 12380 .balign 128 12381 .L_ALT_op_invoke_polymorphic_range: /* 0xfb */ 12382 /* File: x86/alt_stub.S */ 12383 /* 12384 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12385 * any interesting requests and then jump to the real instruction 12386 * handler. Unlike the Arm handler, we can't do this as a tail call 12387 * because rIBASE is caller save and we need to reload it. 12388 * 12389 * Note that unlike in the Arm implementation, we should never arrive 12390 * here with a zero breakFlag because we always refresh rIBASE on 12391 * return. 12392 */ 12393 .extern MterpCheckBefore 12394 movl rSELF, %ecx 12395 movl %ecx, OUT_ARG0(%esp) 12396 leal OFF_FP_SHADOWFRAME(rFP), %eax 12397 movl %eax, OUT_ARG1(%esp) 12398 movl rPC, OUT_ARG2(%esp) 12399 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12400 REFRESH_IBASE 12401 jmp .L_op_nop+(251*128) 12402 12403 /* ------------------------------ */ 12404 .balign 128 12405 .L_ALT_op_invoke_custom: /* 0xfc */ 12406 /* File: x86/alt_stub.S */ 12407 /* 12408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12409 * any interesting requests and then jump to the real instruction 12410 * handler. Unlike the Arm handler, we can't do this as a tail call 12411 * because rIBASE is caller save and we need to reload it. 12412 * 12413 * Note that unlike in the Arm implementation, we should never arrive 12414 * here with a zero breakFlag because we always refresh rIBASE on 12415 * return. 12416 */ 12417 .extern MterpCheckBefore 12418 movl rSELF, %ecx 12419 movl %ecx, OUT_ARG0(%esp) 12420 leal OFF_FP_SHADOWFRAME(rFP), %eax 12421 movl %eax, OUT_ARG1(%esp) 12422 movl rPC, OUT_ARG2(%esp) 12423 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12424 REFRESH_IBASE 12425 jmp .L_op_nop+(252*128) 12426 12427 /* ------------------------------ */ 12428 .balign 128 12429 .L_ALT_op_invoke_custom_range: /* 0xfd */ 12430 /* File: x86/alt_stub.S */ 12431 /* 12432 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12433 * any interesting requests and then jump to the real instruction 12434 * handler. Unlike the Arm handler, we can't do this as a tail call 12435 * because rIBASE is caller save and we need to reload it. 12436 * 12437 * Note that unlike in the Arm implementation, we should never arrive 12438 * here with a zero breakFlag because we always refresh rIBASE on 12439 * return. 12440 */ 12441 .extern MterpCheckBefore 12442 movl rSELF, %ecx 12443 movl %ecx, OUT_ARG0(%esp) 12444 leal OFF_FP_SHADOWFRAME(rFP), %eax 12445 movl %eax, OUT_ARG1(%esp) 12446 movl rPC, OUT_ARG2(%esp) 12447 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12448 REFRESH_IBASE 12449 jmp .L_op_nop+(253*128) 12450 12451 /* ------------------------------ */ 12452 .balign 128 12453 .L_ALT_op_unused_fe: /* 0xfe */ 12454 /* File: x86/alt_stub.S */ 12455 /* 12456 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12457 * any interesting requests and then jump to the real instruction 12458 * handler. Unlike the Arm handler, we can't do this as a tail call 12459 * because rIBASE is caller save and we need to reload it. 12460 * 12461 * Note that unlike in the Arm implementation, we should never arrive 12462 * here with a zero breakFlag because we always refresh rIBASE on 12463 * return. 12464 */ 12465 .extern MterpCheckBefore 12466 movl rSELF, %ecx 12467 movl %ecx, OUT_ARG0(%esp) 12468 leal OFF_FP_SHADOWFRAME(rFP), %eax 12469 movl %eax, OUT_ARG1(%esp) 12470 movl rPC, OUT_ARG2(%esp) 12471 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12472 REFRESH_IBASE 12473 jmp .L_op_nop+(254*128) 12474 12475 /* ------------------------------ */ 12476 .balign 128 12477 .L_ALT_op_unused_ff: /* 0xff */ 12478 /* File: x86/alt_stub.S */ 12479 /* 12480 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle 12481 * any interesting requests and then jump to the real instruction 12482 * handler. Unlike the Arm handler, we can't do this as a tail call 12483 * because rIBASE is caller save and we need to reload it. 12484 * 12485 * Note that unlike in the Arm implementation, we should never arrive 12486 * here with a zero breakFlag because we always refresh rIBASE on 12487 * return. 12488 */ 12489 .extern MterpCheckBefore 12490 movl rSELF, %ecx 12491 movl %ecx, OUT_ARG0(%esp) 12492 leal OFF_FP_SHADOWFRAME(rFP), %eax 12493 movl %eax, OUT_ARG1(%esp) 12494 movl rPC, OUT_ARG2(%esp) 12495 call SYMBOL(MterpCheckBefore) # (self, shadow_frame, dex_pc_ptr) 12496 REFRESH_IBASE 12497 jmp .L_op_nop+(255*128) 12498 12499 .balign 128 12500 SIZE(SYMBOL(artMterpAsmAltInstructionStart),SYMBOL(artMterpAsmAltInstructionStart)) 12501 .global SYMBOL(artMterpAsmAltInstructionEnd) 12502 SYMBOL(artMterpAsmAltInstructionEnd): 12503 /* File: x86/footer.S */ 12504 /* 12505 * =========================================================================== 12506 * Common subroutines and data 12507 * =========================================================================== 12508 */ 12509 12510 .text 12511 .align 2 12512 12513 /* 12514 * We've detected a condition that will result in an exception, but the exception 12515 * has not yet been thrown. Just bail out to the reference interpreter to deal with it. 12516 * TUNING: for consistency, we may want to just go ahead and handle these here. 12517 */ 12518 common_errDivideByZero: 12519 EXPORT_PC 12520 #if MTERP_LOGGING 12521 movl rSELF, %eax 12522 movl %eax, OUT_ARG0(%esp) 12523 lea OFF_FP_SHADOWFRAME(rFP), %ecx 12524 movl %ecx, OUT_ARG1(%esp) 12525 call SYMBOL(MterpLogDivideByZeroException) 12526 #endif 12527 jmp MterpCommonFallback 12528 12529 common_errArrayIndex: 12530 EXPORT_PC 12531 #if MTERP_LOGGING 12532 movl rSELF, %eax 12533 movl %eax, OUT_ARG0(%esp) 12534 lea OFF_FP_SHADOWFRAME(rFP), %ecx 12535 movl %ecx, OUT_ARG1(%esp) 12536 call SYMBOL(MterpLogArrayIndexException) 12537 #endif 12538 jmp MterpCommonFallback 12539 12540 common_errNegativeArraySize: 12541 EXPORT_PC 12542 #if MTERP_LOGGING 12543 movl rSELF, %eax 12544 movl %eax, OUT_ARG0(%esp) 12545 lea OFF_FP_SHADOWFRAME(rFP), %ecx 12546 movl %ecx, OUT_ARG1(%esp) 12547 call SYMBOL(MterpLogNegativeArraySizeException) 12548 #endif 12549 jmp MterpCommonFallback 12550 12551 common_errNoSuchMethod: 12552 EXPORT_PC 12553 #if MTERP_LOGGING 12554 movl rSELF, %eax 12555 movl %eax, OUT_ARG0(%esp) 12556 lea OFF_FP_SHADOWFRAME(rFP), %ecx 12557 movl %ecx, OUT_ARG1(%esp) 12558 call SYMBOL(MterpLogNoSuchMethodException) 12559 #endif 12560 jmp MterpCommonFallback 12561 12562 common_errNullObject: 12563 EXPORT_PC 12564 #if MTERP_LOGGING 12565 movl rSELF, %eax 12566 movl %eax, OUT_ARG0(%esp) 12567 lea OFF_FP_SHADOWFRAME(rFP), %ecx 12568 movl %ecx, OUT_ARG1(%esp) 12569 call SYMBOL(MterpLogNullObjectException) 12570 #endif 12571 jmp MterpCommonFallback 12572 12573 common_exceptionThrown: 12574 EXPORT_PC 12575 #if MTERP_LOGGING 12576 movl rSELF, %eax 12577 movl %eax, OUT_ARG0(%esp) 12578 lea OFF_FP_SHADOWFRAME(rFP), %ecx 12579 movl %ecx, OUT_ARG0(%esp) 12580 call SYMBOL(MterpLogExceptionThrownException) 12581 #endif 12582 jmp MterpCommonFallback 12583 12584 MterpSuspendFallback: 12585 EXPORT_PC 12586 #if MTERP_LOGGING 12587 movl rSELF, %eax 12588 movl %eax, OUT_ARG0(%esp) 12589 lea OFF_FP_SHADOWFRAME(rFP), %ecx 12590 movl %ecx, OUT_ARG0(%esp) 12591 movl THREAD_FLAGS_OFFSET(%eax), %eax 12592 movl %eax, OUT_ARG2(%esp) 12593 call SYMBOL(MterpLogSuspendFallback) 12594 #endif 12595 jmp MterpCommonFallback 12596 12597 /* 12598 * If we're here, something is out of the ordinary. If there is a pending 12599 * exception, handle it. Otherwise, roll back and retry with the reference 12600 * interpreter. 12601 */ 12602 MterpPossibleException: 12603 movl rSELF, %eax 12604 testl $-1, THREAD_EXCEPTION_OFFSET(%eax) 12605 jz MterpFallback 12606 /* intentional fallthrough - handle pending exception. */ 12607 12608 /* 12609 * On return from a runtime helper routine, we've found a pending exception. 12610 * Can we handle it here - or need to bail out to caller? 12611 * 12612 */ 12613 MterpException: 12614 movl rSELF, %eax 12615 movl %eax, OUT_ARG0(%esp) 12616 lea OFF_FP_SHADOWFRAME(rFP), %ecx 12617 movl %ecx, OUT_ARG1(%esp) 12618 call SYMBOL(MterpHandleException) 12619 testb %al, %al 12620 jz MterpExceptionReturn 12621 movl OFF_FP_CODE_ITEM(rFP), %eax 12622 movl OFF_FP_DEX_PC(rFP), %ecx 12623 lea CODEITEM_INSNS_OFFSET(%eax), rPC 12624 lea (rPC, %ecx, 2), rPC 12625 movl rPC, OFF_FP_DEX_PC_PTR(rFP) 12626 /* Do we need to switch interpreters? */ 12627 call SYMBOL(MterpShouldSwitchInterpreters) 12628 testb %al, %al 12629 jnz MterpFallback 12630 /* resume execution at catch block */ 12631 REFRESH_IBASE 12632 FETCH_INST 12633 GOTO_NEXT 12634 /* NOTE: no fallthrough */ 12635 12636 /* 12637 * Common handling for branches with support for Jit profiling. 12638 * On entry: 12639 * rINST <= signed offset 12640 * condition bits <= set to establish sign of offset (use "NoFlags" entry if not) 12641 * 12642 * We have quite a few different cases for branch profiling, OSR detection and 12643 * suspend check support here. 12644 * 12645 * Taken backward branches: 12646 * If profiling active, do hotness countdown and report if we hit zero. 12647 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so. 12648 * Is there a pending suspend request? If so, suspend. 12649 * 12650 * Taken forward branches and not-taken backward branches: 12651 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so. 12652 * 12653 * Our most common case is expected to be a taken backward branch with active jit profiling, 12654 * but no full OSR check and no pending suspend request. 12655 * Next most common case is not-taken branch with no full OSR check. 12656 * 12657 */ 12658 MterpCommonTakenBranch: 12659 jg .L_forward_branch # don't add forward branches to hotness 12660 /* 12661 * We need to subtract 1 from positive values and we should not see 0 here, 12662 * so we may use the result of the comparison with -1. 12663 */ 12664 #if JIT_CHECK_OSR != -1 12665 # error "JIT_CHECK_OSR must be -1." 12666 #endif 12667 cmpw $JIT_CHECK_OSR, rPROFILE 12668 je .L_osr_check 12669 decw rPROFILE 12670 je .L_add_batch # counted down to zero - report 12671 .L_resume_backward_branch: 12672 movl rSELF, %eax 12673 testl $(THREAD_SUSPEND_OR_CHECKPOINT_REQUEST), THREAD_FLAGS_OFFSET(%eax) 12674 leal (rPC, rINST, 2), rPC 12675 FETCH_INST 12676 jnz .L_suspend_request_pending 12677 REFRESH_IBASE 12678 GOTO_NEXT 12679 12680 .L_suspend_request_pending: 12681 EXPORT_PC 12682 movl %eax, OUT_ARG0(%esp) # rSELF in eax 12683 call SYMBOL(MterpSuspendCheck) # (self) 12684 testb %al, %al 12685 jnz MterpFallback 12686 REFRESH_IBASE # might have changed during suspend 12687 GOTO_NEXT 12688 12689 .L_no_count_backwards: 12690 cmpw $JIT_CHECK_OSR, rPROFILE # possible OSR re-entry? 12691 jne .L_resume_backward_branch 12692 .L_osr_check: 12693 EXPORT_PC 12694 movl rSELF, %eax 12695 movl %eax, OUT_ARG0(%esp) 12696 leal OFF_FP_SHADOWFRAME(rFP), %ecx 12697 movl %ecx, OUT_ARG1(%esp) 12698 movl rINST, OUT_ARG2(%esp) 12699 call SYMBOL(MterpMaybeDoOnStackReplacement) # (self, shadow_frame, offset) 12700 testb %al, %al 12701 jz .L_resume_backward_branch 12702 jmp MterpOnStackReplacement 12703 12704 .L_forward_branch: 12705 cmpw $JIT_CHECK_OSR, rPROFILE # possible OSR re-entry? 12706 je .L_check_osr_forward 12707 .L_resume_forward_branch: 12708 leal (rPC, rINST, 2), rPC 12709 FETCH_INST 12710 GOTO_NEXT 12711 12712 .L_check_osr_forward: 12713 EXPORT_PC 12714 movl rSELF, %eax 12715 movl %eax, OUT_ARG0(%esp) 12716 leal OFF_FP_SHADOWFRAME(rFP), %ecx 12717 movl %ecx, OUT_ARG1(%esp) 12718 movl rINST, OUT_ARG2(%esp) 12719 call SYMBOL(MterpMaybeDoOnStackReplacement) # (self, shadow_frame, offset) 12720 testb %al, %al 12721 REFRESH_IBASE 12722 jz .L_resume_forward_branch 12723 jmp MterpOnStackReplacement 12724 12725 .L_add_batch: 12726 movl OFF_FP_METHOD(rFP), %eax 12727 movl %eax, OUT_ARG0(%esp) 12728 leal OFF_FP_SHADOWFRAME(rFP), %ecx 12729 movl %ecx, OUT_ARG1(%esp) 12730 movl rSELF, %eax 12731 movl %eax, OUT_ARG2(%esp) 12732 call SYMBOL(MterpAddHotnessBatch) # (method, shadow_frame, self) 12733 jmp .L_no_count_backwards 12734 12735 /* 12736 * Entered from the conditional branch handlers when OSR check request active on 12737 * not-taken path. All Dalvik not-taken conditional branch offsets are 2. 12738 */ 12739 .L_check_not_taken_osr: 12740 EXPORT_PC 12741 movl rSELF, %eax 12742 movl %eax, OUT_ARG0(%esp) 12743 leal OFF_FP_SHADOWFRAME(rFP), %ecx 12744 movl %ecx, OUT_ARG1(%esp) 12745 movl $2, OUT_ARG2(%esp) 12746 call SYMBOL(MterpMaybeDoOnStackReplacement) # (self, shadow_frame, offset) 12747 testb %al, %al 12748 REFRESH_IBASE 12749 jnz MterpOnStackReplacement 12750 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 12751 12752 /* 12753 * On-stack replacement has happened, and now we've returned from the compiled method. 12754 */ 12755 MterpOnStackReplacement: 12756 #if MTERP_LOGGING 12757 movl rSELF, %eax 12758 movl %eax, OUT_ARG0(%esp) 12759 lea OFF_FP_SHADOWFRAME(rFP), %ecx 12760 movl %ecx, OUT_ARG1(%esp) 12761 movl rINST, OUT_ARG2(%esp) 12762 call SYMBOL(MterpLogOSR) 12763 #endif 12764 movl $1, %eax 12765 jmp MterpDone 12766 12767 /* 12768 * Bail out to reference interpreter. 12769 */ 12770 MterpFallback: 12771 EXPORT_PC 12772 #if MTERP_LOGGING 12773 movl rSELF, %eax 12774 movl %eax, OUT_ARG0(%esp) 12775 lea OFF_FP_SHADOWFRAME(rFP), %ecx 12776 movl %ecx, OUT_ARG1(%esp) 12777 call SYMBOL(MterpLogFallback) 12778 #endif 12779 MterpCommonFallback: 12780 xor %eax, %eax 12781 jmp MterpDone 12782 12783 /* 12784 * On entry: 12785 * uint32_t* rFP (should still be live, pointer to base of vregs) 12786 */ 12787 MterpExceptionReturn: 12788 movl $1, %eax 12789 jmp MterpDone 12790 MterpReturn: 12791 movl OFF_FP_RESULT_REGISTER(rFP), %edx 12792 movl %eax, (%edx) 12793 movl %ecx, 4(%edx) 12794 mov $1, %eax 12795 MterpDone: 12796 /* 12797 * At this point, we expect rPROFILE to be non-zero. If negative, hotness is disabled or we're 12798 * checking for OSR. If greater than zero, we might have unreported hotness to register 12799 * (the difference between the ending rPROFILE and the cached hotness counter). rPROFILE 12800 * should only reach zero immediately after a hotness decrement, and is then reset to either 12801 * a negative special state or the new non-zero countdown value. 12802 */ 12803 cmpw $0, rPROFILE 12804 jle MRestoreFrame # if > 0, we may have some counts to report. 12805 12806 movl %eax, rINST # stash return value 12807 /* Report cached hotness counts */ 12808 movl OFF_FP_METHOD(rFP), %eax 12809 movl %eax, OUT_ARG0(%esp) 12810 leal OFF_FP_SHADOWFRAME(rFP), %ecx 12811 movl %ecx, OUT_ARG1(%esp) 12812 movl rSELF, %eax 12813 movl %eax, OUT_ARG2(%esp) 12814 call SYMBOL(MterpAddHotnessBatch) # (method, shadow_frame, self) 12815 movl rINST, %eax # restore return value 12816 12817 /* pop up frame */ 12818 MRestoreFrame: 12819 addl $FRAME_SIZE, %esp 12820 .cfi_adjust_cfa_offset -FRAME_SIZE 12821 12822 /* Restore callee save register */ 12823 POP %ebx 12824 POP %esi 12825 POP %edi 12826 POP %ebp 12827 ret 12828 .cfi_endproc 12829 SIZE(ExecuteMterpImpl,ExecuteMterpImpl) 12830 12831