1 /*
   2  * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "interpreter/interpreter.hpp"
  27 #include "interpreter/interpreterRuntime.hpp"
  28 #include "interpreter/templateTable.hpp"
  29 #include "memory/universe.inline.hpp"
  30 #include "oops/methodDataOop.hpp"
  31 #include "oops/objArrayKlass.hpp"
  32 #include "oops/oop.inline.hpp"
  33 #include "prims/methodHandles.hpp"
  34 #include "runtime/sharedRuntime.hpp"
  35 #include "runtime/stubRoutines.hpp"
  36 #include "runtime/synchronizer.hpp"
  37 
  38 #ifndef CC_INTERP
  39 #define __ _masm->
  40 
  41 //----------------------------------------------------------------------------------------------------
  42 // Platform-dependent initialization
  43 
  44 void TemplateTable::pd_initialize() {
  45   // No i486 specific initialization
  46 }
  47 
  48 //----------------------------------------------------------------------------------------------------
  49 // Address computation
  50 
  51 // local variables
  52 static inline Address iaddress(int n)            {
  53   return Address(rdi, Interpreter::local_offset_in_bytes(n));
  54 }
  55 
  56 static inline Address laddress(int n)            { return iaddress(n + 1); }
  57 static inline Address haddress(int n)            { return iaddress(n + 0); }
  58 static inline Address faddress(int n)            { return iaddress(n); }
  59 static inline Address daddress(int n)            { return laddress(n); }
  60 static inline Address aaddress(int n)            { return iaddress(n); }
  61 
  62 static inline Address iaddress(Register r)       {
  63   return Address(rdi, r, Interpreter::stackElementScale());
  64 }
  65 static inline Address laddress(Register r)       {
  66   return Address(rdi, r, Interpreter::stackElementScale(), Interpreter::local_offset_in_bytes(1));
  67 }
  68 static inline Address haddress(Register r)       {
  69   return Address(rdi, r, Interpreter::stackElementScale(), Interpreter::local_offset_in_bytes(0));
  70 }
  71 
  72 static inline Address faddress(Register r)       { return iaddress(r); }
  73 static inline Address daddress(Register r)       { return laddress(r); }
  74 static inline Address aaddress(Register r)       { return iaddress(r); }
  75 
  76 // expression stack
  77 // (Note: Must not use symmetric equivalents at_rsp_m1/2 since they store
  78 // data beyond the rsp which is potentially unsafe in an MT environment;
  79 // an interrupt may overwrite that data.)
  80 static inline Address at_rsp   () {
  81   return Address(rsp, 0);
  82 }
  83 
  84 // At top of Java expression stack which may be different than rsp().  It
  85 // isn't for category 1 objects.
  86 static inline Address at_tos   () {
  87   Address tos = Address(rsp,  Interpreter::expr_offset_in_bytes(0));
  88   return tos;
  89 }
  90 
  91 static inline Address at_tos_p1() {
  92   return Address(rsp,  Interpreter::expr_offset_in_bytes(1));
  93 }
  94 
  95 static inline Address at_tos_p2() {
  96   return Address(rsp,  Interpreter::expr_offset_in_bytes(2));
  97 }
  98 
  99 // Condition conversion
 100 static Assembler::Condition j_not(TemplateTable::Condition cc) {
 101   switch (cc) {
 102     case TemplateTable::equal        : return Assembler::notEqual;
 103     case TemplateTable::not_equal    : return Assembler::equal;
 104     case TemplateTable::less         : return Assembler::greaterEqual;
 105     case TemplateTable::less_equal   : return Assembler::greater;
 106     case TemplateTable::greater      : return Assembler::lessEqual;
 107     case TemplateTable::greater_equal: return Assembler::less;
 108   }
 109   ShouldNotReachHere();
 110   return Assembler::zero;
 111 }
 112 
 113 
 114 //----------------------------------------------------------------------------------------------------
 115 // Miscelaneous helper routines
 116 
 117 // Store an oop (or NULL) at the address described by obj.
 118 // If val == noreg this means store a NULL
 119 
 120 static void do_oop_store(InterpreterMacroAssembler* _masm,
 121                          Address obj,
 122                          Register val,
 123                          BarrierSet::Name barrier,
 124                          bool precise) {
 125   assert(val == noreg || val == rax, "parameter is just for looks");
 126   switch (barrier) {
 127 #ifndef SERIALGC
 128     case BarrierSet::G1SATBCT:
 129     case BarrierSet::G1SATBCTLogging:
 130       {
 131         // flatten object address if needed
 132         // We do it regardless of precise because we need the registers
 133         if (obj.index() == noreg && obj.disp() == 0) {
 134           if (obj.base() != rdx) {
 135             __ movl(rdx, obj.base());
 136           }
 137         } else {
 138           __ leal(rdx, obj);
 139         }
 140         __ get_thread(rcx);
 141         __ save_bcp();
 142         __ g1_write_barrier_pre(rdx, rcx, rsi, rbx, val != noreg);
 143 
 144         // Do the actual store
 145         // noreg means NULL
 146         if (val == noreg) {
 147           __ movptr(Address(rdx, 0), NULL_WORD);
 148           // No post barrier for NULL
 149         } else {
 150           __ movl(Address(rdx, 0), val);
 151           __ g1_write_barrier_post(rdx, rax, rcx, rbx, rsi);
 152         }
 153         __ restore_bcp();
 154 
 155       }
 156       break;
 157 #endif // SERIALGC
 158     case BarrierSet::CardTableModRef:
 159     case BarrierSet::CardTableExtension:
 160       {
 161         if (val == noreg) {
 162           __ movptr(obj, NULL_WORD);
 163         } else {
 164           __ movl(obj, val);
 165           // flatten object address if needed
 166           if (!precise || (obj.index() == noreg && obj.disp() == 0)) {
 167             __ store_check(obj.base());
 168           } else {
 169             __ leal(rdx, obj);
 170             __ store_check(rdx);
 171           }
 172         }
 173       }
 174       break;
 175     case BarrierSet::ModRef:
 176     case BarrierSet::Other:
 177       if (val == noreg) {
 178         __ movptr(obj, NULL_WORD);
 179       } else {
 180         __ movl(obj, val);
 181       }
 182       break;
 183     default      :
 184       ShouldNotReachHere();
 185 
 186   }
 187 }
 188 
 189 Address TemplateTable::at_bcp(int offset) {
 190   assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
 191   return Address(rsi, offset);
 192 }
 193 
 194 
 195 void TemplateTable::patch_bytecode(Bytecodes::Code bytecode, Register bc,
 196                                    Register scratch,
 197                                    bool load_bc_into_scratch/*=true*/) {
 198 
 199   if (!RewriteBytecodes) return;
 200   // the pair bytecodes have already done the load.
 201   if (load_bc_into_scratch) {
 202     __ movl(bc, bytecode);
 203   }
 204   Label patch_done;
 205   if (JvmtiExport::can_post_breakpoint()) {
 206     Label fast_patch;
 207     // if a breakpoint is present we can't rewrite the stream directly
 208     __ movzbl(scratch, at_bcp(0));
 209     __ cmpl(scratch, Bytecodes::_breakpoint);
 210     __ jcc(Assembler::notEqual, fast_patch);
 211     __ get_method(scratch);
 212     // Let breakpoint table handling rewrite to quicker bytecode
 213     __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::set_original_bytecode_at), scratch, rsi, bc);
 214 #ifndef ASSERT
 215     __ jmpb(patch_done);
 216 #else
 217     __ jmp(patch_done);
 218 #endif
 219     __ bind(fast_patch);
 220   }
 221 #ifdef ASSERT
 222   Label okay;
 223   __ load_unsigned_byte(scratch, at_bcp(0));
 224   __ cmpl(scratch, (int)Bytecodes::java_code(bytecode));
 225   __ jccb(Assembler::equal, okay);
 226   __ cmpl(scratch, bc);
 227   __ jcc(Assembler::equal, okay);
 228   __ stop("patching the wrong bytecode");
 229   __ bind(okay);
 230 #endif
 231   // patch bytecode
 232   __ movb(at_bcp(0), bc);
 233   __ bind(patch_done);
 234 }
 235 
 236 //----------------------------------------------------------------------------------------------------
 237 // Individual instructions
 238 
 239 void TemplateTable::nop() {
 240   transition(vtos, vtos);
 241   // nothing to do
 242 }
 243 
 244 void TemplateTable::shouldnotreachhere() {
 245   transition(vtos, vtos);
 246   __ stop("shouldnotreachhere bytecode");
 247 }
 248 
 249 
 250 
 251 void TemplateTable::aconst_null() {
 252   transition(vtos, atos);
 253   __ xorptr(rax, rax);
 254 }
 255 
 256 
 257 void TemplateTable::iconst(int value) {
 258   transition(vtos, itos);
 259   if (value == 0) {
 260     __ xorptr(rax, rax);
 261   } else {
 262     __ movptr(rax, value);
 263   }
 264 }
 265 
 266 
 267 void TemplateTable::lconst(int value) {
 268   transition(vtos, ltos);
 269   if (value == 0) {
 270     __ xorptr(rax, rax);
 271   } else {
 272     __ movptr(rax, value);
 273   }
 274   assert(value >= 0, "check this code");
 275   __ xorptr(rdx, rdx);
 276 }
 277 
 278 
 279 void TemplateTable::fconst(int value) {
 280   transition(vtos, ftos);
 281          if (value == 0) { __ fldz();
 282   } else if (value == 1) { __ fld1();
 283   } else if (value == 2) { __ fld1(); __ fld1(); __ faddp(); // should do a better solution here
 284   } else                 { ShouldNotReachHere();
 285   }
 286 }
 287 
 288 
 289 void TemplateTable::dconst(int value) {
 290   transition(vtos, dtos);
 291          if (value == 0) { __ fldz();
 292   } else if (value == 1) { __ fld1();
 293   } else                 { ShouldNotReachHere();
 294   }
 295 }
 296 
 297 
 298 void TemplateTable::bipush() {
 299   transition(vtos, itos);
 300   __ load_signed_byte(rax, at_bcp(1));
 301 }
 302 
 303 
 304 void TemplateTable::sipush() {
 305   transition(vtos, itos);
 306   __ load_unsigned_short(rax, at_bcp(1));
 307   __ bswapl(rax);
 308   __ sarl(rax, 16);
 309 }
 310 
 311 void TemplateTable::ldc(bool wide) {
 312   transition(vtos, vtos);
 313   Label call_ldc, notFloat, notClass, Done;
 314 
 315   if (wide) {
 316     __ get_unsigned_2_byte_index_at_bcp(rbx, 1);
 317   } else {
 318     __ load_unsigned_byte(rbx, at_bcp(1));
 319   }
 320   __ get_cpool_and_tags(rcx, rax);
 321   const int base_offset = constantPoolOopDesc::header_size() * wordSize;
 322   const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
 323 
 324   // get type
 325   __ xorptr(rdx, rdx);
 326   __ movb(rdx, Address(rax, rbx, Address::times_1, tags_offset));
 327 
 328   // unresolved string - get the resolved string
 329   __ cmpl(rdx, JVM_CONSTANT_UnresolvedString);
 330   __ jccb(Assembler::equal, call_ldc);
 331 
 332   // unresolved class - get the resolved class
 333   __ cmpl(rdx, JVM_CONSTANT_UnresolvedClass);
 334   __ jccb(Assembler::equal, call_ldc);
 335 
 336   // unresolved class in error (resolution failed) - call into runtime
 337   // so that the same error from first resolution attempt is thrown.
 338   __ cmpl(rdx, JVM_CONSTANT_UnresolvedClassInError);
 339   __ jccb(Assembler::equal, call_ldc);
 340 
 341   // resolved class - need to call vm to get java mirror of the class
 342   __ cmpl(rdx, JVM_CONSTANT_Class);
 343   __ jcc(Assembler::notEqual, notClass);
 344 
 345   __ bind(call_ldc);
 346   __ movl(rcx, wide);
 347   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::ldc), rcx);
 348   __ push(atos);
 349   __ jmp(Done);
 350 
 351   __ bind(notClass);
 352   __ cmpl(rdx, JVM_CONSTANT_Float);
 353   __ jccb(Assembler::notEqual, notFloat);
 354   // ftos
 355   __ fld_s(    Address(rcx, rbx, Address::times_ptr, base_offset));
 356   __ push(ftos);
 357   __ jmp(Done);
 358 
 359   __ bind(notFloat);
 360 #ifdef ASSERT
 361   { Label L;
 362     __ cmpl(rdx, JVM_CONSTANT_Integer);
 363     __ jcc(Assembler::equal, L);
 364     __ cmpl(rdx, JVM_CONSTANT_String);
 365     __ jcc(Assembler::equal, L);
 366     __ stop("unexpected tag type in ldc");
 367     __ bind(L);
 368   }
 369 #endif
 370   Label isOop;
 371   // atos and itos
 372   // String is only oop type we will see here
 373   __ cmpl(rdx, JVM_CONSTANT_String);
 374   __ jccb(Assembler::equal, isOop);
 375   __ movl(rax, Address(rcx, rbx, Address::times_ptr, base_offset));
 376   __ push(itos);
 377   __ jmp(Done);
 378   __ bind(isOop);
 379   __ movptr(rax, Address(rcx, rbx, Address::times_ptr, base_offset));
 380   __ push(atos);
 381 
 382   if (VerifyOops) {
 383     __ verify_oop(rax);
 384   }
 385   __ bind(Done);
 386 }
 387 
 388 // Fast path for caching oop constants.
 389 // %%% We should use this to handle Class and String constants also.
 390 // %%% It will simplify the ldc/primitive path considerably.
 391 void TemplateTable::fast_aldc(bool wide) {
 392   transition(vtos, atos);
 393 
 394   if (!EnableMethodHandles) {
 395     // We should not encounter this bytecode if !EnableMethodHandles.
 396     // The verifier will stop it.  However, if we get past the verifier,
 397     // this will stop the thread in a reasonable way, without crashing the JVM.
 398     __ call_VM(noreg, CAST_FROM_FN_PTR(address,
 399                      InterpreterRuntime::throw_IncompatibleClassChangeError));
 400     // the call_VM checks for exception, so we should never return here.
 401     __ should_not_reach_here();
 402     return;
 403   }
 404 
 405   const Register cache = rcx;
 406   const Register index = rdx;
 407 
 408   resolve_cache_and_index(f1_oop, rax, cache, index, wide ? sizeof(u2) : sizeof(u1));
 409   if (VerifyOops) {
 410     __ verify_oop(rax);
 411   }
 412 }
 413 
 414 void TemplateTable::ldc2_w() {
 415   transition(vtos, vtos);
 416   Label Long, Done;
 417   __ get_unsigned_2_byte_index_at_bcp(rbx, 1);
 418 
 419   __ get_cpool_and_tags(rcx, rax);
 420   const int base_offset = constantPoolOopDesc::header_size() * wordSize;
 421   const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
 422 
 423   // get type
 424   __ cmpb(Address(rax, rbx, Address::times_1, tags_offset), JVM_CONSTANT_Double);
 425   __ jccb(Assembler::notEqual, Long);
 426   // dtos
 427   __ fld_d(    Address(rcx, rbx, Address::times_ptr, base_offset));
 428   __ push(dtos);
 429   __ jmpb(Done);
 430 
 431   __ bind(Long);
 432   // ltos
 433   __ movptr(rax, Address(rcx, rbx, Address::times_ptr, base_offset + 0 * wordSize));
 434   NOT_LP64(__ movptr(rdx, Address(rcx, rbx, Address::times_ptr, base_offset + 1 * wordSize)));
 435 
 436   __ push(ltos);
 437 
 438   __ bind(Done);
 439 }
 440 
 441 
 442 void TemplateTable::locals_index(Register reg, int offset) {
 443   __ load_unsigned_byte(reg, at_bcp(offset));
 444   __ negptr(reg);
 445 }
 446 
 447 
 448 void TemplateTable::iload() {
 449   transition(vtos, itos);
 450   if (RewriteFrequentPairs) {
 451     Label rewrite, done;
 452 
 453     // get next byte
 454     __ load_unsigned_byte(rbx, at_bcp(Bytecodes::length_for(Bytecodes::_iload)));
 455     // if _iload, wait to rewrite to iload2.  We only want to rewrite the
 456     // last two iloads in a pair.  Comparing against fast_iload means that
 457     // the next bytecode is neither an iload or a caload, and therefore
 458     // an iload pair.
 459     __ cmpl(rbx, Bytecodes::_iload);
 460     __ jcc(Assembler::equal, done);
 461 
 462     __ cmpl(rbx, Bytecodes::_fast_iload);
 463     __ movl(rcx, Bytecodes::_fast_iload2);
 464     __ jccb(Assembler::equal, rewrite);
 465 
 466     // if _caload, rewrite to fast_icaload
 467     __ cmpl(rbx, Bytecodes::_caload);
 468     __ movl(rcx, Bytecodes::_fast_icaload);
 469     __ jccb(Assembler::equal, rewrite);
 470 
 471     // rewrite so iload doesn't check again.
 472     __ movl(rcx, Bytecodes::_fast_iload);
 473 
 474     // rewrite
 475     // rcx: fast bytecode
 476     __ bind(rewrite);
 477     patch_bytecode(Bytecodes::_iload, rcx, rbx, false);
 478     __ bind(done);
 479   }
 480 
 481   // Get the local value into tos
 482   locals_index(rbx);
 483   __ movl(rax, iaddress(rbx));
 484 }
 485 
 486 
 487 void TemplateTable::fast_iload2() {
 488   transition(vtos, itos);
 489   locals_index(rbx);
 490   __ movl(rax, iaddress(rbx));
 491   __ push(itos);
 492   locals_index(rbx, 3);
 493   __ movl(rax, iaddress(rbx));
 494 }
 495 
 496 void TemplateTable::fast_iload() {
 497   transition(vtos, itos);
 498   locals_index(rbx);
 499   __ movl(rax, iaddress(rbx));
 500 }
 501 
 502 
 503 void TemplateTable::lload() {
 504   transition(vtos, ltos);
 505   locals_index(rbx);
 506   __ movptr(rax, laddress(rbx));
 507   NOT_LP64(__ movl(rdx, haddress(rbx)));
 508 }
 509 
 510 
 511 void TemplateTable::fload() {
 512   transition(vtos, ftos);
 513   locals_index(rbx);
 514   __ fld_s(faddress(rbx));
 515 }
 516 
 517 
 518 void TemplateTable::dload() {
 519   transition(vtos, dtos);
 520   locals_index(rbx);
 521   __ fld_d(daddress(rbx));
 522 }
 523 
 524 
 525 void TemplateTable::aload() {
 526   transition(vtos, atos);
 527   locals_index(rbx);
 528   __ movptr(rax, aaddress(rbx));
 529 }
 530 
 531 
 532 void TemplateTable::locals_index_wide(Register reg) {
 533   __ movl(reg, at_bcp(2));
 534   __ bswapl(reg);
 535   __ shrl(reg, 16);
 536   __ negptr(reg);
 537 }
 538 
 539 
 540 void TemplateTable::wide_iload() {
 541   transition(vtos, itos);
 542   locals_index_wide(rbx);
 543   __ movl(rax, iaddress(rbx));
 544 }
 545 
 546 
 547 void TemplateTable::wide_lload() {
 548   transition(vtos, ltos);
 549   locals_index_wide(rbx);
 550   __ movptr(rax, laddress(rbx));
 551   NOT_LP64(__ movl(rdx, haddress(rbx)));
 552 }
 553 
 554 
 555 void TemplateTable::wide_fload() {
 556   transition(vtos, ftos);
 557   locals_index_wide(rbx);
 558   __ fld_s(faddress(rbx));
 559 }
 560 
 561 
 562 void TemplateTable::wide_dload() {
 563   transition(vtos, dtos);
 564   locals_index_wide(rbx);
 565   __ fld_d(daddress(rbx));
 566 }
 567 
 568 
 569 void TemplateTable::wide_aload() {
 570   transition(vtos, atos);
 571   locals_index_wide(rbx);
 572   __ movptr(rax, aaddress(rbx));
 573 }
 574 
 575 void TemplateTable::index_check(Register array, Register index) {
 576   // Pop ptr into array
 577   __ pop_ptr(array);
 578   index_check_without_pop(array, index);
 579 }
 580 
 581 void TemplateTable::index_check_without_pop(Register array, Register index) {
 582   // destroys rbx,
 583   // check array
 584   __ null_check(array, arrayOopDesc::length_offset_in_bytes());
 585   LP64_ONLY(__ movslq(index, index));
 586   // check index
 587   __ cmpl(index, Address(array, arrayOopDesc::length_offset_in_bytes()));
 588   if (index != rbx) {
 589     // ??? convention: move aberrant index into rbx, for exception message
 590     assert(rbx != array, "different registers");
 591     __ mov(rbx, index);
 592   }
 593   __ jump_cc(Assembler::aboveEqual,
 594              ExternalAddress(Interpreter::_throw_ArrayIndexOutOfBoundsException_entry));
 595 }
 596 
 597 
 598 void TemplateTable::iaload() {
 599   transition(itos, itos);
 600   // rdx: array
 601   index_check(rdx, rax);  // kills rbx,
 602   // rax,: index
 603   __ movl(rax, Address(rdx, rax, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_INT)));
 604 }
 605 
 606 
 607 void TemplateTable::laload() {
 608   transition(itos, ltos);
 609   // rax,: index
 610   // rdx: array
 611   index_check(rdx, rax);
 612   __ mov(rbx, rax);
 613   // rbx,: index
 614   __ movptr(rax, Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize));
 615   NOT_LP64(__ movl(rdx, Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 1 * wordSize)));
 616 }
 617 
 618 
 619 void TemplateTable::faload() {
 620   transition(itos, ftos);
 621   // rdx: array
 622   index_check(rdx, rax);  // kills rbx,
 623   // rax,: index
 624   __ fld_s(Address(rdx, rax, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_FLOAT)));
 625 }
 626 
 627 
 628 void TemplateTable::daload() {
 629   transition(itos, dtos);
 630   // rdx: array
 631   index_check(rdx, rax);  // kills rbx,
 632   // rax,: index
 633   __ fld_d(Address(rdx, rax, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_DOUBLE)));
 634 }
 635 
 636 
 637 void TemplateTable::aaload() {
 638   transition(itos, atos);
 639   // rdx: array
 640   index_check(rdx, rax);  // kills rbx,
 641   // rax,: index
 642   __ movptr(rax, Address(rdx, rax, Address::times_ptr, arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
 643 }
 644 
 645 
 646 void TemplateTable::baload() {
 647   transition(itos, itos);
 648   // rdx: array
 649   index_check(rdx, rax);  // kills rbx,
 650   // rax,: index
 651   // can do better code for P5 - fix this at some point
 652   __ load_signed_byte(rbx, Address(rdx, rax, Address::times_1, arrayOopDesc::base_offset_in_bytes(T_BYTE)));
 653   __ mov(rax, rbx);
 654 }
 655 
 656 
 657 void TemplateTable::caload() {
 658   transition(itos, itos);
 659   // rdx: array
 660   index_check(rdx, rax);  // kills rbx,
 661   // rax,: index
 662   // can do better code for P5 - may want to improve this at some point
 663   __ load_unsigned_short(rbx, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)));
 664   __ mov(rax, rbx);
 665 }
 666 
 667 // iload followed by caload frequent pair
 668 void TemplateTable::fast_icaload() {
 669   transition(vtos, itos);
 670   // load index out of locals
 671   locals_index(rbx);
 672   __ movl(rax, iaddress(rbx));
 673 
 674   // rdx: array
 675   index_check(rdx, rax);
 676   // rax,: index
 677   __ load_unsigned_short(rbx, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)));
 678   __ mov(rax, rbx);
 679 }
 680 
 681 void TemplateTable::saload() {
 682   transition(itos, itos);
 683   // rdx: array
 684   index_check(rdx, rax);  // kills rbx,
 685   // rax,: index
 686   // can do better code for P5 - may want to improve this at some point
 687   __ load_signed_short(rbx, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_SHORT)));
 688   __ mov(rax, rbx);
 689 }
 690 
 691 
 692 void TemplateTable::iload(int n) {
 693   transition(vtos, itos);
 694   __ movl(rax, iaddress(n));
 695 }
 696 
 697 
 698 void TemplateTable::lload(int n) {
 699   transition(vtos, ltos);
 700   __ movptr(rax, laddress(n));
 701   NOT_LP64(__ movptr(rdx, haddress(n)));
 702 }
 703 
 704 
 705 void TemplateTable::fload(int n) {
 706   transition(vtos, ftos);
 707   __ fld_s(faddress(n));
 708 }
 709 
 710 
 711 void TemplateTable::dload(int n) {
 712   transition(vtos, dtos);
 713   __ fld_d(daddress(n));
 714 }
 715 
 716 
 717 void TemplateTable::aload(int n) {
 718   transition(vtos, atos);
 719   __ movptr(rax, aaddress(n));
 720 }
 721 
 722 
 723 void TemplateTable::aload_0() {
 724   transition(vtos, atos);
 725   // According to bytecode histograms, the pairs:
 726   //
 727   // _aload_0, _fast_igetfield
 728   // _aload_0, _fast_agetfield
 729   // _aload_0, _fast_fgetfield
 730   //
 731   // occur frequently. If RewriteFrequentPairs is set, the (slow) _aload_0
 732   // bytecode checks if the next bytecode is either _fast_igetfield,
 733   // _fast_agetfield or _fast_fgetfield and then rewrites the
 734   // current bytecode into a pair bytecode; otherwise it rewrites the current
 735   // bytecode into _fast_aload_0 that doesn't do the pair check anymore.
 736   //
 737   // Note: If the next bytecode is _getfield, the rewrite must be delayed,
 738   //       otherwise we may miss an opportunity for a pair.
 739   //
 740   // Also rewrite frequent pairs
 741   //   aload_0, aload_1
 742   //   aload_0, iload_1
 743   // These bytecodes with a small amount of code are most profitable to rewrite
 744   if (RewriteFrequentPairs) {
 745     Label rewrite, done;
 746     // get next byte
 747     __ load_unsigned_byte(rbx, at_bcp(Bytecodes::length_for(Bytecodes::_aload_0)));
 748 
 749     // do actual aload_0
 750     aload(0);
 751 
 752     // if _getfield then wait with rewrite
 753     __ cmpl(rbx, Bytecodes::_getfield);
 754     __ jcc(Assembler::equal, done);
 755 
 756     // if _igetfield then reqrite to _fast_iaccess_0
 757     assert(Bytecodes::java_code(Bytecodes::_fast_iaccess_0) == Bytecodes::_aload_0, "fix bytecode definition");
 758     __ cmpl(rbx, Bytecodes::_fast_igetfield);
 759     __ movl(rcx, Bytecodes::_fast_iaccess_0);
 760     __ jccb(Assembler::equal, rewrite);
 761 
 762     // if _agetfield then reqrite to _fast_aaccess_0
 763     assert(Bytecodes::java_code(Bytecodes::_fast_aaccess_0) == Bytecodes::_aload_0, "fix bytecode definition");
 764     __ cmpl(rbx, Bytecodes::_fast_agetfield);
 765     __ movl(rcx, Bytecodes::_fast_aaccess_0);
 766     __ jccb(Assembler::equal, rewrite);
 767 
 768     // if _fgetfield then reqrite to _fast_faccess_0
 769     assert(Bytecodes::java_code(Bytecodes::_fast_faccess_0) == Bytecodes::_aload_0, "fix bytecode definition");
 770     __ cmpl(rbx, Bytecodes::_fast_fgetfield);
 771     __ movl(rcx, Bytecodes::_fast_faccess_0);
 772     __ jccb(Assembler::equal, rewrite);
 773 
 774     // else rewrite to _fast_aload0
 775     assert(Bytecodes::java_code(Bytecodes::_fast_aload_0) == Bytecodes::_aload_0, "fix bytecode definition");
 776     __ movl(rcx, Bytecodes::_fast_aload_0);
 777 
 778     // rewrite
 779     // rcx: fast bytecode
 780     __ bind(rewrite);
 781     patch_bytecode(Bytecodes::_aload_0, rcx, rbx, false);
 782 
 783     __ bind(done);
 784   } else {
 785     aload(0);
 786   }
 787 }
 788 
 789 void TemplateTable::istore() {
 790   transition(itos, vtos);
 791   locals_index(rbx);
 792   __ movl(iaddress(rbx), rax);
 793 }
 794 
 795 
 796 void TemplateTable::lstore() {
 797   transition(ltos, vtos);
 798   locals_index(rbx);
 799   __ movptr(laddress(rbx), rax);
 800   NOT_LP64(__ movptr(haddress(rbx), rdx));
 801 }
 802 
 803 
 804 void TemplateTable::fstore() {
 805   transition(ftos, vtos);
 806   locals_index(rbx);
 807   __ fstp_s(faddress(rbx));
 808 }
 809 
 810 
 811 void TemplateTable::dstore() {
 812   transition(dtos, vtos);
 813   locals_index(rbx);
 814   __ fstp_d(daddress(rbx));
 815 }
 816 
 817 
 818 void TemplateTable::astore() {
 819   transition(vtos, vtos);
 820   __ pop_ptr(rax);
 821   locals_index(rbx);
 822   __ movptr(aaddress(rbx), rax);
 823 }
 824 
 825 
 826 void TemplateTable::wide_istore() {
 827   transition(vtos, vtos);
 828   __ pop_i(rax);
 829   locals_index_wide(rbx);
 830   __ movl(iaddress(rbx), rax);
 831 }
 832 
 833 
 834 void TemplateTable::wide_lstore() {
 835   transition(vtos, vtos);
 836   __ pop_l(rax, rdx);
 837   locals_index_wide(rbx);
 838   __ movptr(laddress(rbx), rax);
 839   NOT_LP64(__ movl(haddress(rbx), rdx));
 840 }
 841 
 842 
 843 void TemplateTable::wide_fstore() {
 844   wide_istore();
 845 }
 846 
 847 
 848 void TemplateTable::wide_dstore() {
 849   wide_lstore();
 850 }
 851 
 852 
 853 void TemplateTable::wide_astore() {
 854   transition(vtos, vtos);
 855   __ pop_ptr(rax);
 856   locals_index_wide(rbx);
 857   __ movptr(aaddress(rbx), rax);
 858 }
 859 
 860 
 861 void TemplateTable::iastore() {
 862   transition(itos, vtos);
 863   __ pop_i(rbx);
 864   // rax,: value
 865   // rdx: array
 866   index_check(rdx, rbx);  // prefer index in rbx,
 867   // rbx,: index
 868   __ movl(Address(rdx, rbx, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_INT)), rax);
 869 }
 870 
 871 
 872 void TemplateTable::lastore() {
 873   transition(ltos, vtos);
 874   __ pop_i(rbx);
 875   // rax,: low(value)
 876   // rcx: array
 877   // rdx: high(value)
 878   index_check(rcx, rbx);  // prefer index in rbx,
 879   // rbx,: index
 880   __ movptr(Address(rcx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize), rax);
 881   NOT_LP64(__ movl(Address(rcx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 1 * wordSize), rdx));
 882 }
 883 
 884 
 885 void TemplateTable::fastore() {
 886   transition(ftos, vtos);
 887   __ pop_i(rbx);
 888   // rdx: array
 889   // st0: value
 890   index_check(rdx, rbx);  // prefer index in rbx,
 891   // rbx,: index
 892   __ fstp_s(Address(rdx, rbx, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_FLOAT)));
 893 }
 894 
 895 
 896 void TemplateTable::dastore() {
 897   transition(dtos, vtos);
 898   __ pop_i(rbx);
 899   // rdx: array
 900   // st0: value
 901   index_check(rdx, rbx);  // prefer index in rbx,
 902   // rbx,: index
 903   __ fstp_d(Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_DOUBLE)));
 904 }
 905 
 906 
 907 void TemplateTable::aastore() {
 908   Label is_null, ok_is_subtype, done;
 909   transition(vtos, vtos);
 910   // stack: ..., array, index, value
 911   __ movptr(rax, at_tos());     // Value
 912   __ movl(rcx, at_tos_p1());  // Index
 913   __ movptr(rdx, at_tos_p2());  // Array
 914 
 915   Address element_address(rdx, rcx, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_OBJECT));
 916   index_check_without_pop(rdx, rcx);      // kills rbx,
 917   // do array store check - check for NULL value first
 918   __ testptr(rax, rax);
 919   __ jcc(Assembler::zero, is_null);
 920 
 921   // Move subklass into EBX
 922   __ movptr(rbx, Address(rax, oopDesc::klass_offset_in_bytes()));
 923   // Move superklass into EAX
 924   __ movptr(rax, Address(rdx, oopDesc::klass_offset_in_bytes()));
 925   __ movptr(rax, Address(rax, sizeof(oopDesc) + objArrayKlass::element_klass_offset_in_bytes()));
 926   // Compress array+index*wordSize+12 into a single register.  Frees ECX.
 927   __ lea(rdx, element_address);
 928 
 929   // Generate subtype check.  Blows ECX.  Resets EDI to locals.
 930   // Superklass in EAX.  Subklass in EBX.
 931   __ gen_subtype_check( rbx, ok_is_subtype );
 932 
 933   // Come here on failure
 934   // object is at TOS
 935   __ jump(ExternalAddress(Interpreter::_throw_ArrayStoreException_entry));
 936 
 937   // Come here on success
 938   __ bind(ok_is_subtype);
 939 
 940   // Get the value to store
 941   __ movptr(rax, at_rsp());
 942   // and store it with appropriate barrier
 943   do_oop_store(_masm, Address(rdx, 0), rax, _bs->kind(), true);
 944 
 945   __ jmp(done);
 946 
 947   // Have a NULL in EAX, EDX=array, ECX=index.  Store NULL at ary[idx]
 948   __ bind(is_null);
 949   __ profile_null_seen(rbx);
 950 
 951   // Store NULL, (noreg means NULL to do_oop_store)
 952   do_oop_store(_masm, element_address, noreg, _bs->kind(), true);
 953 
 954   // Pop stack arguments
 955   __ bind(done);
 956   __ addptr(rsp, 3 * Interpreter::stackElementSize);
 957 }
 958 
 959 
 960 void TemplateTable::bastore() {
 961   transition(itos, vtos);
 962   __ pop_i(rbx);
 963   // rax,: value
 964   // rdx: array
 965   index_check(rdx, rbx);  // prefer index in rbx,
 966   // rbx,: index
 967   __ movb(Address(rdx, rbx, Address::times_1, arrayOopDesc::base_offset_in_bytes(T_BYTE)), rax);
 968 }
 969 
 970 
 971 void TemplateTable::castore() {
 972   transition(itos, vtos);
 973   __ pop_i(rbx);
 974   // rax,: value
 975   // rdx: array
 976   index_check(rdx, rbx);  // prefer index in rbx,
 977   // rbx,: index
 978   __ movw(Address(rdx, rbx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)), rax);
 979 }
 980 
 981 
 982 void TemplateTable::sastore() {
 983   castore();
 984 }
 985 
 986 
 987 void TemplateTable::istore(int n) {
 988   transition(itos, vtos);
 989   __ movl(iaddress(n), rax);
 990 }
 991 
 992 
 993 void TemplateTable::lstore(int n) {
 994   transition(ltos, vtos);
 995   __ movptr(laddress(n), rax);
 996   NOT_LP64(__ movptr(haddress(n), rdx));
 997 }
 998 
 999 
1000 void TemplateTable::fstore(int n) {
1001   transition(ftos, vtos);
1002   __ fstp_s(faddress(n));
1003 }
1004 
1005 
1006 void TemplateTable::dstore(int n) {
1007   transition(dtos, vtos);
1008   __ fstp_d(daddress(n));
1009 }
1010 
1011 
1012 void TemplateTable::astore(int n) {
1013   transition(vtos, vtos);
1014   __ pop_ptr(rax);
1015   __ movptr(aaddress(n), rax);
1016 }
1017 
1018 
1019 void TemplateTable::pop() {
1020   transition(vtos, vtos);
1021   __ addptr(rsp, Interpreter::stackElementSize);
1022 }
1023 
1024 
1025 void TemplateTable::pop2() {
1026   transition(vtos, vtos);
1027   __ addptr(rsp, 2*Interpreter::stackElementSize);
1028 }
1029 
1030 
1031 void TemplateTable::dup() {
1032   transition(vtos, vtos);
1033   // stack: ..., a
1034   __ load_ptr(0, rax);
1035   __ push_ptr(rax);
1036   // stack: ..., a, a
1037 }
1038 
1039 
1040 void TemplateTable::dup_x1() {
1041   transition(vtos, vtos);
1042   // stack: ..., a, b
1043   __ load_ptr( 0, rax);  // load b
1044   __ load_ptr( 1, rcx);  // load a
1045   __ store_ptr(1, rax);  // store b
1046   __ store_ptr(0, rcx);  // store a
1047   __ push_ptr(rax);      // push b
1048   // stack: ..., b, a, b
1049 }
1050 
1051 
1052 void TemplateTable::dup_x2() {
1053   transition(vtos, vtos);
1054   // stack: ..., a, b, c
1055   __ load_ptr( 0, rax);  // load c
1056   __ load_ptr( 2, rcx);  // load a
1057   __ store_ptr(2, rax);  // store c in a
1058   __ push_ptr(rax);      // push c
1059   // stack: ..., c, b, c, c
1060   __ load_ptr( 2, rax);  // load b
1061   __ store_ptr(2, rcx);  // store a in b
1062   // stack: ..., c, a, c, c
1063   __ store_ptr(1, rax);  // store b in c
1064   // stack: ..., c, a, b, c
1065 }
1066 
1067 
1068 void TemplateTable::dup2() {
1069   transition(vtos, vtos);
1070   // stack: ..., a, b
1071   __ load_ptr(1, rax);  // load a
1072   __ push_ptr(rax);     // push a
1073   __ load_ptr(1, rax);  // load b
1074   __ push_ptr(rax);     // push b
1075   // stack: ..., a, b, a, b
1076 }
1077 
1078 
1079 void TemplateTable::dup2_x1() {
1080   transition(vtos, vtos);
1081   // stack: ..., a, b, c
1082   __ load_ptr( 0, rcx);  // load c
1083   __ load_ptr( 1, rax);  // load b
1084   __ push_ptr(rax);      // push b
1085   __ push_ptr(rcx);      // push c
1086   // stack: ..., a, b, c, b, c
1087   __ store_ptr(3, rcx);  // store c in b
1088   // stack: ..., a, c, c, b, c
1089   __ load_ptr( 4, rcx);  // load a
1090   __ store_ptr(2, rcx);  // store a in 2nd c
1091   // stack: ..., a, c, a, b, c
1092   __ store_ptr(4, rax);  // store b in a
1093   // stack: ..., b, c, a, b, c
1094   // stack: ..., b, c, a, b, c
1095 }
1096 
1097 
1098 void TemplateTable::dup2_x2() {
1099   transition(vtos, vtos);
1100   // stack: ..., a, b, c, d
1101   __ load_ptr( 0, rcx);  // load d
1102   __ load_ptr( 1, rax);  // load c
1103   __ push_ptr(rax);      // push c
1104   __ push_ptr(rcx);      // push d
1105   // stack: ..., a, b, c, d, c, d
1106   __ load_ptr( 4, rax);  // load b
1107   __ store_ptr(2, rax);  // store b in d
1108   __ store_ptr(4, rcx);  // store d in b
1109   // stack: ..., a, d, c, b, c, d
1110   __ load_ptr( 5, rcx);  // load a
1111   __ load_ptr( 3, rax);  // load c
1112   __ store_ptr(3, rcx);  // store a in c
1113   __ store_ptr(5, rax);  // store c in a
1114   // stack: ..., c, d, a, b, c, d
1115   // stack: ..., c, d, a, b, c, d
1116 }
1117 
1118 
1119 void TemplateTable::swap() {
1120   transition(vtos, vtos);
1121   // stack: ..., a, b
1122   __ load_ptr( 1, rcx);  // load a
1123   __ load_ptr( 0, rax);  // load b
1124   __ store_ptr(0, rcx);  // store a in b
1125   __ store_ptr(1, rax);  // store b in a
1126   // stack: ..., b, a
1127 }
1128 
1129 
1130 void TemplateTable::iop2(Operation op) {
1131   transition(itos, itos);
1132   switch (op) {
1133     case add  :                   __ pop_i(rdx); __ addl (rax, rdx); break;
1134     case sub  : __ mov(rdx, rax); __ pop_i(rax); __ subl (rax, rdx); break;
1135     case mul  :                   __ pop_i(rdx); __ imull(rax, rdx); break;
1136     case _and :                   __ pop_i(rdx); __ andl (rax, rdx); break;
1137     case _or  :                   __ pop_i(rdx); __ orl  (rax, rdx); break;
1138     case _xor :                   __ pop_i(rdx); __ xorl (rax, rdx); break;
1139     case shl  : __ mov(rcx, rax); __ pop_i(rax); __ shll (rax);      break; // implicit masking of lower 5 bits by Intel shift instr.
1140     case shr  : __ mov(rcx, rax); __ pop_i(rax); __ sarl (rax);      break; // implicit masking of lower 5 bits by Intel shift instr.
1141     case ushr : __ mov(rcx, rax); __ pop_i(rax); __ shrl (rax);      break; // implicit masking of lower 5 bits by Intel shift instr.
1142     default   : ShouldNotReachHere();
1143   }
1144 }
1145 
1146 
1147 void TemplateTable::lop2(Operation op) {
1148   transition(ltos, ltos);
1149   __ pop_l(rbx, rcx);
1150   switch (op) {
1151     case add  : __ addl(rax, rbx); __ adcl(rdx, rcx); break;
1152     case sub  : __ subl(rbx, rax); __ sbbl(rcx, rdx);
1153                 __ mov (rax, rbx); __ mov (rdx, rcx); break;
1154     case _and : __ andl(rax, rbx); __ andl(rdx, rcx); break;
1155     case _or  : __ orl (rax, rbx); __ orl (rdx, rcx); break;
1156     case _xor : __ xorl(rax, rbx); __ xorl(rdx, rcx); break;
1157     default   : ShouldNotReachHere();
1158   }
1159 }
1160 
1161 
1162 void TemplateTable::idiv() {
1163   transition(itos, itos);
1164   __ mov(rcx, rax);
1165   __ pop_i(rax);
1166   // Note: could xor rax, and rcx and compare with (-1 ^ min_int). If
1167   //       they are not equal, one could do a normal division (no correction
1168   //       needed), which may speed up this implementation for the common case.
1169   //       (see also JVM spec., p.243 & p.271)
1170   __ corrected_idivl(rcx);
1171 }
1172 
1173 
1174 void TemplateTable::irem() {
1175   transition(itos, itos);
1176   __ mov(rcx, rax);
1177   __ pop_i(rax);
1178   // Note: could xor rax, and rcx and compare with (-1 ^ min_int). If
1179   //       they are not equal, one could do a normal division (no correction
1180   //       needed), which may speed up this implementation for the common case.
1181   //       (see also JVM spec., p.243 & p.271)
1182   __ corrected_idivl(rcx);
1183   __ mov(rax, rdx);
1184 }
1185 
1186 
1187 void TemplateTable::lmul() {
1188   transition(ltos, ltos);
1189   __ pop_l(rbx, rcx);
1190   __ push(rcx); __ push(rbx);
1191   __ push(rdx); __ push(rax);
1192   __ lmul(2 * wordSize, 0);
1193   __ addptr(rsp, 4 * wordSize);  // take off temporaries
1194 }
1195 
1196 
1197 void TemplateTable::ldiv() {
1198   transition(ltos, ltos);
1199   __ pop_l(rbx, rcx);
1200   __ push(rcx); __ push(rbx);
1201   __ push(rdx); __ push(rax);
1202   // check if y = 0
1203   __ orl(rax, rdx);
1204   __ jump_cc(Assembler::zero,
1205              ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
1206   __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::ldiv));
1207   __ addptr(rsp, 4 * wordSize);  // take off temporaries
1208 }
1209 
1210 
1211 void TemplateTable::lrem() {
1212   transition(ltos, ltos);
1213   __ pop_l(rbx, rcx);
1214   __ push(rcx); __ push(rbx);
1215   __ push(rdx); __ push(rax);
1216   // check if y = 0
1217   __ orl(rax, rdx);
1218   __ jump_cc(Assembler::zero,
1219              ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
1220   __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::lrem));
1221   __ addptr(rsp, 4 * wordSize);
1222 }
1223 
1224 
1225 void TemplateTable::lshl() {
1226   transition(itos, ltos);
1227   __ movl(rcx, rax);                             // get shift count
1228   __ pop_l(rax, rdx);                            // get shift value
1229   __ lshl(rdx, rax);
1230 }
1231 
1232 
1233 void TemplateTable::lshr() {
1234   transition(itos, ltos);
1235   __ mov(rcx, rax);                              // get shift count
1236   __ pop_l(rax, rdx);                            // get shift value
1237   __ lshr(rdx, rax, true);
1238 }
1239 
1240 
1241 void TemplateTable::lushr() {
1242   transition(itos, ltos);
1243   __ mov(rcx, rax);                              // get shift count
1244   __ pop_l(rax, rdx);                            // get shift value
1245   __ lshr(rdx, rax);
1246 }
1247 
1248 
1249 void TemplateTable::fop2(Operation op) {
1250   transition(ftos, ftos);
1251   switch (op) {
1252     case add: __ fadd_s (at_rsp());                break;
1253     case sub: __ fsubr_s(at_rsp());                break;
1254     case mul: __ fmul_s (at_rsp());                break;
1255     case div: __ fdivr_s(at_rsp());                break;
1256     case rem: __ fld_s  (at_rsp()); __ fremr(rax); break;
1257     default : ShouldNotReachHere();
1258   }
1259   __ f2ieee();
1260   __ pop(rax);  // pop float thing off
1261 }
1262 
1263 
1264 void TemplateTable::dop2(Operation op) {
1265   transition(dtos, dtos);
1266 
1267   switch (op) {
1268     case add: __ fadd_d (at_rsp());                break;
1269     case sub: __ fsubr_d(at_rsp());                break;
1270     case mul: {
1271       Label L_strict;
1272       Label L_join;
1273       const Address access_flags      (rcx, methodOopDesc::access_flags_offset());
1274       __ get_method(rcx);
1275       __ movl(rcx, access_flags);
1276       __ testl(rcx, JVM_ACC_STRICT);
1277       __ jccb(Assembler::notZero, L_strict);
1278       __ fmul_d (at_rsp());
1279       __ jmpb(L_join);
1280       __ bind(L_strict);
1281       __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias1()));
1282       __ fmulp();
1283       __ fmul_d (at_rsp());
1284       __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias2()));
1285       __ fmulp();
1286       __ bind(L_join);
1287       break;
1288     }
1289     case div: {
1290       Label L_strict;
1291       Label L_join;
1292       const Address access_flags      (rcx, methodOopDesc::access_flags_offset());
1293       __ get_method(rcx);
1294       __ movl(rcx, access_flags);
1295       __ testl(rcx, JVM_ACC_STRICT);
1296       __ jccb(Assembler::notZero, L_strict);
1297       __ fdivr_d(at_rsp());
1298       __ jmp(L_join);
1299       __ bind(L_strict);
1300       __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias1()));
1301       __ fmul_d (at_rsp());
1302       __ fdivrp();
1303       __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias2()));
1304       __ fmulp();
1305       __ bind(L_join);
1306       break;
1307     }
1308     case rem: __ fld_d  (at_rsp()); __ fremr(rax); break;
1309     default : ShouldNotReachHere();
1310   }
1311   __ d2ieee();
1312   // Pop double precision number from rsp.
1313   __ pop(rax);
1314   __ pop(rdx);
1315 }
1316 
1317 
1318 void TemplateTable::ineg() {
1319   transition(itos, itos);
1320   __ negl(rax);
1321 }
1322 
1323 
1324 void TemplateTable::lneg() {
1325   transition(ltos, ltos);
1326   __ lneg(rdx, rax);
1327 }
1328 
1329 
1330 void TemplateTable::fneg() {
1331   transition(ftos, ftos);
1332   __ fchs();
1333 }
1334 
1335 
1336 void TemplateTable::dneg() {
1337   transition(dtos, dtos);
1338   __ fchs();
1339 }
1340 
1341 
1342 void TemplateTable::iinc() {
1343   transition(vtos, vtos);
1344   __ load_signed_byte(rdx, at_bcp(2));           // get constant
1345   locals_index(rbx);
1346   __ addl(iaddress(rbx), rdx);
1347 }
1348 
1349 
1350 void TemplateTable::wide_iinc() {
1351   transition(vtos, vtos);
1352   __ movl(rdx, at_bcp(4));                       // get constant
1353   locals_index_wide(rbx);
1354   __ bswapl(rdx);                                 // swap bytes & sign-extend constant
1355   __ sarl(rdx, 16);
1356   __ addl(iaddress(rbx), rdx);
1357   // Note: should probably use only one movl to get both
1358   //       the index and the constant -> fix this
1359 }
1360 
1361 
1362 void TemplateTable::convert() {
1363   // Checking
1364 #ifdef ASSERT
1365   { TosState tos_in  = ilgl;
1366     TosState tos_out = ilgl;
1367     switch (bytecode()) {
1368       case Bytecodes::_i2l: // fall through
1369       case Bytecodes::_i2f: // fall through
1370       case Bytecodes::_i2d: // fall through
1371       case Bytecodes::_i2b: // fall through
1372       case Bytecodes::_i2c: // fall through
1373       case Bytecodes::_i2s: tos_in = itos; break;
1374       case Bytecodes::_l2i: // fall through
1375       case Bytecodes::_l2f: // fall through
1376       case Bytecodes::_l2d: tos_in = ltos; break;
1377       case Bytecodes::_f2i: // fall through
1378       case Bytecodes::_f2l: // fall through
1379       case Bytecodes::_f2d: tos_in = ftos; break;
1380       case Bytecodes::_d2i: // fall through
1381       case Bytecodes::_d2l: // fall through
1382       case Bytecodes::_d2f: tos_in = dtos; break;
1383       default             : ShouldNotReachHere();
1384     }
1385     switch (bytecode()) {
1386       case Bytecodes::_l2i: // fall through
1387       case Bytecodes::_f2i: // fall through
1388       case Bytecodes::_d2i: // fall through
1389       case Bytecodes::_i2b: // fall through
1390       case Bytecodes::_i2c: // fall through
1391       case Bytecodes::_i2s: tos_out = itos; break;
1392       case Bytecodes::_i2l: // fall through
1393       case Bytecodes::_f2l: // fall through
1394       case Bytecodes::_d2l: tos_out = ltos; break;
1395       case Bytecodes::_i2f: // fall through
1396       case Bytecodes::_l2f: // fall through
1397       case Bytecodes::_d2f: tos_out = ftos; break;
1398       case Bytecodes::_i2d: // fall through
1399       case Bytecodes::_l2d: // fall through
1400       case Bytecodes::_f2d: tos_out = dtos; break;
1401       default             : ShouldNotReachHere();
1402     }
1403     transition(tos_in, tos_out);
1404   }
1405 #endif // ASSERT
1406 
1407   // Conversion
1408   // (Note: use push(rcx)/pop(rcx) for 1/2-word stack-ptr manipulation)
1409   switch (bytecode()) {
1410     case Bytecodes::_i2l:
1411       __ extend_sign(rdx, rax);
1412       break;
1413     case Bytecodes::_i2f:
1414       __ push(rax);          // store int on tos
1415       __ fild_s(at_rsp());   // load int to ST0
1416       __ f2ieee();           // truncate to float size
1417       __ pop(rcx);           // adjust rsp
1418       break;
1419     case Bytecodes::_i2d:
1420       __ push(rax);          // add one slot for d2ieee()
1421       __ push(rax);          // store int on tos
1422       __ fild_s(at_rsp());   // load int to ST0
1423       __ d2ieee();           // truncate to double size
1424       __ pop(rcx);           // adjust rsp
1425       __ pop(rcx);
1426       break;
1427     case Bytecodes::_i2b:
1428       __ shll(rax, 24);      // truncate upper 24 bits
1429       __ sarl(rax, 24);      // and sign-extend byte
1430       LP64_ONLY(__ movsbl(rax, rax));
1431       break;
1432     case Bytecodes::_i2c:
1433       __ andl(rax, 0xFFFF);  // truncate upper 16 bits
1434       LP64_ONLY(__ movzwl(rax, rax));
1435       break;
1436     case Bytecodes::_i2s:
1437       __ shll(rax, 16);      // truncate upper 16 bits
1438       __ sarl(rax, 16);      // and sign-extend short
1439       LP64_ONLY(__ movswl(rax, rax));
1440       break;
1441     case Bytecodes::_l2i:
1442       /* nothing to do */
1443       break;
1444     case Bytecodes::_l2f:
1445       __ push(rdx);          // store long on tos
1446       __ push(rax);
1447       __ fild_d(at_rsp());   // load long to ST0
1448       __ f2ieee();           // truncate to float size
1449       __ pop(rcx);           // adjust rsp
1450       __ pop(rcx);
1451       break;
1452     case Bytecodes::_l2d:
1453       __ push(rdx);          // store long on tos
1454       __ push(rax);
1455       __ fild_d(at_rsp());   // load long to ST0
1456       __ d2ieee();           // truncate to double size
1457       __ pop(rcx);           // adjust rsp
1458       __ pop(rcx);
1459       break;
1460     case Bytecodes::_f2i:
1461       __ push(rcx);          // reserve space for argument
1462       __ fstp_s(at_rsp());   // pass float argument on stack
1463       __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::f2i), 1);
1464       break;
1465     case Bytecodes::_f2l:
1466       __ push(rcx);          // reserve space for argument
1467       __ fstp_s(at_rsp());   // pass float argument on stack
1468       __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::f2l), 1);
1469       break;
1470     case Bytecodes::_f2d:
1471       /* nothing to do */
1472       break;
1473     case Bytecodes::_d2i:
1474       __ push(rcx);          // reserve space for argument
1475       __ push(rcx);
1476       __ fstp_d(at_rsp());   // pass double argument on stack
1477       __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::d2i), 2);
1478       break;
1479     case Bytecodes::_d2l:
1480       __ push(rcx);          // reserve space for argument
1481       __ push(rcx);
1482       __ fstp_d(at_rsp());   // pass double argument on stack
1483       __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::d2l), 2);
1484       break;
1485     case Bytecodes::_d2f:
1486       __ push(rcx);          // reserve space for f2ieee()
1487       __ f2ieee();           // truncate to float size
1488       __ pop(rcx);           // adjust rsp
1489       break;
1490     default             :
1491       ShouldNotReachHere();
1492   }
1493 }
1494 
1495 
1496 void TemplateTable::lcmp() {
1497   transition(ltos, itos);
1498   // y = rdx:rax
1499   __ pop_l(rbx, rcx);             // get x = rcx:rbx
1500   __ lcmp2int(rcx, rbx, rdx, rax);// rcx := cmp(x, y)
1501   __ mov(rax, rcx);
1502 }
1503 
1504 
1505 void TemplateTable::float_cmp(bool is_float, int unordered_result) {
1506   if (is_float) {
1507     __ fld_s(at_rsp());
1508   } else {
1509     __ fld_d(at_rsp());
1510     __ pop(rdx);
1511   }
1512   __ pop(rcx);
1513   __ fcmp2int(rax, unordered_result < 0);
1514 }
1515 
1516 
1517 void TemplateTable::branch(bool is_jsr, bool is_wide) {
1518   __ get_method(rcx);           // ECX holds method
1519   __ profile_taken_branch(rax,rbx); // EAX holds updated MDP, EBX holds bumped taken count
1520 
1521   const ByteSize be_offset = methodOopDesc::backedge_counter_offset() + InvocationCounter::counter_offset();
1522   const ByteSize inv_offset = methodOopDesc::invocation_counter_offset() + InvocationCounter::counter_offset();
1523   const int method_offset = frame::interpreter_frame_method_offset * wordSize;
1524 
1525   // Load up EDX with the branch displacement
1526   __ movl(rdx, at_bcp(1));
1527   __ bswapl(rdx);
1528   if (!is_wide) __ sarl(rdx, 16);
1529   LP64_ONLY(__ movslq(rdx, rdx));
1530 
1531 
1532   // Handle all the JSR stuff here, then exit.
1533   // It's much shorter and cleaner than intermingling with the
1534   // non-JSR normal-branch stuff occurring below.
1535   if (is_jsr) {
1536     // Pre-load the next target bytecode into EBX
1537     __ load_unsigned_byte(rbx, Address(rsi, rdx, Address::times_1, 0));
1538 
1539     // compute return address as bci in rax,
1540     __ lea(rax, at_bcp((is_wide ? 5 : 3) - in_bytes(constMethodOopDesc::codes_offset())));
1541     __ subptr(rax, Address(rcx, methodOopDesc::const_offset()));
1542     // Adjust the bcp in RSI by the displacement in EDX
1543     __ addptr(rsi, rdx);
1544     // Push return address
1545     __ push_i(rax);
1546     // jsr returns vtos
1547     __ dispatch_only_noverify(vtos);
1548     return;
1549   }
1550 
1551   // Normal (non-jsr) branch handling
1552 
1553   // Adjust the bcp in RSI by the displacement in EDX
1554   __ addptr(rsi, rdx);
1555 
1556   assert(UseLoopCounter || !UseOnStackReplacement, "on-stack-replacement requires loop counters");
1557   Label backedge_counter_overflow;
1558   Label profile_method;
1559   Label dispatch;
1560   if (UseLoopCounter) {
1561     // increment backedge counter for backward branches
1562     // rax,: MDO
1563     // rbx,: MDO bumped taken-count
1564     // rcx: method
1565     // rdx: target offset
1566     // rsi: target bcp
1567     // rdi: locals pointer
1568     __ testl(rdx, rdx);             // check if forward or backward branch
1569     __ jcc(Assembler::positive, dispatch); // count only if backward branch
1570 
1571     if (TieredCompilation) {
1572       Label no_mdo;
1573       int increment = InvocationCounter::count_increment;
1574       int mask = ((1 << Tier0BackedgeNotifyFreqLog) - 1) << InvocationCounter::count_shift;
1575       if (ProfileInterpreter) {
1576         // Are we profiling?
1577         __ movptr(rbx, Address(rcx, in_bytes(methodOopDesc::method_data_offset())));
1578         __ testptr(rbx, rbx);
1579         __ jccb(Assembler::zero, no_mdo);
1580         // Increment the MDO backedge counter
1581         const Address mdo_backedge_counter(rbx, in_bytes(methodDataOopDesc::backedge_counter_offset()) +
1582                                                 in_bytes(InvocationCounter::counter_offset()));
1583         __ increment_mask_and_jump(mdo_backedge_counter, increment, mask,
1584                                    rax, false, Assembler::zero, &backedge_counter_overflow);
1585         __ jmp(dispatch);
1586       }
1587       __ bind(no_mdo);
1588       // Increment backedge counter in methodOop
1589       __ increment_mask_and_jump(Address(rcx, be_offset), increment, mask,
1590                                  rax, false, Assembler::zero, &backedge_counter_overflow);
1591     } else {
1592       // increment counter
1593       __ movl(rax, Address(rcx, be_offset));        // load backedge counter
1594       __ incrementl(rax, InvocationCounter::count_increment); // increment counter
1595       __ movl(Address(rcx, be_offset), rax);        // store counter
1596 
1597       __ movl(rax, Address(rcx, inv_offset));    // load invocation counter
1598       __ andl(rax, InvocationCounter::count_mask_value);     // and the status bits
1599       __ addl(rax, Address(rcx, be_offset));        // add both counters
1600 
1601       if (ProfileInterpreter) {
1602         // Test to see if we should create a method data oop
1603         __ cmp32(rax,
1604                  ExternalAddress((address) &InvocationCounter::InterpreterProfileLimit));
1605         __ jcc(Assembler::less, dispatch);
1606 
1607         // if no method data exists, go to profile method
1608         __ test_method_data_pointer(rax, profile_method);
1609 
1610         if (UseOnStackReplacement) {
1611           // check for overflow against rbx, which is the MDO taken count
1612           __ cmp32(rbx,
1613                    ExternalAddress((address) &InvocationCounter::InterpreterBackwardBranchLimit));
1614           __ jcc(Assembler::below, dispatch);
1615 
1616           // When ProfileInterpreter is on, the backedge_count comes from the
1617           // methodDataOop, which value does not get reset on the call to
1618           // frequency_counter_overflow().  To avoid excessive calls to the overflow
1619           // routine while the method is being compiled, add a second test to make
1620           // sure the overflow function is called only once every overflow_frequency.
1621           const int overflow_frequency = 1024;
1622           __ andptr(rbx, overflow_frequency-1);
1623           __ jcc(Assembler::zero, backedge_counter_overflow);
1624         }
1625       } else {
1626         if (UseOnStackReplacement) {
1627           // check for overflow against rax, which is the sum of the counters
1628           __ cmp32(rax,
1629                    ExternalAddress((address) &InvocationCounter::InterpreterBackwardBranchLimit));
1630           __ jcc(Assembler::aboveEqual, backedge_counter_overflow);
1631 
1632         }
1633       }
1634     }
1635     __ bind(dispatch);
1636   }
1637 
1638   // Pre-load the next target bytecode into EBX
1639   __ load_unsigned_byte(rbx, Address(rsi, 0));
1640 
1641   // continue with the bytecode @ target
1642   // rax,: return bci for jsr's, unused otherwise
1643   // rbx,: target bytecode
1644   // rsi: target bcp
1645   __ dispatch_only(vtos);
1646 
1647   if (UseLoopCounter) {
1648     if (ProfileInterpreter) {
1649       // Out-of-line code to allocate method data oop.
1650       __ bind(profile_method);
1651       __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method), rsi);
1652       __ load_unsigned_byte(rbx, Address(rsi, 0));  // restore target bytecode
1653       __ movptr(rcx, Address(rbp, method_offset));
1654       __ movptr(rcx, Address(rcx, in_bytes(methodOopDesc::method_data_offset())));
1655       __ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), rcx);
1656       __ test_method_data_pointer(rcx, dispatch);
1657       // offset non-null mdp by MDO::data_offset() + IR::profile_method()
1658       __ addptr(rcx, in_bytes(methodDataOopDesc::data_offset()));
1659       __ addptr(rcx, rax);
1660       __ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), rcx);
1661       __ jmp(dispatch);
1662     }
1663 
1664     if (UseOnStackReplacement) {
1665 
1666       // invocation counter overflow
1667       __ bind(backedge_counter_overflow);
1668       __ negptr(rdx);
1669       __ addptr(rdx, rsi);        // branch bcp
1670       call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), rdx);
1671       __ load_unsigned_byte(rbx, Address(rsi, 0));  // restore target bytecode
1672 
1673       // rax,: osr nmethod (osr ok) or NULL (osr not possible)
1674       // rbx,: target bytecode
1675       // rdx: scratch
1676       // rdi: locals pointer
1677       // rsi: bcp
1678       __ testptr(rax, rax);                      // test result
1679       __ jcc(Assembler::zero, dispatch);         // no osr if null
1680       // nmethod may have been invalidated (VM may block upon call_VM return)
1681       __ movl(rcx, Address(rax, nmethod::entry_bci_offset()));
1682       __ cmpl(rcx, InvalidOSREntryBci);
1683       __ jcc(Assembler::equal, dispatch);
1684 
1685       // We have the address of an on stack replacement routine in rax,
1686       // We need to prepare to execute the OSR method. First we must
1687       // migrate the locals and monitors off of the stack.
1688 
1689       __ mov(rbx, rax);                             // save the nmethod
1690 
1691       const Register thread = rcx;
1692       __ get_thread(thread);
1693       call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin));
1694       // rax, is OSR buffer, move it to expected parameter location
1695       __ mov(rcx, rax);
1696 
1697       // pop the interpreter frame
1698       __ movptr(rdx, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); // get sender sp
1699       __ leave();                                // remove frame anchor
1700       __ pop(rdi);                               // get return address
1701       __ mov(rsp, rdx);                          // set sp to sender sp
1702 
1703 
1704       Label skip;
1705       Label chkint;
1706 
1707       // The interpreter frame we have removed may be returning to
1708       // either the callstub or the interpreter. Since we will
1709       // now be returning from a compiled (OSR) nmethod we must
1710       // adjust the return to the return were it can handler compiled
1711       // results and clean the fpu stack. This is very similar to
1712       // what a i2c adapter must do.
1713 
1714       // Are we returning to the call stub?
1715 
1716       __ cmp32(rdi, ExternalAddress(StubRoutines::_call_stub_return_address));
1717       __ jcc(Assembler::notEqual, chkint);
1718 
1719       // yes adjust to the specialized call stub  return.
1720       assert(StubRoutines::x86::get_call_stub_compiled_return() != NULL, "must be set");
1721       __ lea(rdi, ExternalAddress(StubRoutines::x86::get_call_stub_compiled_return()));
1722       __ jmp(skip);
1723 
1724       __ bind(chkint);
1725 
1726       // Are we returning to the interpreter? Look for sentinel
1727 
1728       __ cmpl(Address(rdi, -2*wordSize), Interpreter::return_sentinel);
1729       __ jcc(Assembler::notEqual, skip);
1730 
1731       // Adjust to compiled return back to interpreter
1732 
1733       __ movptr(rdi, Address(rdi, -wordSize));
1734       __ bind(skip);
1735 
1736       // Align stack pointer for compiled code (note that caller is
1737       // responsible for undoing this fixup by remembering the old SP
1738       // in an rbp,-relative location)
1739       __ andptr(rsp, -(StackAlignmentInBytes));
1740 
1741       // push the (possibly adjusted) return address
1742       __ push(rdi);
1743 
1744       // and begin the OSR nmethod
1745       __ jmp(Address(rbx, nmethod::osr_entry_point_offset()));
1746     }
1747   }
1748 }
1749 
1750 
1751 void TemplateTable::if_0cmp(Condition cc) {
1752   transition(itos, vtos);
1753   // assume branch is more often taken than not (loops use backward branches)
1754   Label not_taken;
1755   __ testl(rax, rax);
1756   __ jcc(j_not(cc), not_taken);
1757   branch(false, false);
1758   __ bind(not_taken);
1759   __ profile_not_taken_branch(rax);
1760 }
1761 
1762 
1763 void TemplateTable::if_icmp(Condition cc) {
1764   transition(itos, vtos);
1765   // assume branch is more often taken than not (loops use backward branches)
1766   Label not_taken;
1767   __ pop_i(rdx);
1768   __ cmpl(rdx, rax);
1769   __ jcc(j_not(cc), not_taken);
1770   branch(false, false);
1771   __ bind(not_taken);
1772   __ profile_not_taken_branch(rax);
1773 }
1774 
1775 
1776 void TemplateTable::if_nullcmp(Condition cc) {
1777   transition(atos, vtos);
1778   // assume branch is more often taken than not (loops use backward branches)
1779   Label not_taken;
1780   __ testptr(rax, rax);
1781   __ jcc(j_not(cc), not_taken);
1782   branch(false, false);
1783   __ bind(not_taken);
1784   __ profile_not_taken_branch(rax);
1785 }
1786 
1787 
1788 void TemplateTable::if_acmp(Condition cc) {
1789   transition(atos, vtos);
1790   // assume branch is more often taken than not (loops use backward branches)
1791   Label not_taken;
1792   __ pop_ptr(rdx);
1793   __ cmpptr(rdx, rax);
1794   __ jcc(j_not(cc), not_taken);
1795   branch(false, false);
1796   __ bind(not_taken);
1797   __ profile_not_taken_branch(rax);
1798 }
1799 
1800 
1801 void TemplateTable::ret() {
1802   transition(vtos, vtos);
1803   locals_index(rbx);
1804   __ movptr(rbx, iaddress(rbx));                   // get return bci, compute return bcp
1805   __ profile_ret(rbx, rcx);
1806   __ get_method(rax);
1807   __ movptr(rsi, Address(rax, methodOopDesc::const_offset()));
1808   __ lea(rsi, Address(rsi, rbx, Address::times_1,
1809                       constMethodOopDesc::codes_offset()));
1810   __ dispatch_next(vtos);
1811 }
1812 
1813 
1814 void TemplateTable::wide_ret() {
1815   transition(vtos, vtos);
1816   locals_index_wide(rbx);
1817   __ movptr(rbx, iaddress(rbx));                   // get return bci, compute return bcp
1818   __ profile_ret(rbx, rcx);
1819   __ get_method(rax);
1820   __ movptr(rsi, Address(rax, methodOopDesc::const_offset()));
1821   __ lea(rsi, Address(rsi, rbx, Address::times_1, constMethodOopDesc::codes_offset()));
1822   __ dispatch_next(vtos);
1823 }
1824 
1825 
1826 void TemplateTable::tableswitch() {
1827   Label default_case, continue_execution;
1828   transition(itos, vtos);
1829   // align rsi
1830   __ lea(rbx, at_bcp(wordSize));
1831   __ andptr(rbx, -wordSize);
1832   // load lo & hi
1833   __ movl(rcx, Address(rbx, 1 * wordSize));
1834   __ movl(rdx, Address(rbx, 2 * wordSize));
1835   __ bswapl(rcx);
1836   __ bswapl(rdx);
1837   // check against lo & hi
1838   __ cmpl(rax, rcx);
1839   __ jccb(Assembler::less, default_case);
1840   __ cmpl(rax, rdx);
1841   __ jccb(Assembler::greater, default_case);
1842   // lookup dispatch offset
1843   __ subl(rax, rcx);
1844   __ movl(rdx, Address(rbx, rax, Address::times_4, 3 * BytesPerInt));
1845   __ profile_switch_case(rax, rbx, rcx);
1846   // continue execution
1847   __ bind(continue_execution);
1848   __ bswapl(rdx);
1849   __ load_unsigned_byte(rbx, Address(rsi, rdx, Address::times_1));
1850   __ addptr(rsi, rdx);
1851   __ dispatch_only(vtos);
1852   // handle default
1853   __ bind(default_case);
1854   __ profile_switch_default(rax);
1855   __ movl(rdx, Address(rbx, 0));
1856   __ jmp(continue_execution);
1857 }
1858 
1859 
1860 void TemplateTable::lookupswitch() {
1861   transition(itos, itos);
1862   __ stop("lookupswitch bytecode should have been rewritten");
1863 }
1864 
1865 
1866 void TemplateTable::fast_linearswitch() {
1867   transition(itos, vtos);
1868   Label loop_entry, loop, found, continue_execution;
1869   // bswapl rax, so we can avoid bswapping the table entries
1870   __ bswapl(rax);
1871   // align rsi
1872   __ lea(rbx, at_bcp(wordSize));                // btw: should be able to get rid of this instruction (change offsets below)
1873   __ andptr(rbx, -wordSize);
1874   // set counter
1875   __ movl(rcx, Address(rbx, wordSize));
1876   __ bswapl(rcx);
1877   __ jmpb(loop_entry);
1878   // table search
1879   __ bind(loop);
1880   __ cmpl(rax, Address(rbx, rcx, Address::times_8, 2 * wordSize));
1881   __ jccb(Assembler::equal, found);
1882   __ bind(loop_entry);
1883   __ decrementl(rcx);
1884   __ jcc(Assembler::greaterEqual, loop);
1885   // default case
1886   __ profile_switch_default(rax);
1887   __ movl(rdx, Address(rbx, 0));
1888   __ jmpb(continue_execution);
1889   // entry found -> get offset
1890   __ bind(found);
1891   __ movl(rdx, Address(rbx, rcx, Address::times_8, 3 * wordSize));
1892   __ profile_switch_case(rcx, rax, rbx);
1893   // continue execution
1894   __ bind(continue_execution);
1895   __ bswapl(rdx);
1896   __ load_unsigned_byte(rbx, Address(rsi, rdx, Address::times_1));
1897   __ addptr(rsi, rdx);
1898   __ dispatch_only(vtos);
1899 }
1900 
1901 
1902 void TemplateTable::fast_binaryswitch() {
1903   transition(itos, vtos);
1904   // Implementation using the following core algorithm:
1905   //
1906   // int binary_search(int key, LookupswitchPair* array, int n) {
1907   //   // Binary search according to "Methodik des Programmierens" by
1908   //   // Edsger W. Dijkstra and W.H.J. Feijen, Addison Wesley Germany 1985.
1909   //   int i = 0;
1910   //   int j = n;
1911   //   while (i+1 < j) {
1912   //     // invariant P: 0 <= i < j <= n and (a[i] <= key < a[j] or Q)
1913   //     // with      Q: for all i: 0 <= i < n: key < a[i]
1914   //     // where a stands for the array and assuming that the (inexisting)
1915   //     // element a[n] is infinitely big.
1916   //     int h = (i + j) >> 1;
1917   //     // i < h < j
1918   //     if (key < array[h].fast_match()) {
1919   //       j = h;
1920   //     } else {
1921   //       i = h;
1922   //     }
1923   //   }
1924   //   // R: a[i] <= key < a[i+1] or Q
1925   //   // (i.e., if key is within array, i is the correct index)
1926   //   return i;
1927   // }
1928 
1929   // register allocation
1930   const Register key   = rax;                    // already set (tosca)
1931   const Register array = rbx;
1932   const Register i     = rcx;
1933   const Register j     = rdx;
1934   const Register h     = rdi;                    // needs to be restored
1935   const Register temp  = rsi;
1936   // setup array
1937   __ save_bcp();
1938 
1939   __ lea(array, at_bcp(3*wordSize));             // btw: should be able to get rid of this instruction (change offsets below)
1940   __ andptr(array, -wordSize);
1941   // initialize i & j
1942   __ xorl(i, i);                                 // i = 0;
1943   __ movl(j, Address(array, -wordSize));         // j = length(array);
1944   // Convert j into native byteordering
1945   __ bswapl(j);
1946   // and start
1947   Label entry;
1948   __ jmp(entry);
1949 
1950   // binary search loop
1951   { Label loop;
1952     __ bind(loop);
1953     // int h = (i + j) >> 1;
1954     __ leal(h, Address(i, j, Address::times_1)); // h = i + j;
1955     __ sarl(h, 1);                               // h = (i + j) >> 1;
1956     // if (key < array[h].fast_match()) {
1957     //   j = h;
1958     // } else {
1959     //   i = h;
1960     // }
1961     // Convert array[h].match to native byte-ordering before compare
1962     __ movl(temp, Address(array, h, Address::times_8, 0*wordSize));
1963     __ bswapl(temp);
1964     __ cmpl(key, temp);
1965     if (VM_Version::supports_cmov()) {
1966       __ cmovl(Assembler::less        , j, h);   // j = h if (key <  array[h].fast_match())
1967       __ cmovl(Assembler::greaterEqual, i, h);   // i = h if (key >= array[h].fast_match())
1968     } else {
1969       Label set_i, end_of_if;
1970       __ jccb(Assembler::greaterEqual, set_i);     // {
1971       __ mov(j, h);                                //   j = h;
1972       __ jmp(end_of_if);                           // }
1973       __ bind(set_i);                              // else {
1974       __ mov(i, h);                                //   i = h;
1975       __ bind(end_of_if);                          // }
1976     }
1977     // while (i+1 < j)
1978     __ bind(entry);
1979     __ leal(h, Address(i, 1));                   // i+1
1980     __ cmpl(h, j);                               // i+1 < j
1981     __ jcc(Assembler::less, loop);
1982   }
1983 
1984   // end of binary search, result index is i (must check again!)
1985   Label default_case;
1986   // Convert array[i].match to native byte-ordering before compare
1987   __ movl(temp, Address(array, i, Address::times_8, 0*wordSize));
1988   __ bswapl(temp);
1989   __ cmpl(key, temp);
1990   __ jcc(Assembler::notEqual, default_case);
1991 
1992   // entry found -> j = offset
1993   __ movl(j , Address(array, i, Address::times_8, 1*wordSize));
1994   __ profile_switch_case(i, key, array);
1995   __ bswapl(j);
1996   LP64_ONLY(__ movslq(j, j));
1997   __ restore_bcp();
1998   __ restore_locals();                           // restore rdi
1999   __ load_unsigned_byte(rbx, Address(rsi, j, Address::times_1));
2000 
2001   __ addptr(rsi, j);
2002   __ dispatch_only(vtos);
2003 
2004   // default case -> j = default offset
2005   __ bind(default_case);
2006   __ profile_switch_default(i);
2007   __ movl(j, Address(array, -2*wordSize));
2008   __ bswapl(j);
2009   LP64_ONLY(__ movslq(j, j));
2010   __ restore_bcp();
2011   __ restore_locals();                           // restore rdi
2012   __ load_unsigned_byte(rbx, Address(rsi, j, Address::times_1));
2013   __ addptr(rsi, j);
2014   __ dispatch_only(vtos);
2015 }
2016 
2017 
2018 void TemplateTable::_return(TosState state) {
2019   transition(state, state);
2020   assert(_desc->calls_vm(), "inconsistent calls_vm information"); // call in remove_activation
2021 
2022   if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
2023     assert(state == vtos, "only valid state");
2024     __ movptr(rax, aaddress(0));
2025     __ movptr(rdi, Address(rax, oopDesc::klass_offset_in_bytes()));
2026     __ movl(rdi, Address(rdi, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc)));
2027     __ testl(rdi, JVM_ACC_HAS_FINALIZER);
2028     Label skip_register_finalizer;
2029     __ jcc(Assembler::zero, skip_register_finalizer);
2030 
2031     __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), rax);
2032 
2033     __ bind(skip_register_finalizer);
2034   }
2035 
2036   __ remove_activation(state, rsi);
2037   __ jmp(rsi);
2038 }
2039 
2040 
2041 // ----------------------------------------------------------------------------
2042 // Volatile variables demand their effects be made known to all CPU's in
2043 // order.  Store buffers on most chips allow reads & writes to reorder; the
2044 // JMM's ReadAfterWrite.java test fails in -Xint mode without some kind of
2045 // memory barrier (i.e., it's not sufficient that the interpreter does not
2046 // reorder volatile references, the hardware also must not reorder them).
2047 //
2048 // According to the new Java Memory Model (JMM):
2049 // (1) All volatiles are serialized wrt to each other.
2050 // ALSO reads & writes act as aquire & release, so:
2051 // (2) A read cannot let unrelated NON-volatile memory refs that happen after
2052 // the read float up to before the read.  It's OK for non-volatile memory refs
2053 // that happen before the volatile read to float down below it.
2054 // (3) Similar a volatile write cannot let unrelated NON-volatile memory refs
2055 // that happen BEFORE the write float down to after the write.  It's OK for
2056 // non-volatile memory refs that happen after the volatile write to float up
2057 // before it.
2058 //
2059 // We only put in barriers around volatile refs (they are expensive), not
2060 // _between_ memory refs (that would require us to track the flavor of the
2061 // previous memory refs).  Requirements (2) and (3) require some barriers
2062 // before volatile stores and after volatile loads.  These nearly cover
2063 // requirement (1) but miss the volatile-store-volatile-load case.  This final
2064 // case is placed after volatile-stores although it could just as well go
2065 // before volatile-loads.
2066 void TemplateTable::volatile_barrier(Assembler::Membar_mask_bits order_constraint ) {
2067   // Helper function to insert a is-volatile test and memory barrier
2068   if( !os::is_MP() ) return;    // Not needed on single CPU
2069   __ membar(order_constraint);
2070 }
2071 
2072 void TemplateTable::resolve_cache_and_index(int byte_no,
2073                                             Register result,
2074                                             Register Rcache,
2075                                             Register index,
2076                                             size_t index_size) {
2077   Register temp = rbx;
2078 
2079   assert_different_registers(result, Rcache, index, temp);
2080 
2081   Label resolved;
2082   __ get_cache_and_index_at_bcp(Rcache, index, 1, index_size);
2083   if (byte_no == f1_oop) {
2084     // We are resolved if the f1 field contains a non-null object (CallSite, etc.)
2085     // This kind of CP cache entry does not need to match the flags byte, because
2086     // there is a 1-1 relation between bytecode type and CP entry type.
2087     assert(result != noreg, ""); //else do cmpptr(Address(...), (int32_t) NULL_WORD)
2088     __ movptr(result, Address(Rcache, index, Address::times_ptr, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f1_offset()));
2089     __ testptr(result, result);
2090     __ jcc(Assembler::notEqual, resolved);
2091   } else {
2092     assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range");
2093     assert(result == noreg, "");  //else change code for setting result
2094     const int shift_count = (1 + byte_no)*BitsPerByte;
2095     __ movl(temp, Address(Rcache, index, Address::times_4, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::indices_offset()));
2096     __ shrl(temp, shift_count);
2097     // have we resolved this bytecode?
2098     __ andl(temp, 0xFF);
2099     __ cmpl(temp, (int)bytecode());
2100     __ jcc(Assembler::equal, resolved);
2101   }
2102 
2103   // resolve first time through
2104   address entry;
2105   switch (bytecode()) {
2106     case Bytecodes::_getstatic      : // fall through
2107     case Bytecodes::_putstatic      : // fall through
2108     case Bytecodes::_getfield       : // fall through
2109     case Bytecodes::_putfield       : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_get_put); break;
2110     case Bytecodes::_invokevirtual  : // fall through
2111     case Bytecodes::_invokespecial  : // fall through
2112     case Bytecodes::_invokestatic   : // fall through
2113     case Bytecodes::_invokeinterface: entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invoke);  break;
2114     case Bytecodes::_invokedynamic  : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invokedynamic); break;
2115     case Bytecodes::_fast_aldc      : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_ldc);     break;
2116     case Bytecodes::_fast_aldc_w    : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_ldc);     break;
2117     default                         : ShouldNotReachHere();                                 break;
2118   }
2119   __ movl(temp, (int)bytecode());
2120   __ call_VM(noreg, entry, temp);
2121   // Update registers with resolved info
2122   __ get_cache_and_index_at_bcp(Rcache, index, 1, index_size);
2123   if (result != noreg)
2124     __ movptr(result, Address(Rcache, index, Address::times_ptr, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f1_offset()));
2125   __ bind(resolved);
2126 }
2127 
2128 
2129 // The cache and index registers must be set before call
2130 void TemplateTable::load_field_cp_cache_entry(Register obj,
2131                                               Register cache,
2132                                               Register index,
2133                                               Register off,
2134                                               Register flags,
2135                                               bool is_static = false) {
2136   assert_different_registers(cache, index, flags, off);
2137 
2138   ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
2139   // Field offset
2140   __ movptr(off, Address(cache, index, Address::times_ptr,
2141                          in_bytes(cp_base_offset + ConstantPoolCacheEntry::f2_offset())));
2142   // Flags
2143   __ movl(flags, Address(cache, index, Address::times_ptr,
2144            in_bytes(cp_base_offset + ConstantPoolCacheEntry::flags_offset())));
2145 
2146   // klass     overwrite register
2147   if (is_static) {
2148     __ movptr(obj, Address(cache, index, Address::times_ptr,
2149                            in_bytes(cp_base_offset + ConstantPoolCacheEntry::f1_offset())));
2150   }
2151 }
2152 
2153 void TemplateTable::load_invoke_cp_cache_entry(int byte_no,
2154                                                Register method,
2155                                                Register itable_index,
2156                                                Register flags,
2157                                                bool is_invokevirtual,
2158                                                bool is_invokevfinal /*unused*/,
2159                                                bool is_invokedynamic) {
2160   // setup registers
2161   const Register cache = rcx;
2162   const Register index = rdx;
2163   assert_different_registers(method, flags);
2164   assert_different_registers(method, cache, index);
2165   assert_different_registers(itable_index, flags);
2166   assert_different_registers(itable_index, cache, index);
2167   // determine constant pool cache field offsets
2168   const int method_offset = in_bytes(
2169     constantPoolCacheOopDesc::base_offset() +
2170       (is_invokevirtual
2171        ? ConstantPoolCacheEntry::f2_offset()
2172        : ConstantPoolCacheEntry::f1_offset()
2173       )
2174     );
2175   const int flags_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
2176                                     ConstantPoolCacheEntry::flags_offset());
2177   // access constant pool cache fields
2178   const int index_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
2179                                     ConstantPoolCacheEntry::f2_offset());
2180 
2181   if (byte_no == f1_oop) {
2182     // Resolved f1_oop goes directly into 'method' register.
2183     assert(is_invokedynamic, "");
2184     resolve_cache_and_index(byte_no, method, cache, index, sizeof(u4));
2185   } else {
2186     resolve_cache_and_index(byte_no, noreg, cache, index, sizeof(u2));
2187     __ movptr(method, Address(cache, index, Address::times_ptr, method_offset));
2188   }
2189   if (itable_index != noreg) {
2190     __ movptr(itable_index, Address(cache, index, Address::times_ptr, index_offset));
2191   }
2192   __ movl(flags, Address(cache, index, Address::times_ptr, flags_offset));
2193 }
2194 
2195 
2196 // The registers cache and index expected to be set before call.
2197 // Correct values of the cache and index registers are preserved.
2198 void TemplateTable::jvmti_post_field_access(Register cache,
2199                                             Register index,
2200                                             bool is_static,
2201                                             bool has_tos) {
2202   if (JvmtiExport::can_post_field_access()) {
2203     // Check to see if a field access watch has been set before we take
2204     // the time to call into the VM.
2205     Label L1;
2206     assert_different_registers(cache, index, rax);
2207     __ mov32(rax, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
2208     __ testl(rax,rax);
2209     __ jcc(Assembler::zero, L1);
2210 
2211     // cache entry pointer
2212     __ addptr(cache, in_bytes(constantPoolCacheOopDesc::base_offset()));
2213     __ shll(index, LogBytesPerWord);
2214     __ addptr(cache, index);
2215     if (is_static) {
2216       __ xorptr(rax, rax);      // NULL object reference
2217     } else {
2218       __ pop(atos);         // Get the object
2219       __ verify_oop(rax);
2220       __ push(atos);        // Restore stack state
2221     }
2222     // rax,:   object pointer or NULL
2223     // cache: cache entry pointer
2224     __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access),
2225                rax, cache);
2226     __ get_cache_and_index_at_bcp(cache, index, 1);
2227     __ bind(L1);
2228   }
2229 }
2230 
2231 void TemplateTable::pop_and_check_object(Register r) {
2232   __ pop_ptr(r);
2233   __ null_check(r);  // for field access must check obj.
2234   __ verify_oop(r);
2235 }
2236 
2237 void TemplateTable::getfield_or_static(int byte_no, bool is_static) {
2238   transition(vtos, vtos);
2239 
2240   const Register cache = rcx;
2241   const Register index = rdx;
2242   const Register obj   = rcx;
2243   const Register off   = rbx;
2244   const Register flags = rax;
2245 
2246   resolve_cache_and_index(byte_no, noreg, cache, index, sizeof(u2));
2247   jvmti_post_field_access(cache, index, is_static, false);
2248   load_field_cp_cache_entry(obj, cache, index, off, flags, is_static);
2249 
2250   if (!is_static) pop_and_check_object(obj);
2251 
2252   const Address lo(obj, off, Address::times_1, 0*wordSize);
2253   const Address hi(obj, off, Address::times_1, 1*wordSize);
2254 
2255   Label Done, notByte, notInt, notShort, notChar, notLong, notFloat, notObj, notDouble;
2256 
2257   __ shrl(flags, ConstantPoolCacheEntry::tosBits);
2258   assert(btos == 0, "change code, btos != 0");
2259   // btos
2260   __ andptr(flags, 0x0f);
2261   __ jcc(Assembler::notZero, notByte);
2262 
2263   __ load_signed_byte(rax, lo );
2264   __ push(btos);
2265   // Rewrite bytecode to be faster
2266   if (!is_static) {
2267     patch_bytecode(Bytecodes::_fast_bgetfield, rcx, rbx);
2268   }
2269   __ jmp(Done);
2270 
2271   __ bind(notByte);
2272   // itos
2273   __ cmpl(flags, itos );
2274   __ jcc(Assembler::notEqual, notInt);
2275 
2276   __ movl(rax, lo );
2277   __ push(itos);
2278   // Rewrite bytecode to be faster
2279   if (!is_static) {
2280     patch_bytecode(Bytecodes::_fast_igetfield, rcx, rbx);
2281   }
2282   __ jmp(Done);
2283 
2284   __ bind(notInt);
2285   // atos
2286   __ cmpl(flags, atos );
2287   __ jcc(Assembler::notEqual, notObj);
2288 
2289   __ movl(rax, lo );
2290   __ push(atos);
2291   if (!is_static) {
2292     patch_bytecode(Bytecodes::_fast_agetfield, rcx, rbx);
2293   }
2294   __ jmp(Done);
2295 
2296   __ bind(notObj);
2297   // ctos
2298   __ cmpl(flags, ctos );
2299   __ jcc(Assembler::notEqual, notChar);
2300 
2301   __ load_unsigned_short(rax, lo );
2302   __ push(ctos);
2303   if (!is_static) {
2304     patch_bytecode(Bytecodes::_fast_cgetfield, rcx, rbx);
2305   }
2306   __ jmp(Done);
2307 
2308   __ bind(notChar);
2309   // stos
2310   __ cmpl(flags, stos );
2311   __ jcc(Assembler::notEqual, notShort);
2312 
2313   __ load_signed_short(rax, lo );
2314   __ push(stos);
2315   if (!is_static) {
2316     patch_bytecode(Bytecodes::_fast_sgetfield, rcx, rbx);
2317   }
2318   __ jmp(Done);
2319 
2320   __ bind(notShort);
2321   // ltos
2322   __ cmpl(flags, ltos );
2323   __ jcc(Assembler::notEqual, notLong);
2324 
2325   // Generate code as if volatile.  There just aren't enough registers to
2326   // save that information and this code is faster than the test.
2327   __ fild_d(lo);                // Must load atomically
2328   __ subptr(rsp,2*wordSize);    // Make space for store
2329   __ fistp_d(Address(rsp,0));
2330   __ pop(rax);
2331   __ pop(rdx);
2332 
2333   __ push(ltos);
2334   // Don't rewrite to _fast_lgetfield for potential volatile case.
2335   __ jmp(Done);
2336 
2337   __ bind(notLong);
2338   // ftos
2339   __ cmpl(flags, ftos );
2340   __ jcc(Assembler::notEqual, notFloat);
2341 
2342   __ fld_s(lo);
2343   __ push(ftos);
2344   if (!is_static) {
2345     patch_bytecode(Bytecodes::_fast_fgetfield, rcx, rbx);
2346   }
2347   __ jmp(Done);
2348 
2349   __ bind(notFloat);
2350   // dtos
2351   __ cmpl(flags, dtos );
2352   __ jcc(Assembler::notEqual, notDouble);
2353 
2354   __ fld_d(lo);
2355   __ push(dtos);
2356   if (!is_static) {
2357     patch_bytecode(Bytecodes::_fast_dgetfield, rcx, rbx);
2358   }
2359   __ jmpb(Done);
2360 
2361   __ bind(notDouble);
2362 
2363   __ stop("Bad state");
2364 
2365   __ bind(Done);
2366   // Doug Lea believes this is not needed with current Sparcs (TSO) and Intel (PSO).
2367   // volatile_barrier( );
2368 }
2369 
2370 
2371 void TemplateTable::getfield(int byte_no) {
2372   getfield_or_static(byte_no, false);
2373 }
2374 
2375 
2376 void TemplateTable::getstatic(int byte_no) {
2377   getfield_or_static(byte_no, true);
2378 }
2379 
2380 // The registers cache and index expected to be set before call.
2381 // The function may destroy various registers, just not the cache and index registers.
2382 void TemplateTable::jvmti_post_field_mod(Register cache, Register index, bool is_static) {
2383 
2384   ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
2385 
2386   if (JvmtiExport::can_post_field_modification()) {
2387     // Check to see if a field modification watch has been set before we take
2388     // the time to call into the VM.
2389     Label L1;
2390     assert_different_registers(cache, index, rax);
2391     __ mov32(rax, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr()));
2392     __ testl(rax, rax);
2393     __ jcc(Assembler::zero, L1);
2394 
2395     // The cache and index registers have been already set.
2396     // This allows to eliminate this call but the cache and index
2397     // registers have to be correspondingly used after this line.
2398     __ get_cache_and_index_at_bcp(rax, rdx, 1);
2399 
2400     if (is_static) {
2401       // Life is simple.  Null out the object pointer.
2402       __ xorptr(rbx, rbx);
2403     } else {
2404       // Life is harder. The stack holds the value on top, followed by the object.
2405       // We don't know the size of the value, though; it could be one or two words
2406       // depending on its type. As a result, we must find the type to determine where
2407       // the object is.
2408       Label two_word, valsize_known;
2409       __ movl(rcx, Address(rax, rdx, Address::times_ptr, in_bytes(cp_base_offset +
2410                                    ConstantPoolCacheEntry::flags_offset())));
2411       __ mov(rbx, rsp);
2412       __ shrl(rcx, ConstantPoolCacheEntry::tosBits);
2413       // Make sure we don't need to mask rcx for tosBits after the above shift
2414       ConstantPoolCacheEntry::verify_tosBits();
2415       __ cmpl(rcx, ltos);
2416       __ jccb(Assembler::equal, two_word);
2417       __ cmpl(rcx, dtos);
2418       __ jccb(Assembler::equal, two_word);
2419       __ addptr(rbx, Interpreter::expr_offset_in_bytes(1)); // one word jvalue (not ltos, dtos)
2420       __ jmpb(valsize_known);
2421 
2422       __ bind(two_word);
2423       __ addptr(rbx, Interpreter::expr_offset_in_bytes(2)); // two words jvalue
2424 
2425       __ bind(valsize_known);
2426       // setup object pointer
2427       __ movptr(rbx, Address(rbx, 0));
2428     }
2429     // cache entry pointer
2430     __ addptr(rax, in_bytes(cp_base_offset));
2431     __ shll(rdx, LogBytesPerWord);
2432     __ addptr(rax, rdx);
2433     // object (tos)
2434     __ mov(rcx, rsp);
2435     // rbx,: object pointer set up above (NULL if static)
2436     // rax,: cache entry pointer
2437     // rcx: jvalue object on the stack
2438     __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification),
2439                rbx, rax, rcx);
2440     __ get_cache_and_index_at_bcp(cache, index, 1);
2441     __ bind(L1);
2442   }
2443 }
2444 
2445 
2446 void TemplateTable::putfield_or_static(int byte_no, bool is_static) {
2447   transition(vtos, vtos);
2448 
2449   const Register cache = rcx;
2450   const Register index = rdx;
2451   const Register obj   = rcx;
2452   const Register off   = rbx;
2453   const Register flags = rax;
2454 
2455   resolve_cache_and_index(byte_no, noreg, cache, index, sizeof(u2));
2456   jvmti_post_field_mod(cache, index, is_static);
2457   load_field_cp_cache_entry(obj, cache, index, off, flags, is_static);
2458 
2459   // Doug Lea believes this is not needed with current Sparcs (TSO) and Intel (PSO).
2460   // volatile_barrier( );
2461 
2462   Label notVolatile, Done;
2463   __ movl(rdx, flags);
2464   __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
2465   __ andl(rdx, 0x1);
2466 
2467   // field addresses
2468   const Address lo(obj, off, Address::times_1, 0*wordSize);
2469   const Address hi(obj, off, Address::times_1, 1*wordSize);
2470 
2471   Label notByte, notInt, notShort, notChar, notLong, notFloat, notObj, notDouble;
2472 
2473   __ shrl(flags, ConstantPoolCacheEntry::tosBits);
2474   assert(btos == 0, "change code, btos != 0");
2475   // btos
2476   __ andl(flags, 0x0f);
2477   __ jcc(Assembler::notZero, notByte);
2478 
2479   __ pop(btos);
2480   if (!is_static) pop_and_check_object(obj);
2481   __ movb(lo, rax );
2482   if (!is_static) {
2483     patch_bytecode(Bytecodes::_fast_bputfield, rcx, rbx);
2484   }
2485   __ jmp(Done);
2486 
2487   __ bind(notByte);
2488   // itos
2489   __ cmpl(flags, itos );
2490   __ jcc(Assembler::notEqual, notInt);
2491 
2492   __ pop(itos);
2493   if (!is_static) pop_and_check_object(obj);
2494 
2495   __ movl(lo, rax );
2496   if (!is_static) {
2497     patch_bytecode(Bytecodes::_fast_iputfield, rcx, rbx);
2498   }
2499   __ jmp(Done);
2500 
2501   __ bind(notInt);
2502   // atos
2503   __ cmpl(flags, atos );
2504   __ jcc(Assembler::notEqual, notObj);
2505 
2506   __ pop(atos);
2507   if (!is_static) pop_and_check_object(obj);
2508 
2509   do_oop_store(_masm, lo, rax, _bs->kind(), false);
2510 
2511   if (!is_static) {
2512     patch_bytecode(Bytecodes::_fast_aputfield, rcx, rbx);
2513   }
2514 
2515   __ jmp(Done);
2516 
2517   __ bind(notObj);
2518   // ctos
2519   __ cmpl(flags, ctos );
2520   __ jcc(Assembler::notEqual, notChar);
2521 
2522   __ pop(ctos);
2523   if (!is_static) pop_and_check_object(obj);
2524   __ movw(lo, rax );
2525   if (!is_static) {
2526     patch_bytecode(Bytecodes::_fast_cputfield, rcx, rbx);
2527   }
2528   __ jmp(Done);
2529 
2530   __ bind(notChar);
2531   // stos
2532   __ cmpl(flags, stos );
2533   __ jcc(Assembler::notEqual, notShort);
2534 
2535   __ pop(stos);
2536   if (!is_static) pop_and_check_object(obj);
2537   __ movw(lo, rax );
2538   if (!is_static) {
2539     patch_bytecode(Bytecodes::_fast_sputfield, rcx, rbx);
2540   }
2541   __ jmp(Done);
2542 
2543   __ bind(notShort);
2544   // ltos
2545   __ cmpl(flags, ltos );
2546   __ jcc(Assembler::notEqual, notLong);
2547 
2548   Label notVolatileLong;
2549   __ testl(rdx, rdx);
2550   __ jcc(Assembler::zero, notVolatileLong);
2551 
2552   __ pop(ltos);  // overwrites rdx, do this after testing volatile.
2553   if (!is_static) pop_and_check_object(obj);
2554 
2555   // Replace with real volatile test
2556   __ push(rdx);
2557   __ push(rax);                 // Must update atomically with FIST
2558   __ fild_d(Address(rsp,0));    // So load into FPU register
2559   __ fistp_d(lo);               // and put into memory atomically
2560   __ addptr(rsp, 2*wordSize);
2561   // volatile_barrier();
2562   volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad |
2563                                                Assembler::StoreStore));
2564   // Don't rewrite volatile version
2565   __ jmp(notVolatile);
2566 
2567   __ bind(notVolatileLong);
2568 
2569   __ pop(ltos);  // overwrites rdx
2570   if (!is_static) pop_and_check_object(obj);
2571   NOT_LP64(__ movptr(hi, rdx));
2572   __ movptr(lo, rax);
2573   if (!is_static) {
2574     patch_bytecode(Bytecodes::_fast_lputfield, rcx, rbx);
2575   }
2576   __ jmp(notVolatile);
2577 
2578   __ bind(notLong);
2579   // ftos
2580   __ cmpl(flags, ftos );
2581   __ jcc(Assembler::notEqual, notFloat);
2582 
2583   __ pop(ftos);
2584   if (!is_static) pop_and_check_object(obj);
2585   __ fstp_s(lo);
2586   if (!is_static) {
2587     patch_bytecode(Bytecodes::_fast_fputfield, rcx, rbx);
2588   }
2589   __ jmp(Done);
2590 
2591   __ bind(notFloat);
2592   // dtos
2593   __ cmpl(flags, dtos );
2594   __ jcc(Assembler::notEqual, notDouble);
2595 
2596   __ pop(dtos);
2597   if (!is_static) pop_and_check_object(obj);
2598   __ fstp_d(lo);
2599   if (!is_static) {
2600     patch_bytecode(Bytecodes::_fast_dputfield, rcx, rbx);
2601   }
2602   __ jmp(Done);
2603 
2604   __ bind(notDouble);
2605 
2606   __ stop("Bad state");
2607 
2608   __ bind(Done);
2609 
2610   // Check for volatile store
2611   __ testl(rdx, rdx);
2612   __ jcc(Assembler::zero, notVolatile);
2613   volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad |
2614                                                Assembler::StoreStore));
2615   __ bind(notVolatile);
2616 }
2617 
2618 
2619 void TemplateTable::putfield(int byte_no) {
2620   putfield_or_static(byte_no, false);
2621 }
2622 
2623 
2624 void TemplateTable::putstatic(int byte_no) {
2625   putfield_or_static(byte_no, true);
2626 }
2627 
2628 void TemplateTable::jvmti_post_fast_field_mod() {
2629   if (JvmtiExport::can_post_field_modification()) {
2630     // Check to see if a field modification watch has been set before we take
2631     // the time to call into the VM.
2632     Label L2;
2633     __ mov32(rcx, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr()));
2634     __ testl(rcx,rcx);
2635     __ jcc(Assembler::zero, L2);
2636     __ pop_ptr(rbx);               // copy the object pointer from tos
2637     __ verify_oop(rbx);
2638     __ push_ptr(rbx);              // put the object pointer back on tos
2639     __ subptr(rsp, sizeof(jvalue));  // add space for a jvalue object
2640     __ mov(rcx, rsp);
2641     __ push_ptr(rbx);                 // save object pointer so we can steal rbx,
2642     __ xorptr(rbx, rbx);
2643     const Address lo_value(rcx, rbx, Address::times_1, 0*wordSize);
2644     const Address hi_value(rcx, rbx, Address::times_1, 1*wordSize);
2645     switch (bytecode()) {          // load values into the jvalue object
2646     case Bytecodes::_fast_bputfield: __ movb(lo_value, rax); break;
2647     case Bytecodes::_fast_sputfield: __ movw(lo_value, rax); break;
2648     case Bytecodes::_fast_cputfield: __ movw(lo_value, rax); break;
2649     case Bytecodes::_fast_iputfield: __ movl(lo_value, rax);                         break;
2650     case Bytecodes::_fast_lputfield:
2651       NOT_LP64(__ movptr(hi_value, rdx));
2652       __ movptr(lo_value, rax);
2653       break;
2654 
2655     // need to call fld_s() after fstp_s() to restore the value for below
2656     case Bytecodes::_fast_fputfield: __ fstp_s(lo_value); __ fld_s(lo_value);        break;
2657 
2658     // need to call fld_d() after fstp_d() to restore the value for below
2659     case Bytecodes::_fast_dputfield: __ fstp_d(lo_value); __ fld_d(lo_value);        break;
2660 
2661     // since rcx is not an object we don't call store_check() here
2662     case Bytecodes::_fast_aputfield: __ movptr(lo_value, rax);                       break;
2663 
2664     default:  ShouldNotReachHere();
2665     }
2666     __ pop_ptr(rbx);  // restore copy of object pointer
2667 
2668     // Save rax, and sometimes rdx because call_VM() will clobber them,
2669     // then use them for JVM/DI purposes
2670     __ push(rax);
2671     if (bytecode() == Bytecodes::_fast_lputfield) __ push(rdx);
2672     // access constant pool cache entry
2673     __ get_cache_entry_pointer_at_bcp(rax, rdx, 1);
2674     __ verify_oop(rbx);
2675     // rbx,: object pointer copied above
2676     // rax,: cache entry pointer
2677     // rcx: jvalue object on the stack
2678     __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification), rbx, rax, rcx);
2679     if (bytecode() == Bytecodes::_fast_lputfield) __ pop(rdx);  // restore high value
2680     __ pop(rax);     // restore lower value
2681     __ addptr(rsp, sizeof(jvalue));  // release jvalue object space
2682     __ bind(L2);
2683   }
2684 }
2685 
2686 void TemplateTable::fast_storefield(TosState state) {
2687   transition(state, vtos);
2688 
2689   ByteSize base = constantPoolCacheOopDesc::base_offset();
2690 
2691   jvmti_post_fast_field_mod();
2692 
2693   // access constant pool cache
2694   __ get_cache_and_index_at_bcp(rcx, rbx, 1);
2695 
2696   // test for volatile with rdx but rdx is tos register for lputfield.
2697   if (bytecode() == Bytecodes::_fast_lputfield) __ push(rdx);
2698   __ movl(rdx, Address(rcx, rbx, Address::times_ptr, in_bytes(base +
2699                        ConstantPoolCacheEntry::flags_offset())));
2700 
2701   // replace index with field offset from cache entry
2702   __ movptr(rbx, Address(rcx, rbx, Address::times_ptr, in_bytes(base + ConstantPoolCacheEntry::f2_offset())));
2703 
2704   // Doug Lea believes this is not needed with current Sparcs (TSO) and Intel (PSO).
2705   // volatile_barrier( );
2706 
2707   Label notVolatile, Done;
2708   __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
2709   __ andl(rdx, 0x1);
2710   // Check for volatile store
2711   __ testl(rdx, rdx);
2712   __ jcc(Assembler::zero, notVolatile);
2713 
2714   if (bytecode() == Bytecodes::_fast_lputfield) __ pop(rdx);
2715 
2716   // Get object from stack
2717   pop_and_check_object(rcx);
2718 
2719   // field addresses
2720   const Address lo(rcx, rbx, Address::times_1, 0*wordSize);
2721   const Address hi(rcx, rbx, Address::times_1, 1*wordSize);
2722 
2723   // access field
2724   switch (bytecode()) {
2725     case Bytecodes::_fast_bputfield: __ movb(lo, rax); break;
2726     case Bytecodes::_fast_sputfield: // fall through
2727     case Bytecodes::_fast_cputfield: __ movw(lo, rax); break;
2728     case Bytecodes::_fast_iputfield: __ movl(lo, rax); break;
2729     case Bytecodes::_fast_lputfield:
2730       NOT_LP64(__ movptr(hi, rdx));
2731       __ movptr(lo, rax);
2732       break;
2733     case Bytecodes::_fast_fputfield: __ fstp_s(lo); break;
2734     case Bytecodes::_fast_dputfield: __ fstp_d(lo); break;
2735     case Bytecodes::_fast_aputfield: {
2736       do_oop_store(_masm, lo, rax, _bs->kind(), false);
2737       break;
2738     }
2739     default:
2740       ShouldNotReachHere();
2741   }
2742 
2743   Label done;
2744   volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad |
2745                                                Assembler::StoreStore));
2746   // Barriers are so large that short branch doesn't reach!
2747   __ jmp(done);
2748 
2749   // Same code as above, but don't need rdx to test for volatile.
2750   __ bind(notVolatile);
2751 
2752   if (bytecode() == Bytecodes::_fast_lputfield) __ pop(rdx);
2753 
2754   // Get object from stack
2755   pop_and_check_object(rcx);
2756 
2757   // access field
2758   switch (bytecode()) {
2759     case Bytecodes::_fast_bputfield: __ movb(lo, rax); break;
2760     case Bytecodes::_fast_sputfield: // fall through
2761     case Bytecodes::_fast_cputfield: __ movw(lo, rax); break;
2762     case Bytecodes::_fast_iputfield: __ movl(lo, rax); break;
2763     case Bytecodes::_fast_lputfield:
2764       NOT_LP64(__ movptr(hi, rdx));
2765       __ movptr(lo, rax);
2766       break;
2767     case Bytecodes::_fast_fputfield: __ fstp_s(lo); break;
2768     case Bytecodes::_fast_dputfield: __ fstp_d(lo); break;
2769     case Bytecodes::_fast_aputfield: {
2770       do_oop_store(_masm, lo, rax, _bs->kind(), false);
2771       break;
2772     }
2773     default:
2774       ShouldNotReachHere();
2775   }
2776   __ bind(done);
2777 }
2778 
2779 
2780 void TemplateTable::fast_accessfield(TosState state) {
2781   transition(atos, state);
2782 
2783   // do the JVMTI work here to avoid disturbing the register state below
2784   if (JvmtiExport::can_post_field_access()) {
2785     // Check to see if a field access watch has been set before we take
2786     // the time to call into the VM.
2787     Label L1;
2788     __ mov32(rcx, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
2789     __ testl(rcx,rcx);
2790     __ jcc(Assembler::zero, L1);
2791     // access constant pool cache entry
2792     __ get_cache_entry_pointer_at_bcp(rcx, rdx, 1);
2793     __ push_ptr(rax);  // save object pointer before call_VM() clobbers it
2794     __ verify_oop(rax);
2795     // rax,: object pointer copied above
2796     // rcx: cache entry pointer
2797     __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access), rax, rcx);
2798     __ pop_ptr(rax);   // restore object pointer
2799     __ bind(L1);
2800   }
2801 
2802   // access constant pool cache
2803   __ get_cache_and_index_at_bcp(rcx, rbx, 1);
2804   // replace index with field offset from cache entry
2805   __ movptr(rbx, Address(rcx,
2806                          rbx,
2807                          Address::times_ptr,
2808                          in_bytes(constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f2_offset())));
2809 
2810 
2811   // rax,: object
2812   __ verify_oop(rax);
2813   __ null_check(rax);
2814   // field addresses
2815   const Address lo = Address(rax, rbx, Address::times_1, 0*wordSize);
2816   const Address hi = Address(rax, rbx, Address::times_1, 1*wordSize);
2817 
2818   // access field
2819   switch (bytecode()) {
2820     case Bytecodes::_fast_bgetfield: __ movsbl(rax, lo );                 break;
2821     case Bytecodes::_fast_sgetfield: __ load_signed_short(rax, lo );      break;
2822     case Bytecodes::_fast_cgetfield: __ load_unsigned_short(rax, lo );    break;
2823     case Bytecodes::_fast_igetfield: __ movl(rax, lo);                    break;
2824     case Bytecodes::_fast_lgetfield: __ stop("should not be rewritten");  break;
2825     case Bytecodes::_fast_fgetfield: __ fld_s(lo);                        break;
2826     case Bytecodes::_fast_dgetfield: __ fld_d(lo);                        break;
2827     case Bytecodes::_fast_agetfield: __ movptr(rax, lo); __ verify_oop(rax); break;
2828     default:
2829       ShouldNotReachHere();
2830   }
2831 
2832   // Doug Lea believes this is not needed with current Sparcs(TSO) and Intel(PSO)
2833   // volatile_barrier( );
2834 }
2835 
2836 void TemplateTable::fast_xaccess(TosState state) {
2837   transition(vtos, state);
2838   // get receiver
2839   __ movptr(rax, aaddress(0));
2840   // access constant pool cache
2841   __ get_cache_and_index_at_bcp(rcx, rdx, 2);
2842   __ movptr(rbx, Address(rcx,
2843                          rdx,
2844                          Address::times_ptr,
2845                          in_bytes(constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f2_offset())));
2846   // make sure exception is reported in correct bcp range (getfield is next instruction)
2847   __ increment(rsi);
2848   __ null_check(rax);
2849   const Address lo = Address(rax, rbx, Address::times_1, 0*wordSize);
2850   if (state == itos) {
2851     __ movl(rax, lo);
2852   } else if (state == atos) {
2853     __ movptr(rax, lo);
2854     __ verify_oop(rax);
2855   } else if (state == ftos) {
2856     __ fld_s(lo);
2857   } else {
2858     ShouldNotReachHere();
2859   }
2860   __ decrement(rsi);
2861 }
2862 
2863 
2864 
2865 //----------------------------------------------------------------------------------------------------
2866 // Calls
2867 
2868 void TemplateTable::count_calls(Register method, Register temp) {
2869   // implemented elsewhere
2870   ShouldNotReachHere();
2871 }
2872 
2873 
2874 void TemplateTable::prepare_invoke(Register method, Register index, int byte_no) {
2875   // determine flags
2876   Bytecodes::Code code = bytecode();
2877   const bool is_invokeinterface  = code == Bytecodes::_invokeinterface;
2878   const bool is_invokedynamic    = code == Bytecodes::_invokedynamic;
2879   const bool is_invokevirtual    = code == Bytecodes::_invokevirtual;
2880   const bool is_invokespecial    = code == Bytecodes::_invokespecial;
2881   const bool load_receiver      = (code != Bytecodes::_invokestatic && code != Bytecodes::_invokedynamic);
2882   const bool receiver_null_check = is_invokespecial;
2883   const bool save_flags = is_invokeinterface || is_invokevirtual;
2884   // setup registers & access constant pool cache
2885   const Register recv   = rcx;
2886   const Register flags  = rdx;
2887   assert_different_registers(method, index, recv, flags);
2888 
2889   // save 'interpreter return address'
2890   __ save_bcp();
2891 
2892   load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual, false, is_invokedynamic);
2893 
2894   // load receiver if needed (note: no return address pushed yet)
2895   if (load_receiver) {
2896     assert(!is_invokedynamic, "");
2897     __ movl(recv, flags);
2898     __ andl(recv, 0xFF);
2899     // recv count is 0 based?
2900     Address recv_addr(rsp, recv, Interpreter::stackElementScale(), -Interpreter::expr_offset_in_bytes(1));
2901     __ movptr(recv, recv_addr);
2902     __ verify_oop(recv);
2903   }
2904 
2905   // do null check if needed
2906   if (receiver_null_check) {
2907     __ null_check(recv);
2908   }
2909 
2910   if (save_flags) {
2911     __ mov(rsi, flags);
2912   }
2913 
2914   // compute return type
2915   __ shrl(flags, ConstantPoolCacheEntry::tosBits);
2916   // Make sure we don't need to mask flags for tosBits after the above shift
2917   ConstantPoolCacheEntry::verify_tosBits();
2918   // load return address
2919   {
2920     address table_addr;
2921     if (is_invokeinterface || is_invokedynamic)
2922       table_addr = (address)Interpreter::return_5_addrs_by_index_table();
2923     else
2924       table_addr = (address)Interpreter::return_3_addrs_by_index_table();
2925     ExternalAddress table(table_addr);
2926     __ movptr(flags, ArrayAddress(table, Address(noreg, flags, Address::times_ptr)));
2927   }
2928 
2929   // push return address
2930   __ push(flags);
2931 
2932   // Restore flag value from the constant pool cache, and restore rsi
2933   // for later null checks.  rsi is the bytecode pointer
2934   if (save_flags) {
2935     __ mov(flags, rsi);
2936     __ restore_bcp();
2937   }
2938 }
2939 
2940 
2941 void TemplateTable::invokevirtual_helper(Register index, Register recv,
2942                         Register flags) {
2943 
2944   // Uses temporary registers rax, rdx
2945   assert_different_registers(index, recv, rax, rdx);
2946 
2947   // Test for an invoke of a final method
2948   Label notFinal;
2949   __ movl(rax, flags);
2950   __ andl(rax, (1 << ConstantPoolCacheEntry::vfinalMethod));
2951   __ jcc(Assembler::zero, notFinal);
2952 
2953   Register method = index;  // method must be rbx,
2954   assert(method == rbx, "methodOop must be rbx, for interpreter calling convention");
2955 
2956   // do the call - the index is actually the method to call
2957   __ verify_oop(method);
2958 
2959   // It's final, need a null check here!
2960   __ null_check(recv);
2961 
2962   // profile this call
2963   __ profile_final_call(rax);
2964 
2965   __ jump_from_interpreted(method, rax);
2966 
2967   __ bind(notFinal);
2968 
2969   // get receiver klass
2970   __ null_check(recv, oopDesc::klass_offset_in_bytes());
2971   // Keep recv in rcx for callee expects it there
2972   __ movptr(rax, Address(recv, oopDesc::klass_offset_in_bytes()));
2973   __ verify_oop(rax);
2974 
2975   // profile this call
2976   __ profile_virtual_call(rax, rdi, rdx);
2977 
2978   // get target methodOop & entry point
2979   const int base = instanceKlass::vtable_start_offset() * wordSize;
2980   assert(vtableEntry::size() * wordSize == 4, "adjust the scaling in the code below");
2981   __ movptr(method, Address(rax, index, Address::times_ptr, base + vtableEntry::method_offset_in_bytes()));
2982   __ jump_from_interpreted(method, rdx);
2983 }
2984 
2985 
2986 void TemplateTable::invokevirtual(int byte_no) {
2987   transition(vtos, vtos);
2988   assert(byte_no == f2_byte, "use this argument");
2989   prepare_invoke(rbx, noreg, byte_no);
2990 
2991   // rbx,: index
2992   // rcx: receiver
2993   // rdx: flags
2994 
2995   invokevirtual_helper(rbx, rcx, rdx);
2996 }
2997 
2998 
2999 void TemplateTable::invokespecial(int byte_no) {
3000   transition(vtos, vtos);
3001   assert(byte_no == f1_byte, "use this argument");
3002   prepare_invoke(rbx, noreg, byte_no);
3003   // do the call
3004   __ verify_oop(rbx);
3005   __ profile_call(rax);
3006   __ jump_from_interpreted(rbx, rax);
3007 }
3008 
3009 
3010 void TemplateTable::invokestatic(int byte_no) {
3011   transition(vtos, vtos);
3012   assert(byte_no == f1_byte, "use this argument");
3013   prepare_invoke(rbx, noreg, byte_no);
3014   // do the call
3015   __ verify_oop(rbx);
3016   __ profile_call(rax);
3017   __ jump_from_interpreted(rbx, rax);
3018 }
3019 
3020 
3021 void TemplateTable::fast_invokevfinal(int byte_no) {
3022   transition(vtos, vtos);
3023   assert(byte_no == f2_byte, "use this argument");
3024   __ stop("fast_invokevfinal not used on x86");
3025 }
3026 
3027 
3028 void TemplateTable::invokeinterface(int byte_no) {
3029   transition(vtos, vtos);
3030   assert(byte_no == f1_byte, "use this argument");
3031   prepare_invoke(rax, rbx, byte_no);
3032 
3033   // rax,: Interface
3034   // rbx,: index
3035   // rcx: receiver
3036   // rdx: flags
3037 
3038   // Special case of invokeinterface called for virtual method of
3039   // java.lang.Object.  See cpCacheOop.cpp for details.
3040   // This code isn't produced by javac, but could be produced by
3041   // another compliant java compiler.
3042   Label notMethod;
3043   __ movl(rdi, rdx);
3044   __ andl(rdi, (1 << ConstantPoolCacheEntry::methodInterface));
3045   __ jcc(Assembler::zero, notMethod);
3046 
3047   invokevirtual_helper(rbx, rcx, rdx);
3048   __ bind(notMethod);
3049 
3050   // Get receiver klass into rdx - also a null check
3051   __ restore_locals();  // restore rdi
3052   __ movptr(rdx, Address(rcx, oopDesc::klass_offset_in_bytes()));
3053   __ verify_oop(rdx);
3054 
3055   // profile this call
3056   __ profile_virtual_call(rdx, rsi, rdi);
3057 
3058   Label no_such_interface, no_such_method;
3059 
3060   __ lookup_interface_method(// inputs: rec. class, interface, itable index
3061                              rdx, rax, rbx,
3062                              // outputs: method, scan temp. reg
3063                              rbx, rsi,
3064                              no_such_interface);
3065 
3066   // rbx,: methodOop to call
3067   // rcx: receiver
3068   // Check for abstract method error
3069   // Note: This should be done more efficiently via a throw_abstract_method_error
3070   //       interpreter entry point and a conditional jump to it in case of a null
3071   //       method.
3072   __ testptr(rbx, rbx);
3073   __ jcc(Assembler::zero, no_such_method);
3074 
3075   // do the call
3076   // rcx: receiver
3077   // rbx,: methodOop
3078   __ jump_from_interpreted(rbx, rdx);
3079   __ should_not_reach_here();
3080 
3081   // exception handling code follows...
3082   // note: must restore interpreter registers to canonical
3083   //       state for exception handling to work correctly!
3084 
3085   __ bind(no_such_method);
3086   // throw exception
3087   __ pop(rbx);           // pop return address (pushed by prepare_invoke)
3088   __ restore_bcp();      // rsi must be correct for exception handler   (was destroyed)
3089   __ restore_locals();   // make sure locals pointer is correct as well (was destroyed)
3090   __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError));
3091   // the call_VM checks for exception, so we should never return here.
3092   __ should_not_reach_here();
3093 
3094   __ bind(no_such_interface);
3095   // throw exception
3096   __ pop(rbx);           // pop return address (pushed by prepare_invoke)
3097   __ restore_bcp();      // rsi must be correct for exception handler   (was destroyed)
3098   __ restore_locals();   // make sure locals pointer is correct as well (was destroyed)
3099   __ call_VM(noreg, CAST_FROM_FN_PTR(address,
3100                    InterpreterRuntime::throw_IncompatibleClassChangeError));
3101   // the call_VM checks for exception, so we should never return here.
3102   __ should_not_reach_here();
3103 }
3104 
3105 void TemplateTable::invokedynamic(int byte_no) {
3106   transition(vtos, vtos);
3107 
3108   if (!EnableInvokeDynamic) {
3109     // We should not encounter this bytecode if !EnableInvokeDynamic.
3110     // The verifier will stop it.  However, if we get past the verifier,
3111     // this will stop the thread in a reasonable way, without crashing the JVM.
3112     __ call_VM(noreg, CAST_FROM_FN_PTR(address,
3113                      InterpreterRuntime::throw_IncompatibleClassChangeError));
3114     // the call_VM checks for exception, so we should never return here.
3115     __ should_not_reach_here();
3116     return;
3117   }
3118 
3119   assert(byte_no == f1_oop, "use this argument");
3120   prepare_invoke(rax, rbx, byte_no);
3121 
3122   // rax: CallSite object (f1)
3123   // rbx: unused (f2)
3124   // rcx: receiver address
3125   // rdx: flags (unused)
3126 
3127   Register rax_callsite      = rax;
3128   Register rcx_method_handle = rcx;
3129 
3130   if (ProfileInterpreter) {
3131     // %%% should make a type profile for any invokedynamic that takes a ref argument
3132     // profile this call
3133     __ profile_call(rsi);
3134   }
3135 
3136   __ movptr(rcx_method_handle, Address(rax_callsite, __ delayed_value(java_dyn_CallSite::target_offset_in_bytes, rcx)));
3137   __ null_check(rcx_method_handle);
3138   __ prepare_to_jump_from_interpreted();
3139   __ jump_to_method_handle_entry(rcx_method_handle, rdx);
3140 }
3141 
3142 //----------------------------------------------------------------------------------------------------
3143 // Allocation
3144 
3145 void TemplateTable::_new() {
3146   transition(vtos, atos);
3147   __ get_unsigned_2_byte_index_at_bcp(rdx, 1);
3148   Label slow_case;
3149   Label slow_case_no_pop;
3150   Label done;
3151   Label initialize_header;
3152   Label initialize_object;  // including clearing the fields
3153   Label allocate_shared;
3154 
3155   __ get_cpool_and_tags(rcx, rax);
3156 
3157   // Make sure the class we're about to instantiate has been resolved.
3158   // This is done before loading instanceKlass to be consistent with the order
3159   // how Constant Pool is updated (see constantPoolOopDesc::klass_at_put)
3160   const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
3161   __ cmpb(Address(rax, rdx, Address::times_1, tags_offset), JVM_CONSTANT_Class);
3162   __ jcc(Assembler::notEqual, slow_case_no_pop);
3163 
3164   // get instanceKlass
3165   __ movptr(rcx, Address(rcx, rdx, Address::times_ptr, sizeof(constantPoolOopDesc)));
3166   __ push(rcx);  // save the contexts of klass for initializing the header
3167 
3168   // make sure klass is initialized & doesn't have finalizer
3169   // make sure klass is fully initialized
3170   __ cmpl(Address(rcx, instanceKlass::init_state_offset_in_bytes() + sizeof(oopDesc)), instanceKlass::fully_initialized);
3171   __ jcc(Assembler::notEqual, slow_case);
3172 
3173   // get instance_size in instanceKlass (scaled to a count of bytes)
3174   __ movl(rdx, Address(rcx, Klass::layout_helper_offset_in_bytes() + sizeof(oopDesc)));
3175   // test to see if it has a finalizer or is malformed in some way
3176   __ testl(rdx, Klass::_lh_instance_slow_path_bit);
3177   __ jcc(Assembler::notZero, slow_case);
3178 
3179   //
3180   // Allocate the instance
3181   // 1) Try to allocate in the TLAB
3182   // 2) if fail and the object is large allocate in the shared Eden
3183   // 3) if the above fails (or is not applicable), go to a slow case
3184   // (creates a new TLAB, etc.)
3185 
3186   const bool allow_shared_alloc =
3187     Universe::heap()->supports_inline_contig_alloc() && !CMSIncrementalMode;
3188 
3189   if (UseTLAB) {
3190     const Register thread = rcx;
3191 
3192     __ get_thread(thread);
3193     __ movptr(rax, Address(thread, in_bytes(JavaThread::tlab_top_offset())));
3194     __ lea(rbx, Address(rax, rdx, Address::times_1));
3195     __ cmpptr(rbx, Address(thread, in_bytes(JavaThread::tlab_end_offset())));
3196     __ jcc(Assembler::above, allow_shared_alloc ? allocate_shared : slow_case);
3197     __ movptr(Address(thread, in_bytes(JavaThread::tlab_top_offset())), rbx);
3198     if (ZeroTLAB) {
3199       // the fields have been already cleared
3200       __ jmp(initialize_header);
3201     } else {
3202       // initialize both the header and fields
3203       __ jmp(initialize_object);
3204     }
3205   }
3206 
3207   // Allocation in the shared Eden, if allowed.
3208   //
3209   // rdx: instance size in bytes
3210   if (allow_shared_alloc) {
3211     __ bind(allocate_shared);
3212 
3213     ExternalAddress heap_top((address)Universe::heap()->top_addr());
3214 
3215     Label retry;
3216     __ bind(retry);
3217     __ movptr(rax, heap_top);
3218     __ lea(rbx, Address(rax, rdx, Address::times_1));
3219     __ cmpptr(rbx, ExternalAddress((address)Universe::heap()->end_addr()));
3220     __ jcc(Assembler::above, slow_case);
3221 
3222     // Compare rax, with the top addr, and if still equal, store the new
3223     // top addr in rbx, at the address of the top addr pointer. Sets ZF if was
3224     // equal, and clears it otherwise. Use lock prefix for atomicity on MPs.
3225     //
3226     // rax,: object begin
3227     // rbx,: object end
3228     // rdx: instance size in bytes
3229     __ locked_cmpxchgptr(rbx, heap_top);
3230 
3231     // if someone beat us on the allocation, try again, otherwise continue
3232     __ jcc(Assembler::notEqual, retry);
3233   }
3234 
3235   if (UseTLAB || Universe::heap()->supports_inline_contig_alloc()) {
3236     // The object is initialized before the header.  If the object size is
3237     // zero, go directly to the header initialization.
3238     __ bind(initialize_object);
3239     __ decrement(rdx, sizeof(oopDesc));
3240     __ jcc(Assembler::zero, initialize_header);
3241 
3242   // Initialize topmost object field, divide rdx by 8, check if odd and
3243   // test if zero.
3244     __ xorl(rcx, rcx);    // use zero reg to clear memory (shorter code)
3245     __ shrl(rdx, LogBytesPerLong); // divide by 2*oopSize and set carry flag if odd
3246 
3247   // rdx must have been multiple of 8
3248 #ifdef ASSERT
3249     // make sure rdx was multiple of 8
3250     Label L;
3251     // Ignore partial flag stall after shrl() since it is debug VM
3252     __ jccb(Assembler::carryClear, L);
3253     __ stop("object size is not multiple of 2 - adjust this code");
3254     __ bind(L);
3255     // rdx must be > 0, no extra check needed here
3256 #endif
3257 
3258     // initialize remaining object fields: rdx was a multiple of 8
3259     { Label loop;
3260     __ bind(loop);
3261     __ movptr(Address(rax, rdx, Address::times_8, sizeof(oopDesc) - 1*oopSize), rcx);
3262     NOT_LP64(__ movptr(Address(rax, rdx, Address::times_8, sizeof(oopDesc) - 2*oopSize), rcx));
3263     __ decrement(rdx);
3264     __ jcc(Assembler::notZero, loop);
3265     }
3266 
3267     // initialize object header only.
3268     __ bind(initialize_header);
3269     if (UseBiasedLocking) {
3270       __ pop(rcx);   // get saved klass back in the register.
3271       __ movptr(rbx, Address(rcx, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
3272       __ movptr(Address(rax, oopDesc::mark_offset_in_bytes ()), rbx);
3273     } else {
3274       __ movptr(Address(rax, oopDesc::mark_offset_in_bytes ()),
3275                 (int32_t)markOopDesc::prototype()); // header
3276       __ pop(rcx);   // get saved klass back in the register.
3277     }
3278     __ movptr(Address(rax, oopDesc::klass_offset_in_bytes()), rcx);  // klass
3279 
3280     {
3281       SkipIfEqual skip_if(_masm, &DTraceAllocProbes, 0);
3282       // Trigger dtrace event for fastpath
3283       __ push(atos);
3284       __ call_VM_leaf(
3285            CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc), rax);
3286       __ pop(atos);
3287     }
3288 
3289     __ jmp(done);
3290   }
3291 
3292   // slow case
3293   __ bind(slow_case);
3294   __ pop(rcx);   // restore stack pointer to what it was when we came in.
3295   __ bind(slow_case_no_pop);
3296   __ get_constant_pool(rax);
3297   __ get_unsigned_2_byte_index_at_bcp(rdx, 1);
3298   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), rax, rdx);
3299 
3300   // continue
3301   __ bind(done);
3302 }
3303 
3304 
3305 void TemplateTable::newarray() {
3306   transition(itos, atos);
3307   __ push_i(rax);                                 // make sure everything is on the stack
3308   __ load_unsigned_byte(rdx, at_bcp(1));
3309   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::newarray), rdx, rax);
3310   __ pop_i(rdx);                                  // discard size
3311 }
3312 
3313 
3314 void TemplateTable::anewarray() {
3315   transition(itos, atos);
3316   __ get_unsigned_2_byte_index_at_bcp(rdx, 1);
3317   __ get_constant_pool(rcx);
3318   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray), rcx, rdx, rax);
3319 }
3320 
3321 
3322 void TemplateTable::arraylength() {
3323   transition(atos, itos);
3324   __ null_check(rax, arrayOopDesc::length_offset_in_bytes());
3325   __ movl(rax, Address(rax, arrayOopDesc::length_offset_in_bytes()));
3326 }
3327 
3328 
3329 void TemplateTable::checkcast() {
3330   transition(atos, atos);
3331   Label done, is_null, ok_is_subtype, quicked, resolved;
3332   __ testptr(rax, rax);   // Object is in EAX
3333   __ jcc(Assembler::zero, is_null);
3334 
3335   // Get cpool & tags index
3336   __ get_cpool_and_tags(rcx, rdx); // ECX=cpool, EDX=tags array
3337   __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // EBX=index
3338   // See if bytecode has already been quicked
3339   __ cmpb(Address(rdx, rbx, Address::times_1, typeArrayOopDesc::header_size(T_BYTE) * wordSize), JVM_CONSTANT_Class);
3340   __ jcc(Assembler::equal, quicked);
3341 
3342   __ push(atos);
3343   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc) );
3344   __ pop_ptr(rdx);
3345   __ jmpb(resolved);
3346 
3347   // Get superklass in EAX and subklass in EBX
3348   __ bind(quicked);
3349   __ mov(rdx, rax);          // Save object in EDX; EAX needed for subtype check
3350   __ movptr(rax, Address(rcx, rbx, Address::times_ptr, sizeof(constantPoolOopDesc)));
3351 
3352   __ bind(resolved);
3353   __ movptr(rbx, Address(rdx, oopDesc::klass_offset_in_bytes()));
3354 
3355   // Generate subtype check.  Blows ECX.  Resets EDI.  Object in EDX.
3356   // Superklass in EAX.  Subklass in EBX.
3357   __ gen_subtype_check( rbx, ok_is_subtype );
3358 
3359   // Come here on failure
3360   __ push(rdx);
3361   // object is at TOS
3362   __ jump(ExternalAddress(Interpreter::_throw_ClassCastException_entry));
3363 
3364   // Come here on success
3365   __ bind(ok_is_subtype);
3366   __ mov(rax,rdx);           // Restore object in EDX
3367 
3368   // Collect counts on whether this check-cast sees NULLs a lot or not.
3369   if (ProfileInterpreter) {
3370     __ jmp(done);
3371     __ bind(is_null);
3372     __ profile_null_seen(rcx);
3373   } else {
3374     __ bind(is_null);   // same as 'done'
3375   }
3376   __ bind(done);
3377 }
3378 
3379 
3380 void TemplateTable::instanceof() {
3381   transition(atos, itos);
3382   Label done, is_null, ok_is_subtype, quicked, resolved;
3383   __ testptr(rax, rax);
3384   __ jcc(Assembler::zero, is_null);
3385 
3386   // Get cpool & tags index
3387   __ get_cpool_and_tags(rcx, rdx); // ECX=cpool, EDX=tags array
3388   __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // EBX=index
3389   // See if bytecode has already been quicked
3390   __ cmpb(Address(rdx, rbx, Address::times_1, typeArrayOopDesc::header_size(T_BYTE) * wordSize), JVM_CONSTANT_Class);
3391   __ jcc(Assembler::equal, quicked);
3392 
3393   __ push(atos);
3394   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc) );
3395   __ pop_ptr(rdx);
3396   __ movptr(rdx, Address(rdx, oopDesc::klass_offset_in_bytes()));
3397   __ jmp(resolved);
3398 
3399   // Get superklass in EAX and subklass in EDX
3400   __ bind(quicked);
3401   __ movptr(rdx, Address(rax, oopDesc::klass_offset_in_bytes()));
3402   __ movptr(rax, Address(rcx, rbx, Address::times_ptr, sizeof(constantPoolOopDesc)));
3403 
3404   __ bind(resolved);
3405 
3406   // Generate subtype check.  Blows ECX.  Resets EDI.
3407   // Superklass in EAX.  Subklass in EDX.
3408   __ gen_subtype_check( rdx, ok_is_subtype );
3409 
3410   // Come here on failure
3411   __ xorl(rax,rax);
3412   __ jmpb(done);
3413   // Come here on success
3414   __ bind(ok_is_subtype);
3415   __ movl(rax, 1);
3416 
3417   // Collect counts on whether this test sees NULLs a lot or not.
3418   if (ProfileInterpreter) {
3419     __ jmp(done);
3420     __ bind(is_null);
3421     __ profile_null_seen(rcx);
3422   } else {
3423     __ bind(is_null);   // same as 'done'
3424   }
3425   __ bind(done);
3426   // rax, = 0: obj == NULL or  obj is not an instanceof the specified klass
3427   // rax, = 1: obj != NULL and obj is     an instanceof the specified klass
3428 }
3429 
3430 
3431 //----------------------------------------------------------------------------------------------------
3432 // Breakpoints
3433 void TemplateTable::_breakpoint() {
3434 
3435   // Note: We get here even if we are single stepping..
3436   // jbug inists on setting breakpoints at every bytecode
3437   // even if we are in single step mode.
3438 
3439   transition(vtos, vtos);
3440 
3441   // get the unpatched byte code
3442   __ get_method(rcx);
3443   __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::get_original_bytecode_at), rcx, rsi);
3444   __ mov(rbx, rax);
3445 
3446   // post the breakpoint event
3447   __ get_method(rcx);
3448   __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::_breakpoint), rcx, rsi);
3449 
3450   // complete the execution of original bytecode
3451   __ dispatch_only_normal(vtos);
3452 }
3453 
3454 
3455 //----------------------------------------------------------------------------------------------------
3456 // Exceptions
3457 
3458 void TemplateTable::athrow() {
3459   transition(atos, vtos);
3460   __ null_check(rax);
3461   __ jump(ExternalAddress(Interpreter::throw_exception_entry()));
3462 }
3463 
3464 
3465 //----------------------------------------------------------------------------------------------------
3466 // Synchronization
3467 //
3468 // Note: monitorenter & exit are symmetric routines; which is reflected
3469 //       in the assembly code structure as well
3470 //
3471 // Stack layout:
3472 //
3473 // [expressions  ] <--- rsp               = expression stack top
3474 // ..
3475 // [expressions  ]
3476 // [monitor entry] <--- monitor block top = expression stack bot
3477 // ..
3478 // [monitor entry]
3479 // [frame data   ] <--- monitor block bot
3480 // ...
3481 // [saved rbp,    ] <--- rbp,
3482 
3483 
3484 void TemplateTable::monitorenter() {
3485   transition(atos, vtos);
3486 
3487   // check for NULL object
3488   __ null_check(rax);
3489 
3490   const Address monitor_block_top(rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
3491   const Address monitor_block_bot(rbp, frame::interpreter_frame_initial_sp_offset        * wordSize);
3492   const int entry_size =         (     frame::interpreter_frame_monitor_size()           * wordSize);
3493   Label allocated;
3494 
3495   // initialize entry pointer
3496   __ xorl(rdx, rdx);                             // points to free slot or NULL
3497 
3498   // find a free slot in the monitor block (result in rdx)
3499   { Label entry, loop, exit;
3500     __ movptr(rcx, monitor_block_top);            // points to current entry, starting with top-most entry
3501     __ lea(rbx, monitor_block_bot);               // points to word before bottom of monitor block
3502     __ jmpb(entry);
3503 
3504     __ bind(loop);
3505     __ cmpptr(Address(rcx, BasicObjectLock::obj_offset_in_bytes()), (int32_t)NULL_WORD);  // check if current entry is used
3506 
3507 // TODO - need new func here - kbt
3508     if (VM_Version::supports_cmov()) {
3509       __ cmov(Assembler::equal, rdx, rcx);       // if not used then remember entry in rdx
3510     } else {
3511       Label L;
3512       __ jccb(Assembler::notEqual, L);
3513       __ mov(rdx, rcx);                          // if not used then remember entry in rdx
3514       __ bind(L);
3515     }
3516     __ cmpptr(rax, Address(rcx, BasicObjectLock::obj_offset_in_bytes()));   // check if current entry is for same object
3517     __ jccb(Assembler::equal, exit);             // if same object then stop searching
3518     __ addptr(rcx, entry_size);                  // otherwise advance to next entry
3519     __ bind(entry);
3520     __ cmpptr(rcx, rbx);                         // check if bottom reached
3521     __ jcc(Assembler::notEqual, loop);           // if not at bottom then check this entry
3522     __ bind(exit);
3523   }
3524 
3525   __ testptr(rdx, rdx);                          // check if a slot has been found
3526   __ jccb(Assembler::notZero, allocated);        // if found, continue with that one
3527 
3528   // allocate one if there's no free slot
3529   { Label entry, loop;
3530     // 1. compute new pointers                   // rsp: old expression stack top
3531     __ movptr(rdx, monitor_block_bot);           // rdx: old expression stack bottom
3532     __ subptr(rsp, entry_size);                  // move expression stack top
3533     __ subptr(rdx, entry_size);                  // move expression stack bottom
3534     __ mov(rcx, rsp);                            // set start value for copy loop
3535     __ movptr(monitor_block_bot, rdx);           // set new monitor block top
3536     __ jmp(entry);
3537     // 2. move expression stack contents
3538     __ bind(loop);
3539     __ movptr(rbx, Address(rcx, entry_size));    // load expression stack word from old location
3540     __ movptr(Address(rcx, 0), rbx);             // and store it at new location
3541     __ addptr(rcx, wordSize);                    // advance to next word
3542     __ bind(entry);
3543     __ cmpptr(rcx, rdx);                         // check if bottom reached
3544     __ jcc(Assembler::notEqual, loop);           // if not at bottom then copy next word
3545   }
3546 
3547   // call run-time routine
3548   // rdx: points to monitor entry
3549   __ bind(allocated);
3550 
3551   // Increment bcp to point to the next bytecode, so exception handling for async. exceptions work correctly.
3552   // The object has already been poped from the stack, so the expression stack looks correct.
3553   __ increment(rsi);
3554 
3555   __ movptr(Address(rdx, BasicObjectLock::obj_offset_in_bytes()), rax);     // store object
3556   __ lock_object(rdx);
3557 
3558   // check to make sure this monitor doesn't cause stack overflow after locking
3559   __ save_bcp();  // in case of exception
3560   __ generate_stack_overflow_check(0);
3561 
3562   // The bcp has already been incremented. Just need to dispatch to next instruction.
3563   __ dispatch_next(vtos);
3564 }
3565 
3566 
3567 void TemplateTable::monitorexit() {
3568   transition(atos, vtos);
3569 
3570   // check for NULL object
3571   __ null_check(rax);
3572 
3573   const Address monitor_block_top(rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
3574   const Address monitor_block_bot(rbp, frame::interpreter_frame_initial_sp_offset        * wordSize);
3575   const int entry_size =         (     frame::interpreter_frame_monitor_size()           * wordSize);
3576   Label found;
3577 
3578   // find matching slot
3579   { Label entry, loop;
3580     __ movptr(rdx, monitor_block_top);           // points to current entry, starting with top-most entry
3581     __ lea(rbx, monitor_block_bot);             // points to word before bottom of monitor block
3582     __ jmpb(entry);
3583 
3584     __ bind(loop);
3585     __ cmpptr(rax, Address(rdx, BasicObjectLock::obj_offset_in_bytes()));   // check if current entry is for same object
3586     __ jcc(Assembler::equal, found);             // if same object then stop searching
3587     __ addptr(rdx, entry_size);                  // otherwise advance to next entry
3588     __ bind(entry);
3589     __ cmpptr(rdx, rbx);                         // check if bottom reached
3590     __ jcc(Assembler::notEqual, loop);           // if not at bottom then check this entry
3591   }
3592 
3593   // error handling. Unlocking was not block-structured
3594   Label end;
3595   __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_illegal_monitor_state_exception));
3596   __ should_not_reach_here();
3597 
3598   // call run-time routine
3599   // rcx: points to monitor entry
3600   __ bind(found);
3601   __ push_ptr(rax);                                 // make sure object is on stack (contract with oopMaps)
3602   __ unlock_object(rdx);
3603   __ pop_ptr(rax);                                  // discard object
3604   __ bind(end);
3605 }
3606 
3607 
3608 //----------------------------------------------------------------------------------------------------
3609 // Wide instructions
3610 
3611 void TemplateTable::wide() {
3612   transition(vtos, vtos);
3613   __ load_unsigned_byte(rbx, at_bcp(1));
3614   ExternalAddress wtable((address)Interpreter::_wentry_point);
3615   __ jump(ArrayAddress(wtable, Address(noreg, rbx, Address::times_ptr)));
3616   // Note: the rsi increment step is part of the individual wide bytecode implementations
3617 }
3618 
3619 
3620 //----------------------------------------------------------------------------------------------------
3621 // Multi arrays
3622 
3623 void TemplateTable::multianewarray() {
3624   transition(vtos, atos);
3625   __ load_unsigned_byte(rax, at_bcp(3)); // get number of dimensions
3626   // last dim is on top of stack; we want address of first one:
3627   // first_addr = last_addr + (ndims - 1) * stackElementSize - 1*wordsize
3628   // the latter wordSize to point to the beginning of the array.
3629   __ lea(  rax, Address(rsp, rax, Interpreter::stackElementScale(), -wordSize));
3630   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray), rax);     // pass in rax,
3631   __ load_unsigned_byte(rbx, at_bcp(3));
3632   __ lea(rsp, Address(rsp, rbx, Interpreter::stackElementScale()));  // get rid of counts
3633 }
3634 
3635 #endif /* !CC_INTERP */