hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp

Print this page
rev 611 : Merge
   1 #ifdef USE_PRAGMA_IDENT_SRC
   2 #pragma ident "@(#)templateTable_x86_64.cpp     1.58 07/09/17 09:25:59 JVM"
   3 #endif
   4 /*
   5  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
   6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   7  *
   8  * This code is free software; you can redistribute it and/or modify it
   9  * under the terms of the GNU General Public License version 2 only, as
  10  * published by the Free Software Foundation.
  11  *
  12  * This code is distributed in the hope that it will be useful, but WITHOUT
  13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  15  * version 2 for more details (a copy is included in the LICENSE file that
  16  * accompanied this code).
  17  *
  18  * You should have received a copy of the GNU General Public License version
  19  * 2 along with this work; if not, write to the Free Software Foundation,
  20  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  21  *
  22  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  23  * CA 95054 USA or visit www.sun.com if you need additional information or
  24  * have any questions.
  25  *  
  26  */
  27 
  28 #include "incls/_precompiled.incl"
  29 #include "incls/_templateTable_x86_64.cpp.incl"
  30 


  31 #define __ _masm->
  32 
  33 // Platform-dependent initialization
  34 
  35 void TemplateTable::pd_initialize() {
  36   // No amd64 specific initialization
  37 }
  38 
  39 // Address computation: local variables
  40 
  41 static inline Address iaddress(int n) { 
  42   return Address(r14, Interpreter::local_offset_in_bytes(n));
  43 }
  44 
  45 static inline Address laddress(int n) { 
  46   return iaddress(n + 1); 
  47 }
  48 
  49 static inline Address faddress(int n) {
  50   return iaddress(n);


  99 static inline Address at_tos_p3() {
 100   return Address(rsp,  Interpreter::expr_offset_in_bytes(3));
 101 }
 102 
 103 // Condition conversion
 104 static Assembler::Condition j_not(TemplateTable::Condition cc) {
 105   switch (cc) {
 106   case TemplateTable::equal        : return Assembler::notEqual;
 107   case TemplateTable::not_equal    : return Assembler::equal;
 108   case TemplateTable::less         : return Assembler::greaterEqual;
 109   case TemplateTable::less_equal   : return Assembler::greater;
 110   case TemplateTable::greater      : return Assembler::lessEqual;
 111   case TemplateTable::greater_equal: return Assembler::less;
 112   }
 113   ShouldNotReachHere();
 114   return Assembler::zero;
 115 }
 116 
 117 
 118 // Miscelaneous helper routines































































 119 
 120 Address TemplateTable::at_bcp(int offset) {
 121   assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
 122   return Address(r13, offset);
 123 }
 124 
 125 void TemplateTable::patch_bytecode(Bytecodes::Code bytecode, Register bc,
 126                                    Register scratch,
 127                                    bool load_bc_into_scratch/*=true*/) {
 128   if (!RewriteBytecodes) {
 129     return;
 130   }
 131   // the pair bytecodes have already done the load.
 132   if (load_bc_into_scratch) {
 133     __ movl(bc, bytecode);
 134   }
 135   Label patch_done;
 136   if (JvmtiExport::can_post_breakpoint()) {
 137     Label fast_patch;
 138     // if a breakpoint is present we can't rewrite the stream directly


 303 #ifdef ASSERT
 304   { 
 305     Label L;
 306     __ cmpl(rdx, JVM_CONSTANT_Integer);
 307     __ jcc(Assembler::equal, L);
 308     __ cmpl(rdx, JVM_CONSTANT_String);
 309     __ jcc(Assembler::equal, L);
 310     __ stop("unexpected tag type in ldc");
 311     __ bind(L);
 312   }
 313 #endif
 314   // atos and itos
 315   Label isOop;
 316   __ cmpl(rdx, JVM_CONSTANT_Integer);
 317   __ jcc(Assembler::notEqual, isOop);
 318   __ movl(rax, Address(rcx, rbx, Address::times_8, base_offset));
 319   __ push_i(rax);
 320   __ jmp(Done);
 321 
 322   __ bind(isOop);
 323   __ movq(rax, Address(rcx, rbx, Address::times_8, base_offset));
 324   __ push_ptr(rax);
 325 
 326   if (VerifyOops) {
 327     __ verify_oop(rax);
 328   }
 329 
 330   __ bind(Done);
 331 }
 332 
 333 void TemplateTable::ldc2_w() {
 334   transition(vtos, vtos);
 335   Label Long, Done;
 336   __ get_unsigned_2_byte_index_at_bcp(rbx, 1);
 337 
 338   __ get_cpool_and_tags(rcx, rax);
 339   const int base_offset = constantPoolOopDesc::header_size() * wordSize;
 340   const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
 341 
 342   // get type
 343   __ cmpb(Address(rax, rbx, Address::times_1, tags_offset), 
 344           JVM_CONSTANT_Double);
 345   __ jccb(Assembler::notEqual, Long);
 346   // dtos
 347   __ movdbl(xmm0, Address(rcx, rbx, Address::times_8, base_offset));
 348   __ push_d();
 349   __ jmpb(Done);
 350 
 351   __ bind(Long);
 352   // ltos
 353   __ movq(rax, Address(rcx, rbx, Address::times_8, base_offset));
 354   __ push_l();
 355 
 356   __ bind(Done);
 357 }
 358 
 359 void TemplateTable::locals_index(Register reg, int offset) {
 360   __ load_unsigned_byte(reg, at_bcp(offset));
 361   __ negq(reg); 
 362   if (TaggedStackInterpreter) __ shlq(reg, 1);  // index = index*2
 363 }
 364 
 365 void TemplateTable::iload() {
 366   transition(vtos, itos);
 367   if (RewriteFrequentPairs) { 
 368     Label rewrite, done;
 369     const Register bc = c_rarg3;
 370     assert(rbx != bc, "register damaged");
 371 
 372     // get next byte
 373     __ load_unsigned_byte(rbx, 
 374                           at_bcp(Bytecodes::length_for(Bytecodes::_iload)));
 375     // if _iload, wait to rewrite to iload2.  We only want to rewrite the
 376     // last two iloads in a pair.  Comparing against fast_iload means that
 377     // the next bytecode is neither an iload or a caload, and therefore
 378     // an iload pair.
 379     __ cmpl(rbx, Bytecodes::_iload);
 380     __ jcc(Assembler::equal, done);
 381 
 382     __ cmpl(rbx, Bytecodes::_fast_iload);


 429   debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
 430 }
 431 
 432 void TemplateTable::fload() {
 433   transition(vtos, ftos);
 434   locals_index(rbx);
 435   __ movflt(xmm0, faddress(rbx));
 436   debug_only(__ verify_local_tag(frame::TagValue, rbx));
 437 }
 438 
 439 void TemplateTable::dload() {
 440   transition(vtos, dtos);
 441   locals_index(rbx);
 442   __ movdbl(xmm0, daddress(rbx));
 443   debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
 444 }
 445 
 446 void TemplateTable::aload() {
 447   transition(vtos, atos);
 448   locals_index(rbx);
 449   __ movq(rax, aaddress(rbx));
 450   debug_only(__ verify_local_tag(frame::TagReference, rbx));
 451 }
 452 
 453 void TemplateTable::locals_index_wide(Register reg) {
 454   __ movl(reg, at_bcp(2));
 455   __ bswapl(reg);
 456   __ shrl(reg, 16);
 457   __ negq(reg);
 458   if (TaggedStackInterpreter) __ shlq(reg, 1);  // index = index*2
 459 }
 460 
 461 void TemplateTable::wide_iload() {
 462   transition(vtos, itos);
 463   locals_index_wide(rbx);
 464   __ movl(rax, iaddress(rbx));
 465   debug_only(__ verify_local_tag(frame::TagValue, rbx));
 466 }
 467 
 468 void TemplateTable::wide_lload() {
 469   transition(vtos, ltos);
 470   locals_index_wide(rbx);
 471   __ movq(rax, laddress(rbx));
 472   debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
 473 }
 474 
 475 void TemplateTable::wide_fload() {
 476   transition(vtos, ftos);
 477   locals_index_wide(rbx);
 478   __ movflt(xmm0, faddress(rbx));
 479   debug_only(__ verify_local_tag(frame::TagValue, rbx));
 480 }
 481 
 482 void TemplateTable::wide_dload() {
 483   transition(vtos, dtos);
 484   locals_index_wide(rbx);
 485   __ movdbl(xmm0, daddress(rbx));
 486   debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
 487 }
 488 
 489 void TemplateTable::wide_aload() {
 490   transition(vtos, atos);
 491   locals_index_wide(rbx);
 492   __ movq(rax, aaddress(rbx));
 493   debug_only(__ verify_local_tag(frame::TagReference, rbx));
 494 }
 495 
 496 void TemplateTable::index_check(Register array, Register index) {
 497   // destroys rbx
 498   // check array
 499   __ null_check(array, arrayOopDesc::length_offset_in_bytes());
 500   // sign extend index for use by indexed load
 501   __ movslq(index, index);
 502   // check index
 503   __ cmpl(index, Address(array, arrayOopDesc::length_offset_in_bytes()));
 504   if (index != rbx) {
 505     // ??? convention: move aberrant index into ebx for exception message
 506     assert(rbx != array, "different registers");
 507     __ movl(rbx, index);
 508   }
 509   __ jump_cc(Assembler::aboveEqual,
 510              ExternalAddress(Interpreter::_throw_ArrayIndexOutOfBoundsException_entry));
 511 }
 512 
 513 void TemplateTable::iaload() {
 514   transition(itos, itos);
 515   __ pop_ptr(rdx);
 516   // eax: index
 517   // rdx: array
 518   index_check(rdx, rax); // kills rbx
 519   __ movl(rax, Address(rdx, rax, 
 520                        Address::times_4,
 521                        arrayOopDesc::base_offset_in_bytes(T_INT)));


 543                          arrayOopDesc::base_offset_in_bytes(T_FLOAT)));
 544 }
 545 
 546 void TemplateTable::daload() {
 547   transition(itos, dtos);
 548   __ pop_ptr(rdx);
 549   // eax: index
 550   // rdx: array
 551   index_check(rdx, rax); // kills rbx
 552   __ movdbl(xmm0, Address(rdx, rax, 
 553                           Address::times_8,
 554                           arrayOopDesc::base_offset_in_bytes(T_DOUBLE)));
 555 }
 556 
 557 void TemplateTable::aaload() {
 558   transition(itos, atos);
 559   __ pop_ptr(rdx);
 560   // eax: index
 561   // rdx: array
 562   index_check(rdx, rax); // kills rbx
 563   __ movq(rax, Address(rdx, rax, 
 564                        Address::times_8,
 565                        arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
 566 }
 567 
 568 void TemplateTable::baload() {
 569   transition(itos, itos);
 570   __ pop_ptr(rdx);
 571   // eax: index
 572   // rdx: array
 573   index_check(rdx, rax); // kills rbx
 574   __ load_signed_byte(rax, 
 575                       Address(rdx, rax, 
 576                               Address::times_1, 
 577                               arrayOopDesc::base_offset_in_bytes(T_BYTE)));
 578 }
 579 
 580 void TemplateTable::caload() {
 581   transition(itos, itos);
 582   __ pop_ptr(rdx);
 583   // eax: index
 584   // rdx: array


 628 void TemplateTable::lload(int n) {
 629   transition(vtos, ltos);
 630   __ movq(rax, laddress(n));
 631   debug_only(__ verify_local_tag(frame::TagCategory2, n));
 632 }
 633 
 634 void TemplateTable::fload(int n) {
 635   transition(vtos, ftos);
 636   __ movflt(xmm0, faddress(n));
 637   debug_only(__ verify_local_tag(frame::TagValue, n));
 638 }
 639 
 640 void TemplateTable::dload(int n) {
 641   transition(vtos, dtos);
 642   __ movdbl(xmm0, daddress(n));
 643   debug_only(__ verify_local_tag(frame::TagCategory2, n));
 644 }
 645 
 646 void TemplateTable::aload(int n) {
 647   transition(vtos, atos);
 648   __ movq(rax, aaddress(n));
 649   debug_only(__ verify_local_tag(frame::TagReference, n));
 650 }
 651 
 652 void TemplateTable::aload_0() {
 653   transition(vtos, atos);
 654   // According to bytecode histograms, the pairs:
 655   //
 656   // _aload_0, _fast_igetfield
 657   // _aload_0, _fast_agetfield
 658   // _aload_0, _fast_fgetfield
 659   //
 660   // occur frequently. If RewriteFrequentPairs is set, the (slow)
 661   // _aload_0 bytecode checks if the next bytecode is either
 662   // _fast_igetfield, _fast_agetfield or _fast_fgetfield and then
 663   // rewrites the current bytecode into a pair bytecode; otherwise it
 664   // rewrites the current bytecode into _fast_aload_0 that doesn't do
 665   // the pair check anymore.
 666   //
 667   // Note: If the next bytecode is _getfield, the rewrite must be
 668   //       delayed, otherwise we may miss an opportunity for a pair.


 743 }
 744 
 745 void TemplateTable::fstore() {
 746   transition(ftos, vtos);
 747   locals_index(rbx);
 748   __ movflt(faddress(rbx), xmm0);
 749   __ tag_local(frame::TagValue, rbx);
 750 }
 751 
 752 void TemplateTable::dstore() {
 753   transition(dtos, vtos);
 754   locals_index(rbx);
 755   __ movdbl(daddress(rbx), xmm0);
 756   __ tag_local(frame::TagCategory2, rbx);
 757 }
 758 
 759 void TemplateTable::astore() {
 760   transition(vtos, vtos);
 761   __ pop_ptr(rax, rdx);    // will need to pop tag too
 762   locals_index(rbx);
 763   __ movq(aaddress(rbx), rax);
 764   __ tag_local(rdx, rbx);  // store tag from stack, might be returnAddr
 765 }
 766 
 767 void TemplateTable::wide_istore() {
 768   transition(vtos, vtos);
 769   __ pop_i();
 770   locals_index_wide(rbx);
 771   __ movl(iaddress(rbx), rax);
 772   __ tag_local(frame::TagValue, rbx);
 773 }
 774 
 775 void TemplateTable::wide_lstore() {
 776   transition(vtos, vtos);
 777   __ pop_l();
 778   locals_index_wide(rbx);
 779   __ movq(laddress(rbx), rax);
 780   __ tag_local(frame::TagCategory2, rbx);
 781 }
 782 
 783 void TemplateTable::wide_fstore() {
 784   transition(vtos, vtos);
 785   __ pop_f();
 786   locals_index_wide(rbx);
 787   __ movflt(faddress(rbx), xmm0);
 788   __ tag_local(frame::TagValue, rbx);
 789 }
 790 
 791 void TemplateTable::wide_dstore() {
 792   transition(vtos, vtos);
 793   __ pop_d();
 794   locals_index_wide(rbx);
 795   __ movdbl(daddress(rbx), xmm0);
 796   __ tag_local(frame::TagCategory2, rbx);
 797 }
 798 
 799 void TemplateTable::wide_astore() {
 800   transition(vtos, vtos);
 801   __ pop_ptr(rax, rdx);    // will need to pop tag too
 802   locals_index_wide(rbx);
 803   __ movq(aaddress(rbx), rax);
 804   __ tag_local(rdx, rbx);  // store tag from stack, might be returnAddr
 805 }
 806 
 807 void TemplateTable::iastore() {
 808   transition(itos, vtos);
 809   __ pop_i(rbx);
 810   __ pop_ptr(rdx);
 811   // eax: value
 812   // ebx: index
 813   // rdx: array
 814   index_check(rdx, rbx); // prefer index in ebx
 815   __ movl(Address(rdx, rbx, 
 816                   Address::times_4,
 817                   arrayOopDesc::base_offset_in_bytes(T_INT)),
 818           rax);
 819 }
 820 
 821 void TemplateTable::lastore() {
 822   transition(ltos, vtos);
 823   __ pop_i(rbx);


 847 }
 848 
 849 void TemplateTable::dastore() {
 850   transition(dtos, vtos);
 851   __ pop_i(rbx);
 852   __ pop_ptr(rdx);
 853   // xmm0: value
 854   // ebx:  index
 855   // rdx:  array
 856   index_check(rdx, rbx); // prefer index in ebx
 857   __ movdbl(Address(rdx, rbx, 
 858                    Address::times_8, 
 859                    arrayOopDesc::base_offset_in_bytes(T_DOUBLE)),
 860            xmm0);
 861 }
 862 
 863 void TemplateTable::aastore() {
 864   Label is_null, ok_is_subtype, done;
 865   transition(vtos, vtos);
 866   // stack: ..., array, index, value
 867   __ movq(rax, at_tos());    // value
 868   __ movl(rcx, at_tos_p1()); // index
 869   __ movq(rdx, at_tos_p2()); // array





 870   index_check(rdx, rcx);     // kills rbx
 871   // do array store check - check for NULL value first
 872   __ testq(rax, rax);
 873   __ jcc(Assembler::zero, is_null);
 874 
 875   // Move subklass into rbx
 876   __ movq(rbx, Address(rax, oopDesc::klass_offset_in_bytes()));
 877   // Move superklass into rax
 878   __ movq(rax, Address(rdx, oopDesc::klass_offset_in_bytes()));
 879   __ movq(rax, Address(rax, 
 880                        sizeof(oopDesc) + 
 881                        objArrayKlass::element_klass_offset_in_bytes()));
 882   // Compress array + index*8 + 12 into a single register.  Frees rcx.
 883   __ leaq(rdx, Address(rdx, rcx, 
 884                        Address::times_8, 
 885                        arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
 886 
 887   // Generate subtype check.  Blows rcx, rdi
 888   // Superklass in rax.  Subklass in rbx.
 889   __ gen_subtype_check(rbx, ok_is_subtype);
 890 
 891   // Come here on failure
 892   // object is at TOS
 893   __ jump(ExternalAddress(Interpreter::_throw_ArrayStoreException_entry));
 894 
 895   // Come here on success
 896   __ bind(ok_is_subtype);
 897   __ movq(rax, at_tos()); // Value
 898   __ movq(Address(rdx, 0), rax);
 899   __ store_check(rdx);


 900   __ jmp(done);
 901 
 902   // Have a NULL in rax, rdx=array, ecx=index.  Store NULL at ary[idx]
 903   __ bind(is_null);
 904   __ profile_null_seen(rbx);
 905   __ movq(Address(rdx, rcx, 
 906                   Address::times_8, 
 907                   arrayOopDesc::base_offset_in_bytes(T_OBJECT)), 
 908           rax);
 909 
 910   // Pop stack arguments
 911   __ bind(done);
 912   __ addq(rsp, 3 * Interpreter::stackElementSize());
 913 }
 914 
 915 void TemplateTable::bastore() {
 916   transition(itos, vtos);
 917   __ pop_i(rbx);
 918   __ pop_ptr(rdx);
 919   // eax: value
 920   // ebx: index
 921   // rdx: array
 922   index_check(rdx, rbx); // prefer index in ebx
 923   __ movb(Address(rdx, rbx, 
 924                   Address::times_1, 
 925                   arrayOopDesc::base_offset_in_bytes(T_BYTE)), 
 926           rax);
 927 }
 928 
 929 void TemplateTable::castore() {
 930   transition(itos, vtos);
 931   __ pop_i(rbx);
 932   __ pop_ptr(rdx);


 954   transition(ltos, vtos);
 955   __ movq(laddress(n), rax);
 956   __ tag_local(frame::TagCategory2, n);
 957 }
 958 
 959 void TemplateTable::fstore(int n) {
 960   transition(ftos, vtos);
 961   __ movflt(faddress(n), xmm0);
 962   __ tag_local(frame::TagValue, n);
 963 }
 964 
 965 void TemplateTable::dstore(int n) {
 966   transition(dtos, vtos);
 967   __ movdbl(daddress(n), xmm0);
 968   __ tag_local(frame::TagCategory2, n);
 969 }
 970 
 971 void TemplateTable::astore(int n) {
 972   transition(vtos, vtos);
 973   __ pop_ptr(rax, rdx);
 974   __ movq(aaddress(n), rax);
 975   __ tag_local(rdx, n);
 976 }
 977 
 978 void TemplateTable::pop() {
 979   transition(vtos, vtos);
 980   __ addq(rsp, Interpreter::stackElementSize());
 981 }
 982 
 983 void TemplateTable::pop2() {
 984   transition(vtos, vtos);
 985   __ addq(rsp, 2 * Interpreter::stackElementSize());
 986 }
 987 
 988 void TemplateTable::dup() {
 989   transition(vtos, vtos);
 990   __ load_ptr_and_tag(0, rax, rdx);
 991   __ push_ptr(rax, rdx);
 992   // stack: ..., a, a
 993 }
 994 
 995 void TemplateTable::dup_x1() {
 996   transition(vtos, vtos);
 997   // stack: ..., a, b
 998   __ load_ptr_and_tag(0, rax, rdx);  // load b
 999   __ load_ptr_and_tag(1, rcx, rbx);  // load a
1000   __ store_ptr_and_tag(1, rax, rdx); // store b
1001   __ store_ptr_and_tag(0, rcx, rbx); // store a
1002   __ push_ptr(rax, rdx);             // push b
1003   // stack: ..., b, a, b
1004 }
1005 


1076 
1077 void TemplateTable::iop2(Operation op) {
1078   transition(itos, itos);
1079   switch (op) {
1080   case add  :                    __ pop_i(rdx); __ addl (rax, rdx); break;
1081   case sub  : __ movl(rdx, rax); __ pop_i(rax); __ subl (rax, rdx); break;
1082   case mul  :                    __ pop_i(rdx); __ imull(rax, rdx); break;
1083   case _and :                    __ pop_i(rdx); __ andl (rax, rdx); break;
1084   case _or  :                    __ pop_i(rdx); __ orl  (rax, rdx); break;
1085   case _xor :                    __ pop_i(rdx); __ xorl (rax, rdx); break;
1086   case shl  : __ movl(rcx, rax); __ pop_i(rax); __ shll (rax);      break;
1087   case shr  : __ movl(rcx, rax); __ pop_i(rax); __ sarl (rax);      break;
1088   case ushr : __ movl(rcx, rax); __ pop_i(rax); __ shrl (rax);      break;
1089   default   : ShouldNotReachHere();
1090   }
1091 }
1092 
1093 void TemplateTable::lop2(Operation op) {
1094   transition(ltos, ltos);
1095   switch (op) {
1096   case add  :                    __ pop_l(rdx); __ addq (rax, rdx); break;
1097   case sub  : __ movq(rdx, rax); __ pop_l(rax); __ subq (rax, rdx); break;
1098   case _and :                    __ pop_l(rdx); __ andq (rax, rdx); break;
1099   case _or  :                    __ pop_l(rdx); __ orq  (rax, rdx); break;
1100   case _xor :                    __ pop_l(rdx); __ xorq (rax, rdx); break;
1101   default : ShouldNotReachHere();
1102   }
1103 }
1104 
1105 void TemplateTable::idiv() {
1106   transition(itos, itos);
1107   __ movl(rcx, rax);
1108   __ pop_i(rax);
1109   // Note: could xor eax and ecx and compare with (-1 ^ min_int). If
1110   //       they are not equal, one could do a normal division (no correction
1111   //       needed), which may speed up this implementation for the common case.
1112   //       (see also JVM spec., p.243 & p.271)
1113   __ corrected_idivl(rcx);
1114 }
1115 
1116 void TemplateTable::irem() {
1117   transition(itos, itos);
1118   __ movl(rcx, rax);
1119   __ pop_i(rax);
1120   // Note: could xor eax and ecx and compare with (-1 ^ min_int). If
1121   //       they are not equal, one could do a normal division (no correction
1122   //       needed), which may speed up this implementation for the common case.
1123   //       (see also JVM spec., p.243 & p.271)
1124   __ corrected_idivl(rcx);
1125   __ movl(rax, rdx);
1126 }
1127 
1128 void TemplateTable::lmul() {
1129   transition(ltos, ltos);
1130   __ pop_l(rdx);
1131   __ imulq(rax, rdx);
1132 }
1133 
1134 void TemplateTable::ldiv() {
1135   transition(ltos, ltos);
1136   __ movq(rcx, rax);
1137   __ pop_l(rax);
1138   // generate explicit div0 check
1139   __ testq(rcx, rcx);
1140   __ jump_cc(Assembler::zero,
1141              ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
1142   // Note: could xor rax and rcx and compare with (-1 ^ min_int). If
1143   //       they are not equal, one could do a normal division (no correction
1144   //       needed), which may speed up this implementation for the common case.
1145   //       (see also JVM spec., p.243 & p.271)
1146   __ corrected_idivq(rcx); // kills rbx
1147 }
1148 
1149 void TemplateTable::lrem() {
1150   transition(ltos, ltos);
1151   __ movq(rcx, rax);
1152   __ pop_l(rax);
1153   __ testq(rcx, rcx);
1154   __ jump_cc(Assembler::zero,
1155              ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
1156   // Note: could xor rax and rcx and compare with (-1 ^ min_int). If
1157   //       they are not equal, one could do a normal division (no correction
1158   //       needed), which may speed up this implementation for the common case.
1159   //       (see also JVM spec., p.243 & p.271)
1160   __ corrected_idivq(rcx); // kills rbx
1161   __ movq(rax, rdx);
1162 }
1163 
1164 void TemplateTable::lshl() {
1165   transition(itos, ltos);
1166   __ movl(rcx, rax);                             // get shift count
1167   __ pop_l(rax);                                 // get shift value
1168   __ shlq(rax);
1169 }
1170 
1171 void TemplateTable::lshr() {
1172   transition(itos, ltos);
1173   __ movl(rcx, rax);                             // get shift count
1174   __ pop_l(rax);                                 // get shift value
1175   __ sarq(rax);
1176 }
1177 
1178 void TemplateTable::lushr() {
1179   transition(itos, ltos);
1180   __ movl(rcx, rax);                             // get shift count
1181   __ pop_l(rax);                                 // get shift value
1182   __ shrq(rax);
1183 }
1184 
1185 void TemplateTable::fop2(Operation op) {
1186   transition(ftos, ftos);
1187   switch (op) {
1188   case add:
1189     __ addss(xmm0, at_rsp());
1190     __ addq(rsp, Interpreter::stackElementSize());
1191     break;
1192   case sub:
1193     __ movflt(xmm1, xmm0);
1194     __ pop_f(xmm0);
1195     __ subss(xmm0, xmm1);
1196     break;
1197   case mul:
1198     __ mulss(xmm0, at_rsp());
1199     __ addq(rsp, Interpreter::stackElementSize());
1200     break;
1201   case div:
1202     __ movflt(xmm1, xmm0);
1203     __ pop_f(xmm0);
1204     __ divss(xmm0, xmm1);
1205     break;
1206   case rem:
1207     __ movflt(xmm1, xmm0);
1208     __ pop_f(xmm0);
1209     __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::frem), 2);
1210     break;
1211   default:
1212     ShouldNotReachHere();
1213     break;
1214   }
1215 }
1216 
1217 void TemplateTable::dop2(Operation op) {
1218   transition(dtos, dtos);
1219   switch (op) {
1220   case add:
1221     __ addsd(xmm0, at_rsp());
1222     __ addq(rsp, 2 * Interpreter::stackElementSize());
1223     break;
1224   case sub:
1225     __ movdbl(xmm1, xmm0);
1226     __ pop_d(xmm0); 
1227     __ subsd(xmm0, xmm1);
1228     break;
1229   case mul:
1230     __ mulsd(xmm0, at_rsp());
1231     __ addq(rsp, 2 * Interpreter::stackElementSize());
1232     break;
1233   case div:
1234     __ movdbl(xmm1, xmm0);
1235     __ pop_d(xmm0);
1236     __ divsd(xmm0, xmm1);
1237     break;
1238   case rem:
1239     __ movdbl(xmm1, xmm0);
1240     __ pop_d(xmm0);
1241     __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::drem), 2);
1242     break;
1243   default:
1244     ShouldNotReachHere();
1245     break;
1246   }
1247 }
1248 
1249 void TemplateTable::ineg() {
1250   transition(itos, itos);
1251   __ negl(rax);


1472 }
1473 
1474 void TemplateTable::branch(bool is_jsr, bool is_wide) {
1475   __ get_method(rcx); // rcx holds method
1476   __ profile_taken_branch(rax, rbx); // rax holds updated MDP, rbx
1477                                      // holds bumped taken count
1478 
1479   const ByteSize be_offset = methodOopDesc::backedge_counter_offset() + 
1480                              InvocationCounter::counter_offset();
1481   const ByteSize inv_offset = methodOopDesc::invocation_counter_offset() +
1482                               InvocationCounter::counter_offset();
1483   const int method_offset = frame::interpreter_frame_method_offset * wordSize;
1484 
1485   // Load up edx with the branch displacement
1486   __ movl(rdx, at_bcp(1));
1487   __ bswapl(rdx);
1488 
1489   if (!is_wide) {
1490     __ sarl(rdx, 16);
1491   }
1492   __ movslq(rdx, rdx);
1493 
1494   // Handle all the JSR stuff here, then exit.
1495   // It's much shorter and cleaner than intermingling with the non-JSR
1496   // normal-branch stuff occuring below.
1497   if (is_jsr) {
1498     // Pre-load the next target bytecode into rbx
1499     __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1, 0));
1500 
1501     // compute return address as bci in rax
1502     __ leaq(rax, at_bcp((is_wide ? 5 : 3) -
1503                         in_bytes(constMethodOopDesc::codes_offset())));
1504     __ subq(rax, Address(rcx, methodOopDesc::const_offset()));
1505     // Adjust the bcp in r13 by the displacement in rdx
1506     __ addq(r13, rdx);
1507     // jsr returns atos that is not an oop
1508     __ push_i(rax);
1509     __ dispatch_only(vtos);
1510     return;
1511   }
1512 
1513   // Normal (non-jsr) branch handling
1514 
1515   // Adjust the bcp in r13 by the displacement in rdx  
1516   __ addq(r13, rdx);
1517 
1518   assert(UseLoopCounter || !UseOnStackReplacement, 
1519          "on-stack-replacement requires loop counters");
1520   Label backedge_counter_overflow;
1521   Label profile_method;
1522   Label dispatch;
1523   if (UseLoopCounter) {
1524     // increment backedge counter for backward branches
1525     // rax: MDO
1526     // ebx: MDO bumped taken-count
1527     // rcx: method
1528     // rdx: target offset
1529     // r13: target bcp
1530     // r14: locals pointer
1531     __ testl(rdx, rdx);             // check if forward or backward branch
1532     __ jcc(Assembler::positive, dispatch); // count only if backward branch
1533 
1534     // increment counter 
1535     __ movl(rax, Address(rcx, be_offset));        // load backedge counter
1536     __ incrementl(rax, InvocationCounter::count_increment); // increment


1580     __ bind(dispatch);
1581   }
1582 
1583   // Pre-load the next target bytecode into rbx
1584   __ load_unsigned_byte(rbx, Address(r13, 0));
1585 
1586   // continue with the bytecode @ target
1587   // eax: return bci for jsr's, unused otherwise
1588   // ebx: target bytecode
1589   // r13: target bcp
1590   __ dispatch_only(vtos);
1591 
1592   if (UseLoopCounter) {
1593     if (ProfileInterpreter) {
1594       // Out-of-line code to allocate method data oop.
1595       __ bind(profile_method);
1596       __ call_VM(noreg, 
1597                  CAST_FROM_FN_PTR(address, 
1598                                   InterpreterRuntime::profile_method), r13);
1599       __ load_unsigned_byte(rbx, Address(r13, 0));  // restore target bytecode
1600       __ movq(rcx, Address(rbp, method_offset));
1601       __ movq(rcx, Address(rcx, 
1602                            in_bytes(methodOopDesc::method_data_offset())));
1603       __ movq(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize),
1604               rcx);
1605       __ test_method_data_pointer(rcx, dispatch);
1606       // offset non-null mdp by MDO::data_offset() + IR::profile_method()
1607       __ addq(rcx, in_bytes(methodDataOopDesc::data_offset()));
1608       __ addq(rcx, rax);
1609       __ movq(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize),
1610               rcx);
1611       __ jmp(dispatch);
1612     }
1613 
1614     if (UseOnStackReplacement) {
1615       // invocation counter overflow
1616       __ bind(backedge_counter_overflow);
1617       __ negq(rdx);
1618       __ addq(rdx, r13); // branch bcp
1619       // IcoResult frequency_counter_overflow([JavaThread*], address branch_bcp)
1620       __ call_VM(noreg,
1621                  CAST_FROM_FN_PTR(address, 
1622                                   InterpreterRuntime::frequency_counter_overflow),
1623                  rdx);
1624       __ load_unsigned_byte(rbx, Address(r13, 0));  // restore target bytecode
1625 
1626       // rax: osr nmethod (osr ok) or NULL (osr not possible)
1627       // ebx: target bytecode
1628       // rdx: scratch
1629       // r14: locals pointer
1630       // r13: bcp
1631       __ testq(rax, rax);                        // test result
1632       __ jcc(Assembler::zero, dispatch);         // no osr if null
1633       // nmethod may have been invalidated (VM may block upon call_VM return)
1634       __ movl(rcx, Address(rax, nmethod::entry_bci_offset()));
1635       __ cmpl(rcx, InvalidOSREntryBci);
1636       __ jcc(Assembler::equal, dispatch);
1637       
1638       // We have the address of an on stack replacement routine in eax        
1639       // We need to prepare to execute the OSR method. First we must
1640       // migrate the locals and monitors off of the stack.
1641 
1642       __ movq(r13, rax);                             // save the nmethod
1643 
1644       call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin));
1645 
1646       // eax is OSR buffer, move it to expected parameter location
1647       __ movq(j_rarg0, rax);
1648 
1649       // We use j_rarg definitions here so that registers don't conflict as parameter
1650       // registers change across platforms as we are in the midst of a calling
1651       // sequence to the OSR nmethod and we don't want collision. These are NOT parameters.
1652 
1653       const Register retaddr = j_rarg2;
1654       const Register sender_sp = j_rarg1;
1655 
1656       // pop the interpreter frame
1657       __ movq(sender_sp, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); // get sender sp
1658       __ leave();                                // remove frame anchor
1659       __ popq(retaddr);                            // get return address
1660       __ movq(rsp, sender_sp);                   // set sp to sender sp
1661       // Ensure compiled code always sees stack at proper alignment
1662       __ andq(rsp, -(StackAlignmentInBytes));
1663 
1664       // unlike x86 we need no specialized return from compiled code
1665       // to the interpreter or the call stub.
1666 
1667       // push the return address
1668       __ pushq(retaddr);
1669 
1670       // and begin the OSR nmethod
1671       __ jmp(Address(r13, nmethod::osr_entry_point_offset()));
1672     }
1673   }
1674 }
1675 
1676 
1677 void TemplateTable::if_0cmp(Condition cc) {
1678   transition(itos, vtos);
1679   // assume branch is more often taken than not (loops use backward branches)
1680   Label not_taken;
1681   __ testl(rax, rax);
1682   __ jcc(j_not(cc), not_taken);
1683   branch(false, false);
1684   __ bind(not_taken);
1685   __ profile_not_taken_branch(rax);
1686 }
1687 
1688 void TemplateTable::if_icmp(Condition cc) {
1689   transition(itos, vtos);
1690   // assume branch is more often taken than not (loops use backward branches)
1691   Label not_taken;
1692   __ pop_i(rdx);
1693   __ cmpl(rdx, rax);
1694   __ jcc(j_not(cc), not_taken);
1695   branch(false, false);
1696   __ bind(not_taken);
1697   __ profile_not_taken_branch(rax);
1698 }
1699 
1700 void TemplateTable::if_nullcmp(Condition cc) {
1701   transition(atos, vtos);
1702   // assume branch is more often taken than not (loops use backward branches)
1703   Label not_taken;
1704   __ testq(rax, rax);
1705   __ jcc(j_not(cc), not_taken);
1706   branch(false, false);
1707   __ bind(not_taken);
1708   __ profile_not_taken_branch(rax);
1709 }
1710 
1711 void TemplateTable::if_acmp(Condition cc) {
1712   transition(atos, vtos);
1713   // assume branch is more often taken than not (loops use backward branches)
1714   Label not_taken;
1715   __ pop_ptr(rdx);
1716   __ cmpq(rdx, rax);
1717   __ jcc(j_not(cc), not_taken);
1718   branch(false, false);
1719   __ bind(not_taken);
1720   __ profile_not_taken_branch(rax);
1721 }
1722 
1723 void TemplateTable::ret() {
1724   transition(vtos, vtos);
1725   locals_index(rbx);
1726   __ movq(rbx, aaddress(rbx)); // get return bci, compute return bcp
1727   __ profile_ret(rbx, rcx);
1728   __ get_method(rax);
1729   __ movq(r13, Address(rax, methodOopDesc::const_offset()));
1730   __ leaq(r13, Address(r13, rbx, Address::times_1,
1731                        constMethodOopDesc::codes_offset()));
1732   __ dispatch_next(vtos);
1733 }
1734 
1735 void TemplateTable::wide_ret() {
1736   transition(vtos, vtos);
1737   locals_index_wide(rbx);
1738   __ movq(rbx, aaddress(rbx)); // get return bci, compute return bcp
1739   __ profile_ret(rbx, rcx);
1740   __ get_method(rax);
1741   __ movq(r13, Address(rax, methodOopDesc::const_offset()));
1742   __ leaq(r13, Address(r13, rbx, Address::times_1, constMethodOopDesc::codes_offset()));
1743   __ dispatch_next(vtos);
1744 }
1745 
1746 void TemplateTable::tableswitch() {
1747   Label default_case, continue_execution;
1748   transition(itos, vtos);
1749   // align r13
1750   __ leaq(rbx, at_bcp(BytesPerInt));
1751   __ andq(rbx, -BytesPerInt);
1752   // load lo & hi
1753   __ movl(rcx, Address(rbx, BytesPerInt));
1754   __ movl(rdx, Address(rbx, 2 * BytesPerInt));
1755   __ bswapl(rcx);
1756   __ bswapl(rdx);
1757   // check against lo & hi
1758   __ cmpl(rax, rcx);
1759   __ jcc(Assembler::less, default_case);
1760   __ cmpl(rax, rdx);
1761   __ jcc(Assembler::greater, default_case);
1762   // lookup dispatch offset
1763   __ subl(rax, rcx);
1764   __ movl(rdx, Address(rbx, rax, Address::times_4, 3 * BytesPerInt));
1765   __ profile_switch_case(rax, rbx, rcx);
1766   // continue execution
1767   __ bind(continue_execution);
1768   __ bswapl(rdx);
1769   __ movslq(rdx, rdx);
1770   __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1));
1771   __ addq(r13, rdx);
1772   __ dispatch_only(vtos);
1773   // handle default
1774   __ bind(default_case);
1775   __ profile_switch_default(rax);
1776   __ movl(rdx, Address(rbx, 0));
1777   __ jmp(continue_execution);
1778 }
1779 
1780 void TemplateTable::lookupswitch() {
1781   transition(itos, itos);
1782   __ stop("lookupswitch bytecode should have been rewritten");
1783 }
1784 
1785 void TemplateTable::fast_linearswitch() {
1786   transition(itos, vtos);
1787   Label loop_entry, loop, found, continue_execution;  
1788   // bswap rax so we can avoid bswapping the table entries
1789   __ bswapl(rax);
1790   // align r13
1791   __ leaq(rbx, at_bcp(BytesPerInt)); // btw: should be able to get rid of
1792                                      // this instruction (change offsets
1793                                      // below)
1794   __ andq(rbx, -BytesPerInt);
1795   // set counter
1796   __ movl(rcx, Address(rbx, BytesPerInt));  
1797   __ bswapl(rcx);
1798   __ jmpb(loop_entry);
1799   // table search
1800   __ bind(loop);
1801   __ cmpl(rax, Address(rbx, rcx, Address::times_8, 2 * BytesPerInt));
1802   __ jcc(Assembler::equal, found);
1803   __ bind(loop_entry);
1804   __ decrementl(rcx);
1805   __ jcc(Assembler::greaterEqual, loop);
1806   // default case
1807   __ profile_switch_default(rax);
1808   __ movl(rdx, Address(rbx, 0));
1809   __ jmp(continue_execution);
1810   // entry found -> get offset
1811   __ bind(found);
1812   __ movl(rdx, Address(rbx, rcx, Address::times_8, 3 * BytesPerInt));
1813   __ profile_switch_case(rcx, rax, rbx);
1814   // continue execution
1815   __ bind(continue_execution);  
1816   __ bswapl(rdx);
1817   __ movslq(rdx, rdx);
1818   __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1));
1819   __ addq(r13, rdx);
1820   __ dispatch_only(vtos);
1821 }
1822 
1823 void TemplateTable::fast_binaryswitch() {
1824   transition(itos, vtos);
1825   // Implementation using the following core algorithm:
1826   //
1827   // int binary_search(int key, LookupswitchPair* array, int n) {
1828   //   // Binary search according to "Methodik des Programmierens" by
1829   //   // Edsger W. Dijkstra and W.H.J. Feijen, Addison Wesley Germany 1985.
1830   //   int i = 0;
1831   //   int j = n;
1832   //   while (i+1 < j) {
1833   //     // invariant P: 0 <= i < j <= n and (a[i] <= key < a[j] or Q)
1834   //     // with      Q: for all i: 0 <= i < n: key < a[i]
1835   //     // where a stands for the array and assuming that the (inexisting)
1836   //     // element a[n] is infinitely big.
1837   //     int h = (i + j) >> 1;
1838   //     // i < h < j
1839   //     if (key < array[h].fast_match()) {
1840   //       j = h;
1841   //     } else {
1842   //       i = h;
1843   //     }
1844   //   }
1845   //   // R: a[i] <= key < a[i+1] or Q
1846   //   // (i.e., if key is within array, i is the correct index)
1847   //   return i;
1848   // }
1849 
1850   // Register allocation
1851   const Register key   = rax; // already set (tosca)
1852   const Register array = rbx;
1853   const Register i     = rcx;
1854   const Register j     = rdx;
1855   const Register h     = rdi;
1856   const Register temp  = rsi;
1857 
1858   // Find array start
1859   __ leaq(array, at_bcp(3 * BytesPerInt)); // btw: should be able to
1860                                            // get rid of this
1861                                            // instruction (change
1862                                            // offsets below)
1863   __ andq(array, -BytesPerInt);
1864 
1865   // Initialize i & j
1866   __ xorl(i, i);                            // i = 0;
1867   __ movl(j, Address(array, -BytesPerInt)); // j = length(array);    
1868 
1869   // Convert j into native byteordering  
1870   __ bswapl(j);
1871 
1872   // And start
1873   Label entry;
1874   __ jmp(entry);
1875 
1876   // binary search loop
1877   { 
1878     Label loop;
1879     __ bind(loop);
1880     // int h = (i + j) >> 1;
1881     __ leal(h, Address(i, j, Address::times_1)); // h = i + j;
1882     __ sarl(h, 1);                               // h = (i + j) >> 1;
1883     // if (key < array[h].fast_match()) {


1895     __ cmovl(Assembler::greaterEqual, i, h);
1896     // while (i+1 < j)
1897     __ bind(entry);
1898     __ leal(h, Address(i, 1)); // i+1
1899     __ cmpl(h, j);             // i+1 < j
1900     __ jcc(Assembler::less, loop);
1901   }
1902 
1903   // end of binary search, result index is i (must check again!)
1904   Label default_case;
1905   // Convert array[i].match to native byte-ordering before compare
1906   __ movl(temp, Address(array, i, Address::times_8));
1907   __ bswapl(temp);
1908   __ cmpl(key, temp);
1909   __ jcc(Assembler::notEqual, default_case);
1910 
1911   // entry found -> j = offset
1912   __ movl(j , Address(array, i, Address::times_8, BytesPerInt));
1913   __ profile_switch_case(i, key, array);
1914   __ bswapl(j);
1915   __ movslq(j, j);
1916   __ load_unsigned_byte(rbx, Address(r13, j, Address::times_1));
1917   __ addq(r13, j);
1918   __ dispatch_only(vtos);
1919 
1920   // default case -> j = default offset
1921   __ bind(default_case);
1922   __ profile_switch_default(i);
1923   __ movl(j, Address(array, -2 * BytesPerInt));
1924   __ bswapl(j);
1925   __ movslq(j, j);
1926   __ load_unsigned_byte(rbx, Address(r13, j, Address::times_1));
1927   __ addq(r13, j);
1928   __ dispatch_only(vtos);
1929 }
1930 
1931 
1932 void TemplateTable::_return(TosState state) {
1933   transition(state, state);
1934   assert(_desc->calls_vm(), 
1935          "inconsistent calls_vm information"); // call in remove_activation
1936 
1937   if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
1938     assert(state == vtos, "only valid state");
1939     __ movq(c_rarg1, aaddress(0));
1940     __ movq(rdi, Address(c_rarg1, oopDesc::klass_offset_in_bytes()));
1941     __ movl(rdi, Address(rdi, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc)));
1942     __ testl(rdi, JVM_ACC_HAS_FINALIZER);
1943     Label skip_register_finalizer;
1944     __ jcc(Assembler::zero, skip_register_finalizer);
1945 
1946     __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), c_rarg1);
1947 
1948     __ bind(skip_register_finalizer);
1949   }
1950 
1951   __ remove_activation(state, r13);
1952   __ jmp(r13);
1953 }
1954 
1955 // ----------------------------------------------------------------------------
1956 // Volatile variables demand their effects be made known to all CPU's
1957 // in order.  Store buffers on most chips allow reads & writes to
1958 // reorder; the JMM's ReadAfterWrite.java test fails in -Xint mode
1959 // without some kind of memory barrier (i.e., it's not sufficient that
1960 // the interpreter does not reorder volatile references, the hardware


2030   }
2031   __ movl(temp, (int) bytecode());
2032   __ call_VM(noreg, entry, temp);
2033 
2034   // Update registers with resolved info
2035   __ get_cache_and_index_at_bcp(Rcache, index, 1);
2036   __ bind(resolved);
2037 }
2038 
2039 // The Rcache and index registers must be set before call
2040 void TemplateTable::load_field_cp_cache_entry(Register obj,
2041                                               Register cache,
2042                                               Register index,
2043                                               Register off,
2044                                               Register flags,
2045                                               bool is_static = false) {
2046   assert_different_registers(cache, index, flags, off);
2047 
2048   ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
2049   // Field offset
2050   __ movq(off, Address(cache, index, Address::times_8, 
2051                        in_bytes(cp_base_offset + 
2052                                 ConstantPoolCacheEntry::f2_offset())));
2053   // Flags    
2054   __ movl(flags, Address(cache, index, Address::times_8,
2055                          in_bytes(cp_base_offset + 
2056                                   ConstantPoolCacheEntry::flags_offset())));
2057 
2058   // klass overwrite register
2059   if (is_static) {
2060     __ movq(obj, Address(cache, index, Address::times_8,
2061                          in_bytes(cp_base_offset + 
2062                                   ConstantPoolCacheEntry::f1_offset())));
2063   }
2064 }
2065 
2066 void TemplateTable::load_invoke_cp_cache_entry(int byte_no,
2067                                                Register method,
2068                                                Register itable_index,
2069                                                Register flags,
2070                                                bool is_invokevirtual,
2071                                                bool is_invokevfinal /*unused*/) {
2072   // setup registers
2073   const Register cache = rcx;
2074   const Register index = rdx;
2075   assert_different_registers(method, flags);
2076   assert_different_registers(method, cache, index);
2077   assert_different_registers(itable_index, flags);
2078   assert_different_registers(itable_index, cache, index);
2079   // determine constant pool cache field offsets
2080   const int method_offset = in_bytes(
2081     constantPoolCacheOopDesc::base_offset() +
2082       (is_invokevirtual
2083        ? ConstantPoolCacheEntry::f2_offset()
2084        : ConstantPoolCacheEntry::f1_offset()));
2085   const int flags_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
2086                                     ConstantPoolCacheEntry::flags_offset());
2087   // access constant pool cache fields
2088   const int index_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
2089                                     ConstantPoolCacheEntry::f2_offset());
2090 
2091   resolve_cache_and_index(byte_no, cache, index);
2092 
2093   assert(wordSize == 8, "adjust code below");
2094   __ movq(method, Address(cache, index, Address::times_8, method_offset));
2095   if (itable_index != noreg) {
2096     __ movq(itable_index, 
2097             Address(cache, index, Address::times_8, index_offset));
2098   }
2099   __ movl(flags , Address(cache, index, Address::times_8, flags_offset));
2100 }
2101 
2102 
2103 // The registers cache and index expected to be set before call.
2104 // Correct values of the cache and index registers are preserved.
2105 void TemplateTable::jvmti_post_field_access(Register cache, Register index,
2106                                             bool is_static, bool has_tos) {
2107   // do the JVMTI work here to avoid disturbing the register state below
2108   // We use c_rarg registers here because we want to use the register used in
2109   // the call to the VM
2110   if (JvmtiExport::can_post_field_access()) {
2111     // Check to see if a field access watch has been set before we
2112     // take the time to call into the VM.
2113     Label L1;
2114     assert_different_registers(cache, index, rax);
2115     __ mov32(rax, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
2116     __ testl(rax, rax);
2117     __ jcc(Assembler::zero, L1);
2118 
2119     __ get_cache_and_index_at_bcp(c_rarg2, c_rarg3, 1);
2120 
2121     // cache entry pointer
2122     __ addq(c_rarg2, in_bytes(constantPoolCacheOopDesc::base_offset()));
2123     __ shll(c_rarg3, LogBytesPerWord);
2124     __ addq(c_rarg2, c_rarg3);
2125     if (is_static) {
2126       __ xorl(c_rarg1, c_rarg1); // NULL object reference
2127     } else {
2128       __ movq(c_rarg1, at_tos()); // get object pointer without popping it
2129       __ verify_oop(c_rarg1);
2130     }
2131     // c_rarg1: object pointer or NULL
2132     // c_rarg2: cache entry pointer
2133     // c_rarg3: jvalue object on the stack
2134     __ call_VM(noreg, CAST_FROM_FN_PTR(address, 
2135                                        InterpreterRuntime::post_field_access),
2136                c_rarg1, c_rarg2, c_rarg3);
2137     __ get_cache_and_index_at_bcp(cache, index, 1);
2138     __ bind(L1);
2139   } 
2140 }
2141 
2142 void TemplateTable::pop_and_check_object(Register r) {
2143   __ pop_ptr(r);
2144   __ null_check(r);  // for field access must check obj.
2145   __ verify_oop(r);
2146 }
2147 
2148 void TemplateTable::getfield_or_static(int byte_no, bool is_static) {


2170               notLong, notFloat, notObj, notDouble;
2171 
2172   __ shrl(flags, ConstantPoolCacheEntry::tosBits);
2173   assert(btos == 0, "change code, btos != 0");
2174 
2175   __ andl(flags, 0x0F);
2176   __ jcc(Assembler::notZero, notByte);
2177   // btos
2178   __ load_signed_byte(rax, field);
2179   __ push(btos);
2180   // Rewrite bytecode to be faster
2181   if (!is_static) {
2182     patch_bytecode(Bytecodes::_fast_bgetfield, bc, rbx);
2183   }
2184   __ jmp(Done);
2185 
2186   __ bind(notByte);
2187   __ cmpl(flags, atos);
2188   __ jcc(Assembler::notEqual, notObj);
2189   // atos
2190   __ movq(rax, field);
2191   __ push(atos);
2192   if (!is_static) {
2193     patch_bytecode(Bytecodes::_fast_agetfield, bc, rbx);
2194   }
2195   __ jmp(Done);
2196 
2197   __ bind(notObj);
2198   __ cmpl(flags, itos);
2199   __ jcc(Assembler::notEqual, notInt);
2200   // itos
2201   __ movl(rax, field);
2202   __ push(itos);
2203   // Rewrite bytecode to be faster
2204   if (!is_static) {
2205     patch_bytecode(Bytecodes::_fast_igetfield, bc, rbx);
2206   }
2207   __ jmp(Done);
2208 
2209   __ bind(notInt);
2210   __ cmpl(flags, ctos);


2305     __ jcc(Assembler::zero, L1);
2306 
2307     __ get_cache_and_index_at_bcp(c_rarg2, rscratch1, 1);
2308 
2309     if (is_static) {
2310       // Life is simple.  Null out the object pointer.
2311       __ xorl(c_rarg1, c_rarg1);
2312     } else {
2313       // Life is harder. The stack holds the value on top, followed by
2314       // the object.  We don't know the size of the value, though; it
2315       // could be one or two words depending on its type. As a result,
2316       // we must find the type to determine where the object is.
2317       __ movl(c_rarg3, Address(c_rarg2, rscratch1, 
2318                            Address::times_8, 
2319                            in_bytes(cp_base_offset +
2320                                      ConstantPoolCacheEntry::flags_offset())));
2321       __ shrl(c_rarg3, ConstantPoolCacheEntry::tosBits);
2322       // Make sure we don't need to mask rcx for tosBits after the
2323       // above shift
2324       ConstantPoolCacheEntry::verify_tosBits();
2325       __ movq(c_rarg1, at_tos_p1());  // initially assume a one word jvalue
2326       __ cmpl(c_rarg3, ltos);
2327       __ cmovq(Assembler::equal,
2328                c_rarg1, at_tos_p2()); // ltos (two word jvalue)
2329       __ cmpl(c_rarg3, dtos);
2330       __ cmovq(Assembler::equal,
2331                c_rarg1, at_tos_p2()); // dtos (two word jvalue)
2332     }
2333     // cache entry pointer
2334     __ addq(c_rarg2, in_bytes(cp_base_offset));
2335     __ shll(rscratch1, LogBytesPerWord);
2336     __ addq(c_rarg2, rscratch1);
2337     // object (tos)
2338     __ movq(c_rarg3, rsp);
2339     // c_rarg1: object pointer set up above (NULL if static)
2340     // c_rarg2: cache entry pointer
2341     // c_rarg3: jvalue object on the stack
2342     __ call_VM(noreg, 
2343                CAST_FROM_FN_PTR(address, 
2344                                 InterpreterRuntime::post_field_modification),
2345                c_rarg1, c_rarg2, c_rarg3);
2346     __ get_cache_and_index_at_bcp(cache, index, 1);
2347     __ bind(L1);
2348   }
2349 }
2350 
2351 void TemplateTable::putfield_or_static(int byte_no, bool is_static) {
2352   transition(vtos, vtos);
2353 
2354   const Register cache = rcx;
2355   const Register index = rdx;
2356   const Register obj   = rcx;
2357   const Register off   = rbx;
2358   const Register flags = rax;


2380   __ shrl(flags, ConstantPoolCacheEntry::tosBits);
2381 
2382   assert(btos == 0, "change code, btos != 0");
2383   __ andl(flags, 0x0f);
2384   __ jcc(Assembler::notZero, notByte);
2385   // btos
2386   __ pop(btos);
2387   if (!is_static) pop_and_check_object(obj);
2388   __ movb(field, rax);
2389   if (!is_static) {
2390     patch_bytecode(Bytecodes::_fast_bputfield, bc, rbx);
2391   }
2392   __ jmp(Done);
2393 
2394   __ bind(notByte);
2395   __ cmpl(flags, atos);
2396   __ jcc(Assembler::notEqual, notObj);
2397   // atos
2398   __ pop(atos);
2399   if (!is_static) pop_and_check_object(obj);
2400   __ movq(field, rax);
2401   __ store_check(obj, field); // Need to mark card


2402   if (!is_static) {
2403     patch_bytecode(Bytecodes::_fast_aputfield, bc, rbx);
2404   }
2405   __ jmp(Done);
2406 
2407   __ bind(notObj);
2408   __ cmpl(flags, itos);
2409   __ jcc(Assembler::notEqual, notInt);
2410   // itos
2411   __ pop(itos);
2412   if (!is_static) pop_and_check_object(obj);
2413   __ movl(field, rax);
2414   if (!is_static) {
2415     patch_bytecode(Bytecodes::_fast_iputfield, bc, rbx);
2416   }
2417   __ jmp(Done);
2418 
2419   __ bind(notInt);
2420   __ cmpl(flags, ctos);
2421   __ jcc(Assembler::notEqual, notChar);


2496 
2497 void TemplateTable::putfield(int byte_no) {
2498   putfield_or_static(byte_no, false);
2499 }
2500 
2501 void TemplateTable::putstatic(int byte_no) {
2502   putfield_or_static(byte_no, true);
2503 }
2504 
2505 void TemplateTable::jvmti_post_fast_field_mod() {
2506   if (JvmtiExport::can_post_field_modification()) {
2507     // Check to see if a field modification watch has been set before
2508     // we take the time to call into the VM.
2509     Label L2;
2510     __ mov32(c_rarg3, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr()));
2511     __ testl(c_rarg3, c_rarg3);
2512     __ jcc(Assembler::zero, L2);
2513     __ pop_ptr(rbx);                  // copy the object pointer from tos
2514     __ verify_oop(rbx);
2515     __ push_ptr(rbx);                 // put the object pointer back on tos
2516     __ subq(rsp, sizeof(jvalue));  // add space for a jvalue object
2517     __ movq(c_rarg3, rsp);
2518     const Address field(c_rarg3, 0);
2519 
2520     switch (bytecode()) {          // load values into the jvalue object
2521     case Bytecodes::_fast_aputfield: // fall through
2522     case Bytecodes::_fast_lputfield: __ movq(field, rax); break;
2523     case Bytecodes::_fast_iputfield: __ movl(field, rax); break;
2524     case Bytecodes::_fast_bputfield: __ movb(field, rax); break;
2525     case Bytecodes::_fast_sputfield: // fall through
2526     case Bytecodes::_fast_cputfield: __ movw(field, rax); break;
2527     case Bytecodes::_fast_fputfield: __ movflt(field, xmm0); break;
2528     case Bytecodes::_fast_dputfield: __ movdbl(field, xmm0); break;
2529     default:
2530       ShouldNotReachHere();
2531     }
2532 
2533     // Save rax because call_VM() will clobber it, then use it for
2534     // JVMTI purposes
2535     __ pushq(rax);
2536     // access constant pool cache entry
2537     __ get_cache_entry_pointer_at_bcp(c_rarg2, rax, 1);
2538     __ verify_oop(rbx);
2539     // rbx: object pointer copied above
2540     // c_rarg2: cache entry pointer
2541     // c_rarg3: jvalue object on the stack
2542     __ call_VM(noreg,
2543                CAST_FROM_FN_PTR(address, 
2544                                 InterpreterRuntime::post_field_modification),
2545                rbx, c_rarg2, c_rarg3);
2546     __ popq(rax);     // restore lower value   
2547     __ addq(rsp, sizeof(jvalue));  // release jvalue object space
2548     __ bind(L2);
2549   }
2550 }
2551 
2552 void TemplateTable::fast_storefield(TosState state) {
2553   transition(state, vtos);
2554 
2555   ByteSize base = constantPoolCacheOopDesc::base_offset();
2556 
2557   jvmti_post_fast_field_mod();
2558 
2559   // access constant pool cache
2560   __ get_cache_and_index_at_bcp(rcx, rbx, 1);
2561 
2562   // test for volatile with rdx
2563   __ movl(rdx, Address(rcx, rbx, Address::times_8, 
2564                        in_bytes(base +
2565                                 ConstantPoolCacheEntry::flags_offset())));
2566 
2567   // replace index with field offset from cache entry
2568   __ movq(rbx, Address(rcx, rbx, Address::times_8,
2569                        in_bytes(base + ConstantPoolCacheEntry::f2_offset())));
2570 
2571   // [jk] not needed currently
2572   // volatile_barrier(Assembler::Membar_mask_bits(Assembler::LoadStore |
2573   //                                              Assembler::StoreStore));
2574 
2575   Label notVolatile;
2576   __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
2577   __ andl(rdx, 0x1);
2578 
2579   // Get object from stack
2580   pop_and_check_object(rcx);
2581 
2582   // field address
2583   const Address field(rcx, rbx, Address::times_1);
2584 
2585   // access field
2586   switch (bytecode()) {
2587   case Bytecodes::_fast_aputfield: 
2588     __ movq(field, rax); 
2589     __ store_check(rcx, field);
2590     break;
2591   case Bytecodes::_fast_lputfield:
2592     __ movq(field, rax);
2593     break;
2594   case Bytecodes::_fast_iputfield:
2595     __ movl(field, rax);
2596     break;
2597   case Bytecodes::_fast_bputfield:
2598     __ movb(field, rax);
2599     break;
2600   case Bytecodes::_fast_sputfield:
2601     // fall through
2602   case Bytecodes::_fast_cputfield:
2603     __ movw(field, rax);
2604     break;
2605   case Bytecodes::_fast_fputfield:
2606     __ movflt(field, xmm0);
2607     break;
2608   case Bytecodes::_fast_dputfield:
2609     __ movdbl(field, xmm0); 


2617   __ jcc(Assembler::zero, notVolatile);
2618   volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad |
2619                                                Assembler::StoreStore));
2620   __ bind(notVolatile);
2621 }
2622 
2623 
2624 void TemplateTable::fast_accessfield(TosState state) {
2625   transition(atos, state);
2626 
2627   // Do the JVMTI work here to avoid disturbing the register state below
2628   if (JvmtiExport::can_post_field_access()) {
2629     // Check to see if a field access watch has been set before we
2630     // take the time to call into the VM.
2631     Label L1;
2632     __ mov32(rcx, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
2633     __ testl(rcx, rcx);
2634     __ jcc(Assembler::zero, L1);
2635     // access constant pool cache entry
2636     __ get_cache_entry_pointer_at_bcp(c_rarg2, rcx, 1);
2637     __ movq(r12, rax);  // save object pointer before call_VM() clobbers it
2638     __ verify_oop(rax);
2639     __ movq(c_rarg1, rax);

2640     // c_rarg1: object pointer copied above
2641     // c_rarg2: cache entry pointer
2642     __ call_VM(noreg, 
2643                CAST_FROM_FN_PTR(address, 
2644                                 InterpreterRuntime::post_field_access),
2645                c_rarg1, c_rarg2);
2646     __ movq(rax, r12); // restore object pointer

2647     __ bind(L1);
2648   }
2649 
2650   // access constant pool cache
2651   __ get_cache_and_index_at_bcp(rcx, rbx, 1);
2652   // replace index with field offset from cache entry
2653   // [jk] not needed currently
2654   // if (os::is_MP()) {
2655   //   __ movl(rdx, Address(rcx, rbx, Address::times_8, 
2656   //                        in_bytes(constantPoolCacheOopDesc::base_offset() +
2657   //                                 ConstantPoolCacheEntry::flags_offset())));
2658   //   __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
2659   //   __ andl(rdx, 0x1);
2660   // }
2661   __ movq(rbx, Address(rcx, rbx, Address::times_8,
2662                        in_bytes(constantPoolCacheOopDesc::base_offset() + 
2663                                 ConstantPoolCacheEntry::f2_offset())));
2664 
2665   // rax: object
2666   __ verify_oop(rax);
2667   __ null_check(rax);
2668   Address field(rax, rbx, Address::times_1);
2669 
2670   // access field
2671   switch (bytecode()) {
2672   case Bytecodes::_fast_agetfield:
2673     __ movq(rax, field);
2674     __ verify_oop(rax);
2675     break;
2676   case Bytecodes::_fast_lgetfield:
2677     __ movq(rax, field);
2678     break;
2679   case Bytecodes::_fast_igetfield:
2680     __ movl(rax, field);
2681     break;
2682   case Bytecodes::_fast_bgetfield: 
2683     __ movsbl(rax, field);
2684     break;
2685   case Bytecodes::_fast_sgetfield:
2686     __ load_signed_word(rax, field);
2687     break;
2688   case Bytecodes::_fast_cgetfield:
2689     __ load_unsigned_word(rax, field);
2690     break;
2691   case Bytecodes::_fast_fgetfield:
2692     __ movflt(xmm0, field);
2693     break;
2694   case Bytecodes::_fast_dgetfield:
2695     __ movdbl(xmm0, field);
2696     break;
2697   default:
2698     ShouldNotReachHere();
2699   }
2700   // [jk] not needed currently
2701   // if (os::is_MP()) { 
2702   //   Label notVolatile;
2703   //   __ testl(rdx, rdx);
2704   //   __ jcc(Assembler::zero, notVolatile);
2705   //   __ membar(Assembler::LoadLoad);
2706   //   __ bind(notVolatile);
2707   //};
2708 }
2709 
2710 void TemplateTable::fast_xaccess(TosState state) {
2711   transition(vtos, state);
2712 
2713   // get receiver
2714   __ movq(rax, aaddress(0));
2715   debug_only(__ verify_local_tag(frame::TagReference, 0));
2716   // access constant pool cache
2717   __ get_cache_and_index_at_bcp(rcx, rdx, 2);
2718   __ movq(rbx, 
2719           Address(rcx, rdx, Address::times_8, 
2720                   in_bytes(constantPoolCacheOopDesc::base_offset() + 
2721                            ConstantPoolCacheEntry::f2_offset())));
2722   // make sure exception is reported in correct bcp range (getfield is
2723   // next instruction)
2724   __ incrementq(r13);
2725   __ null_check(rax);
2726   switch (state) {
2727   case itos: 
2728     __ movl(rax, Address(rax, rbx, Address::times_1));
2729     break;
2730   case atos:
2731     __ movq(rax, Address(rax, rbx, Address::times_1));
2732     __ verify_oop(rax);
2733     break;
2734   case ftos:
2735     __ movflt(xmm0, Address(rax, rbx, Address::times_1));
2736     break;
2737   default:
2738     ShouldNotReachHere();
2739   }
2740 
2741   // [jk] not needed currently
2742   // if (os::is_MP()) {
2743   //   Label notVolatile;
2744   //   __ movl(rdx, Address(rcx, rdx, Address::times_8, 
2745   //                        in_bytes(constantPoolCacheOopDesc::base_offset() +
2746   //                                 ConstantPoolCacheEntry::flags_offset())));
2747   //   __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
2748   //   __ testl(rdx, 0x1);
2749   //   __ jcc(Assembler::zero, notVolatile);
2750   //   __ membar(Assembler::LoadLoad);
2751   //   __ bind(notVolatile);
2752   // }
2753 
2754   __ decrementq(r13);
2755 }
2756 
2757 
2758 
2759 //-----------------------------------------------------------------------------
2760 // Calls
2761 
2762 void TemplateTable::count_calls(Register method, Register temp) {  
2763   // implemented elsewhere
2764   ShouldNotReachHere();
2765 }
2766 
2767 void TemplateTable::prepare_invoke(Register method, 
2768                                    Register index, 
2769                                    int byte_no, 
2770                                    Bytecodes::Code code) {
2771   // determine flags
2772   const bool is_invokeinterface  = code == Bytecodes::_invokeinterface;
2773   const bool is_invokevirtual    = code == Bytecodes::_invokevirtual;
2774   const bool is_invokespecial    = code == Bytecodes::_invokespecial;
2775   const bool load_receiver       = code != Bytecodes::_invokestatic;
2776   const bool receiver_null_check = is_invokespecial;
2777   const bool save_flags = is_invokeinterface || is_invokevirtual;
2778   // setup registers & access constant pool cache
2779   const Register recv   = rcx;
2780   const Register flags  = rdx;  
2781   assert_different_registers(method, index, recv, flags);
2782 
2783   // save 'interpreter return address'
2784   __ save_bcp();
2785 
2786   load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual);
2787 
2788   // load receiver if needed (note: no return address pushed yet)
2789   if (load_receiver) {
2790     __ movl(recv, flags);
2791     __ andl(recv, 0xFF);
2792     if (TaggedStackInterpreter) __ shll(recv, 1);  // index*2
2793     __ movq(recv, Address(rsp, recv, Address::times_8, -Interpreter::expr_offset_in_bytes(1)));

2794     __ verify_oop(recv);
2795   }
2796 
2797   // do null check if needed
2798   if (receiver_null_check) {
2799     __ null_check(recv);
2800   }
2801 
2802   if (save_flags) {
2803     __ movl(r13, flags);
2804   }
2805 
2806   // compute return type
2807   __ shrl(flags, ConstantPoolCacheEntry::tosBits);
2808   // Make sure we don't need to mask flags for tosBits after the above shift
2809   ConstantPoolCacheEntry::verify_tosBits();
2810   // load return address
2811   { 
2812     ExternalAddress return_5((address)Interpreter::return_5_addrs_by_index_table());
2813     ExternalAddress return_3((address)Interpreter::return_3_addrs_by_index_table());
2814     __ lea(rscratch1, (is_invokeinterface ? return_5 : return_3));
2815     __ movq(flags, Address(rscratch1, flags, Address::times_8));
2816   }
2817 
2818   // push return address
2819   __ pushq(flags);
2820 
2821   // Restore flag field from the constant pool cache, and restore esi
2822   // for later null checks.  r13 is the bytecode pointer
2823   if (save_flags) {
2824     __ movl(flags, r13);
2825     __ restore_bcp();
2826   }
2827 }
2828 
2829 
2830 void TemplateTable::invokevirtual_helper(Register index,
2831                                          Register recv,
2832                                          Register flags) {
2833   // Uses temporary registers rax, rdx  assert_different_registers(index, recv, rax, rdx);
2834 
2835   // Test for an invoke of a final method
2836   Label notFinal;
2837   __ movl(rax, flags);
2838   __ andl(rax, (1 << ConstantPoolCacheEntry::vfinalMethod));
2839   __ jcc(Assembler::zero, notFinal);
2840 
2841   const Register method = index;  // method must be rbx
2842   assert(method == rbx,
2843          "methodOop must be rbx for interpreter calling convention");
2844 
2845   // do the call - the index is actually the method to call
2846   __ verify_oop(method);
2847 
2848   // It's final, need a null check here!
2849   __ null_check(recv);
2850 
2851   // profile this call
2852   __ profile_final_call(rax);
2853 
2854   __ jump_from_interpreted(method, rax);
2855 
2856   __ bind(notFinal);
2857 
2858   // get receiver klass
2859   __ null_check(recv, oopDesc::klass_offset_in_bytes());
2860   __ movq(rax, Address(recv, oopDesc::klass_offset_in_bytes()));
2861 
2862   __ verify_oop(rax);
2863 
2864   // profile this call
2865   __ profile_virtual_call(rax, r14, rdx);
2866 
2867   // get target methodOop & entry point
2868   const int base = instanceKlass::vtable_start_offset() * wordSize;    
2869   assert(vtableEntry::size() * wordSize == 8, 
2870          "adjust the scaling in the code below");
2871   __ movq(method, Address(rax, index, 
2872                           Address::times_8, 
2873                           base + vtableEntry::method_offset_in_bytes()));  
2874   __ movq(rdx, Address(method, methodOopDesc::interpreter_entry_offset()));  
2875   __ jump_from_interpreted(method, rdx);
2876 }
2877 
2878 
2879 void TemplateTable::invokevirtual(int byte_no) {
2880   transition(vtos, vtos);
2881   prepare_invoke(rbx, noreg, byte_no, bytecode());
2882 
2883   // rbx: index
2884   // rcx: receiver    
2885   // rdx: flags    
2886 
2887   invokevirtual_helper(rbx, rcx, rdx);
2888 }
2889 
2890 
2891 void TemplateTable::invokespecial(int byte_no) {
2892   transition(vtos, vtos);
2893   prepare_invoke(rbx, noreg, byte_no, bytecode());
2894   // do the call


2918   
2919   // rax: Interface
2920   // rbx: index
2921   // rcx: receiver    
2922   // rdx: flags
2923 
2924   // Special case of invokeinterface called for virtual method of
2925   // java.lang.Object.  See cpCacheOop.cpp for details.
2926   // This code isn't produced by javac, but could be produced by
2927   // another compliant java compiler.
2928   Label notMethod;
2929   __ movl(r14, rdx);
2930   __ andl(r14, (1 << ConstantPoolCacheEntry::methodInterface));
2931   __ jcc(Assembler::zero, notMethod);
2932 
2933   invokevirtual_helper(rbx, rcx, rdx);
2934   __ bind(notMethod);
2935 
2936   // Get receiver klass into rdx - also a null check
2937   __ restore_locals(); // restore r14
2938   __ movq(rdx, Address(rcx, oopDesc::klass_offset_in_bytes()));
2939   __ verify_oop(rdx);
2940 
2941   // profile this call
2942   __ profile_virtual_call(rdx, r13, r14);
2943 
2944   __ movq(r14, rdx); // Save klassOop in r14
2945 
2946   // Compute start of first itableOffsetEntry (which is at the end of
2947   // the vtable)
2948   const int base = instanceKlass::vtable_start_offset() * wordSize;
2949   // Get length of vtable
2950   assert(vtableEntry::size() * wordSize == 8, 
2951          "adjust the scaling in the code below");
2952   __ movl(r13, Address(rdx, 
2953                        instanceKlass::vtable_length_offset() * wordSize));
2954   __ leaq(rdx, Address(rdx, r13, Address::times_8, base));
2955   
2956   if (HeapWordsPerLong > 1) {
2957     // Round up to align_object_offset boundary
2958     __ round_to_q(rdx, BytesPerLong);
2959   }
2960 
2961   Label entry, search, interface_ok;
2962   
2963   __ jmpb(entry);   
2964   __ bind(search);
2965   __ addq(rdx, itableOffsetEntry::size() * wordSize);
2966   
2967   __ bind(entry);    
2968 
2969   // Check that the entry is non-null.  A null entry means that the
2970   // receiver class doesn't implement the interface, and wasn't the
2971   // same as the receiver class checked when the interface was
2972   // resolved.
2973   __ pushq(rdx);
2974   __ movq(rdx, Address(rdx, itableOffsetEntry::interface_offset_in_bytes()));
2975   __ testq(rdx, rdx);
2976   __ jcc(Assembler::notZero, interface_ok);
2977   // throw exception
2978   __ popq(rdx); // pop saved register first.
2979   __ popq(rbx); // pop return address (pushed by prepare_invoke)
2980   __ restore_bcp(); // r13 must be correct for exception handler (was
2981                     // destroyed)
2982   __ restore_locals(); // make sure locals pointer is correct as well
2983                        // (was destroyed)
2984   __ call_VM(noreg, CAST_FROM_FN_PTR(address,
2985                    InterpreterRuntime::throw_IncompatibleClassChangeError));
2986   // the call_VM checks for exception, so we should never return here.
2987   __ should_not_reach_here();
2988   __ bind(interface_ok);
2989 
2990   __ popq(rdx);
2991 
2992   __ cmpq(rax, Address(rdx, itableOffsetEntry::interface_offset_in_bytes()));
2993   __ jcc(Assembler::notEqual, search);
2994         
2995   __ movl(rdx, Address(rdx, itableOffsetEntry::offset_offset_in_bytes()));
2996 
2997   __ addq(rdx, r14); // Add offset to klassOop
2998   assert(itableMethodEntry::size() * wordSize == 8,
2999          "adjust the scaling in the code below");
3000   __ movq(rbx, Address(rdx, rbx, Address::times_8));
3001   // rbx: methodOop to call
3002   // rcx: receiver
3003   // Check for abstract method error
3004   // Note: This should be done more efficiently via a
3005   // throw_abstract_method_error interpreter entry point and a
3006   // conditional jump to it in case of a null method.
3007   { 
3008     Label L;
3009     __ testq(rbx, rbx);
3010     __ jcc(Assembler::notZero, L);
3011     // throw exception
3012     // note: must restore interpreter registers to canonical
3013     //       state for exception handling to work correctly!
3014     __ popq(rbx);  // pop return address (pushed by prepare_invoke)
3015     __ restore_bcp(); // r13 must be correct for exception handler
3016                       // (was destroyed)
3017     __ restore_locals(); // make sure locals pointer is correct as
3018                          // well (was destroyed)
3019     __ call_VM(noreg, 
3020                CAST_FROM_FN_PTR(address, 
3021                              InterpreterRuntime::throw_AbstractMethodError));
3022     // the call_VM checks for exception, so we should never return here.
3023     __ should_not_reach_here();
3024     __ bind(L);
3025   }
3026 
3027   __ movq(rcx, Address(rbx, methodOopDesc::interpreter_entry_offset()));  
3028 
3029   // do the call
3030   // rcx: receiver
3031   // rbx: methodOop
3032   __ jump_from_interpreted(rbx, rdx);
3033 }
3034 
3035 //-----------------------------------------------------------------------------
3036 // Allocation
3037 
3038 void TemplateTable::_new() {
3039   transition(vtos, atos);
3040   __ get_unsigned_2_byte_index_at_bcp(rdx, 1);
3041   Label slow_case;
3042   Label done;
3043   Label initialize_header;
3044   Label initialize_object; // including clearing the fields
3045   Label allocate_shared;
3046   ExternalAddress top((address)Universe::heap()->top_addr());
3047   ExternalAddress end((address)Universe::heap()->end_addr());
3048 
3049   __ get_cpool_and_tags(rsi, rax);
3050   // get instanceKlass
3051   __ movq(rsi, Address(rsi, rdx, 
3052                        Address::times_8, sizeof(constantPoolOopDesc)));
3053 
3054   // make sure the class we're about to instantiate has been
3055   // resolved. Note: slow_case does a pop of stack, which is why we
3056   // loaded class/pushed above
3057   const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
3058   __ cmpb(Address(rax, rdx, Address::times_1, tags_offset),
3059           JVM_CONSTANT_Class);
3060   __ jcc(Assembler::notEqual, slow_case);
3061 
3062   // make sure klass is initialized & doesn't have finalizer
3063   // make sure klass is fully initialized
3064   __ cmpl(Address(rsi, 
3065                   instanceKlass::init_state_offset_in_bytes() + 
3066                   sizeof(oopDesc)), 
3067           instanceKlass::fully_initialized);
3068   __ jcc(Assembler::notEqual, slow_case);
3069 
3070   // get instance_size in instanceKlass (scaled to a count of bytes)
3071   __ movl(rdx, 
3072           Address(rsi, 
3073                   Klass::layout_helper_offset_in_bytes() + sizeof(oopDesc)));
3074   // test to see if it has a finalizer or is malformed in some way
3075   __ testl(rdx, Klass::_lh_instance_slow_path_bit);
3076   __ jcc(Assembler::notZero, slow_case);
3077 
3078   // Allocate the instance
3079   // 1) Try to allocate in the TLAB
3080   // 2) if fail and the object is large allocate in the shared Eden
3081   // 3) if the above fails (or is not applicable), go to a slow case
3082   // (creates a new TLAB, etc.)
3083 
3084   const bool allow_shared_alloc =
3085     Universe::heap()->supports_inline_contig_alloc() && !CMSIncrementalMode;
3086 
3087   if (UseTLAB) {
3088     __ movq(rax, Address(r15_thread, in_bytes(JavaThread::tlab_top_offset())));
3089     __ leaq(rbx, Address(rax, rdx, Address::times_1));
3090     __ cmpq(rbx, Address(r15_thread, in_bytes(JavaThread::tlab_end_offset())));
3091     __ jcc(Assembler::above, allow_shared_alloc ? allocate_shared : slow_case);
3092     __ movq(Address(r15_thread, in_bytes(JavaThread::tlab_top_offset())), rbx);
3093     if (ZeroTLAB) {
3094       // the fields have been already cleared
3095       __ jmp(initialize_header);
3096     } else {
3097       // initialize both the header and fields
3098       __ jmp(initialize_object);
3099     }
3100   }
3101 
3102   // Allocation in the shared Eden, if allowed.
3103   //
3104   // rdx: instance size in bytes
3105   if (allow_shared_alloc) {
3106     __ bind(allocate_shared);
3107 



3108     const Register RtopAddr = rscratch1;
3109     const Register RendAddr = rscratch2;
3110 
3111     __ lea(RtopAddr, top);
3112     __ lea(RendAddr, end);
3113     __ movq(rax, Address(RtopAddr, 0));
3114 
3115     // For retries rax gets set by cmpxchgq
3116     Label retry;
3117     __ bind(retry);
3118     __ leaq(rbx, Address(rax, rdx, Address::times_1));
3119     __ cmpq(rbx, Address(RendAddr, 0));
3120     __ jcc(Assembler::above, slow_case);
3121 
3122     // Compare rax with the top addr, and if still equal, store the new
3123     // top addr in rbx at the address of the top addr pointer. Sets ZF if was
3124     // equal, and clears it otherwise. Use lock prefix for atomicity on MPs.
3125     //
3126     // rax: object begin
3127     // rbx: object end
3128     // rdx: instance size in bytes
3129     if (os::is_MP()) {
3130       __ lock();
3131     }
3132     __ cmpxchgq(rbx, Address(RtopAddr, 0));
3133 
3134     // if someone beat us on the allocation, try again, otherwise continue 
3135     __ jcc(Assembler::notEqual, retry);
3136   }
3137 
3138   if (UseTLAB || Universe::heap()->supports_inline_contig_alloc()) {
3139     // The object is initialized before the header.  If the object size is
3140     // zero, go directly to the header initialization.
3141     __ bind(initialize_object);
3142     __ decrementl(rdx, sizeof(oopDesc));
3143     __ jcc(Assembler::zero, initialize_header);
3144 
3145     // Initialize object fields
3146     __ xorl(rcx, rcx); // use zero reg to clear memory (shorter code)
3147     __ shrl(rdx, LogBytesPerLong);  // divide by oopSize to simplify the loop
3148     { 
3149       Label loop;
3150       __ bind(loop);
3151       __ movq(Address(rax, rdx, Address::times_8,
3152                       sizeof(oopDesc) - oopSize), 
3153               rcx);
3154       __ decrementl(rdx);
3155       __ jcc(Assembler::notZero, loop);
3156     }
3157 
3158     // initialize object header only.
3159     __ bind(initialize_header);
3160     if (UseBiasedLocking) {
3161       __ movq(rscratch1, Address(rsi, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
3162       __ movq(Address(rax, oopDesc::mark_offset_in_bytes()), rscratch1);
3163     } else {
3164       __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()), 
3165                (intptr_t) markOopDesc::prototype()); // header (address 0x1)
3166     }
3167     __ movq(Address(rax, oopDesc::klass_offset_in_bytes()), rsi);  // klass


3168     __ jmp(done);
3169   }
3170 
3171   {
3172     SkipIfEqual skip(_masm, &DTraceAllocProbes, false);
3173     // Trigger dtrace event for fastpath
3174     __ push(atos); // save the return value
3175     __ call_VM_leaf(
3176          CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc), rax);
3177     __ pop(atos); // restore the return value
3178   }
3179 
3180   // slow case
3181   __ bind(slow_case);
3182   __ get_constant_pool(c_rarg1);
3183   __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
3184   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2);
3185   __ verify_oop(rax);
3186 
3187   // continue


3197 }
3198 
3199 void TemplateTable::anewarray() {
3200   transition(itos, atos);
3201   __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
3202   __ get_constant_pool(c_rarg1);
3203   __ movl(c_rarg3, rax);
3204   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray), 
3205           c_rarg1, c_rarg2, c_rarg3);
3206 }
3207 
3208 void TemplateTable::arraylength() {
3209   transition(atos, itos);
3210   __ null_check(rax, arrayOopDesc::length_offset_in_bytes());
3211   __ movl(rax, Address(rax, arrayOopDesc::length_offset_in_bytes()));
3212 }
3213 
3214 void TemplateTable::checkcast() {
3215   transition(atos, atos);
3216   Label done, is_null, ok_is_subtype, quicked, resolved;
3217   __ testq(rax, rax); // object is in rax
3218   __ jcc(Assembler::zero, is_null);
3219 
3220   // Get cpool & tags index
3221   __ get_cpool_and_tags(rcx, rdx); // rcx=cpool, rdx=tags array
3222   __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // rbx=index
3223   // See if bytecode has already been quicked
3224   __ cmpb(Address(rdx, rbx, 
3225                   Address::times_1, 
3226                   typeArrayOopDesc::header_size(T_BYTE) * wordSize),
3227           JVM_CONSTANT_Class);
3228   __ jcc(Assembler::equal, quicked);
3229 
3230   __ movq(r12, rcx); // save rcx XXX
3231   __ push(atos); // save receiver for result, and for GC

3232   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc));
3233   __ pop_ptr(rdx); // restore receiver
3234   __ movq(rcx, r12); // restore rcx XXX


3235   __ jmpb(resolved);
3236 
3237   // Get superklass in rax and subklass in rbx
3238   __ bind(quicked);
3239   __ movq(rdx, rax); // Save object in rdx; rax needed for subtype check
3240   __ movq(rax, Address(rcx, rbx, 
3241                        Address::times_8, sizeof(constantPoolOopDesc)));
3242 
3243   __ bind(resolved);
3244   __ movq(rbx, Address(rdx, oopDesc::klass_offset_in_bytes()));
3245 
3246   // Generate subtype check.  Blows rcx, rdi.  Object in rdx.
3247   // Superklass in rax.  Subklass in rbx.
3248   __ gen_subtype_check(rbx, ok_is_subtype);
3249 
3250   // Come here on failure
3251   __ push_ptr(rdx);
3252   // object is at TOS
3253   __ jump(ExternalAddress(Interpreter::_throw_ClassCastException_entry));
3254 
3255   // Come here on success
3256   __ bind(ok_is_subtype);
3257   __ movq(rax, rdx); // Restore object in rdx
3258 
3259   // Collect counts on whether this check-cast sees NULLs a lot or not.
3260   if (ProfileInterpreter) {
3261     __ jmp(done);
3262     __ bind(is_null);
3263     __ profile_null_seen(rcx);
3264   } else {
3265     __ bind(is_null);   // same as 'done'
3266   }
3267   __ bind(done);
3268 }
3269 
3270 void TemplateTable::instanceof() {
3271   transition(atos, itos);
3272   Label done, is_null, ok_is_subtype, quicked, resolved;
3273   __ testq(rax, rax);
3274   __ jcc(Assembler::zero, is_null);
3275 
3276   // Get cpool & tags index
3277   __ get_cpool_and_tags(rcx, rdx); // rcx=cpool, rdx=tags array
3278   __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // rbx=index
3279   // See if bytecode has already been quicked
3280   __ cmpb(Address(rdx, rbx,
3281                   Address::times_1, 
3282                   typeArrayOopDesc::header_size(T_BYTE) * wordSize),
3283           JVM_CONSTANT_Class);
3284   __ jcc(Assembler::equal, quicked);
3285 
3286   __ movq(r12, rcx); // save rcx
3287   __ push(atos); // save receiver for result, and for GC

3288   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc));
3289   __ pop_ptr(rdx); // restore receiver
3290   __ movq(rdx, Address(rdx, oopDesc::klass_offset_in_bytes()));
3291   __ movq(rcx, r12); // restore rcx



3292   __ jmpb(resolved);
3293 
3294   // Get superklass in rax and subklass in rdx
3295   __ bind(quicked);
3296   __ movq(rdx, Address(rax, oopDesc::klass_offset_in_bytes()));
3297   __ movq(rax, Address(rcx, rbx,
3298                        Address::times_8, sizeof(constantPoolOopDesc)));
3299 
3300   __ bind(resolved);
3301 
3302   // Generate subtype check.  Blows rcx, rdi
3303   // Superklass in rax.  Subklass in rdx.
3304   __ gen_subtype_check(rdx, ok_is_subtype);
3305 
3306   // Come here on failure
3307   __ xorl(rax, rax);
3308   __ jmpb(done);
3309   // Come here on success
3310   __ bind(ok_is_subtype);
3311   __ movl(rax, 1);
3312 
3313   // Collect counts on whether this test sees NULLs a lot or not.
3314   if (ProfileInterpreter) {
3315     __ jmp(done);
3316     __ bind(is_null);
3317     __ profile_null_seen(rcx);


3321   __ bind(done);
3322   // rax = 0: obj == NULL or  obj is not an instanceof the specified klass
3323   // rax = 1: obj != NULL and obj is     an instanceof the specified klass
3324 }
3325 
3326 //-----------------------------------------------------------------------------
3327 // Breakpoints
3328 void TemplateTable::_breakpoint() {
3329   // Note: We get here even if we are single stepping..
3330   // jbug inists on setting breakpoints at every bytecode 
3331   // even if we are in single step mode.  
3332  
3333   transition(vtos, vtos);
3334 
3335   // get the unpatched byte code
3336   __ get_method(c_rarg1);
3337   __ call_VM(noreg, 
3338              CAST_FROM_FN_PTR(address, 
3339                               InterpreterRuntime::get_original_bytecode_at),
3340              c_rarg1, r13);
3341   __ movq(rbx, rax);
3342 
3343   // post the breakpoint event
3344   __ get_method(c_rarg1);
3345   __ call_VM(noreg, 
3346              CAST_FROM_FN_PTR(address, InterpreterRuntime::_breakpoint),
3347              c_rarg1, r13);
3348 
3349   // complete the execution of original bytecode
3350   __ dispatch_only_normal(vtos);
3351 } 
3352 
3353 //-----------------------------------------------------------------------------
3354 // Exceptions
3355 
3356 void TemplateTable::athrow() {
3357   transition(atos, vtos);
3358   __ null_check(rax);
3359   __ jump(ExternalAddress(Interpreter::throw_exception_entry()));
3360 }
3361 


3379 void TemplateTable::monitorenter() {
3380   transition(atos, vtos);
3381 
3382   // check for NULL object
3383   __ null_check(rax);
3384 
3385   const Address monitor_block_top(
3386         rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
3387   const Address monitor_block_bot(
3388         rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
3389   const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
3390 
3391   Label allocated;
3392 
3393   // initialize entry pointer
3394   __ xorl(c_rarg1, c_rarg1); // points to free slot or NULL
3395 
3396   // find a free slot in the monitor block (result in c_rarg1)
3397   { 
3398     Label entry, loop, exit;
3399     __ movq(c_rarg3, monitor_block_top); // points to current entry,
3400                                      // starting with top-most entry
3401     __ leaq(c_rarg2, monitor_block_bot); // points to word before bottom
3402                                      // of monitor block
3403     __ jmpb(entry);
3404 
3405     __ bind(loop);
3406     // check if current entry is used
3407     __ cmpq(Address(c_rarg3, BasicObjectLock::obj_offset_in_bytes()), (int) NULL);
3408     // if not used then remember entry in c_rarg1
3409     __ cmovq(Assembler::equal, c_rarg1, c_rarg3); 
3410     // check if current entry is for same object
3411     __ cmpq(rax, Address(c_rarg3, BasicObjectLock::obj_offset_in_bytes()));
3412     // if same object then stop searching
3413     __ jccb(Assembler::equal, exit);
3414     // otherwise advance to next entry
3415     __ addq(c_rarg3, entry_size);
3416     __ bind(entry);
3417     // check if bottom reached
3418     __ cmpq(c_rarg3, c_rarg2);
3419     // if not at bottom then check this entry
3420     __ jcc(Assembler::notEqual, loop);
3421     __ bind(exit);
3422   }
3423 
3424   __ testq(c_rarg1, c_rarg1); // check if a slot has been found
3425   __ jcc(Assembler::notZero, allocated); // if found, continue with that one
3426 
3427   // allocate one if there's no free slot
3428   { 
3429     Label entry, loop;
3430     // 1. compute new pointers       // rsp: old expression stack top
3431     __ movq(c_rarg1, monitor_block_bot); // c_rarg1: old expression stack bottom
3432     __ subq(rsp, entry_size);        // move expression stack top
3433     __ subq(c_rarg1, entry_size);        // move expression stack bottom
3434     __ movq(c_rarg3, rsp);               // set start value for copy loop
3435     __ movq(monitor_block_bot, c_rarg1); // set new monitor block bottom
3436     __ jmp(entry);
3437     // 2. move expression stack contents
3438     __ bind(loop);
3439     __ movq(c_rarg2, Address(c_rarg3, entry_size)); // load expression stack
3440                                             // word from old location
3441     __ movq(Address(c_rarg3, 0), c_rarg2);  // and store it at new location
3442     __ addq(c_rarg3, wordSize);             // advance to next word
3443     __ bind(entry);
3444     __ cmpq(c_rarg3, c_rarg1);              // check if bottom reached
3445     __ jcc(Assembler::notEqual, loop);      // if not at bottom then
3446                                             // copy next word
3447   }
3448   
3449   // call run-time routine
3450   // c_rarg1: points to monitor entry
3451   __ bind(allocated);
3452 
3453   // Increment bcp to point to the next bytecode, so exception
3454   // handling for async. exceptions work correctly.
3455   // The object has already been poped from the stack, so the
3456   // expression stack looks correct.
3457   __ incrementq(r13);
3458 
3459   // store object  
3460   __ movq(Address(c_rarg1, BasicObjectLock::obj_offset_in_bytes()), rax); 
3461   __ lock_object(c_rarg1);
3462 
3463   // check to make sure this monitor doesn't cause stack overflow after locking
3464   __ save_bcp();  // in case of exception
3465   __ generate_stack_overflow_check(0);
3466 
3467   // The bcp has already been incremented. Just need to dispatch to
3468   // next instruction.
3469   __ dispatch_next(vtos);
3470 }
3471 
3472 
3473 void TemplateTable::monitorexit() {
3474   transition(atos, vtos);
3475 
3476   // check for NULL object
3477   __ null_check(rax);
3478 
3479   const Address monitor_block_top(
3480         rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
3481   const Address monitor_block_bot(
3482         rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
3483   const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
3484 
3485   Label found;
3486 
3487   // find matching slot
3488   { 
3489     Label entry, loop;
3490     __ movq(c_rarg1, monitor_block_top); // points to current entry,
3491                                      // starting with top-most entry
3492     __ leaq(c_rarg2, monitor_block_bot); // points to word before bottom
3493                                      // of monitor block
3494     __ jmpb(entry);
3495 
3496     __ bind(loop);
3497     // check if current entry is for same object
3498     __ cmpq(rax, Address(c_rarg1, BasicObjectLock::obj_offset_in_bytes()));
3499     // if same object then stop searching
3500     __ jcc(Assembler::equal, found);
3501     // otherwise advance to next entry
3502     __ addq(c_rarg1, entry_size);
3503     __ bind(entry);
3504     // check if bottom reached
3505     __ cmpq(c_rarg1, c_rarg2);
3506     // if not at bottom then check this entry
3507     __ jcc(Assembler::notEqual, loop);
3508   }
3509 
3510   // error handling. Unlocking was not block-structured
3511   __ call_VM(noreg, CAST_FROM_FN_PTR(address, 
3512                    InterpreterRuntime::throw_illegal_monitor_state_exception));
3513   __ should_not_reach_here();
3514 
3515   // call run-time routine
3516   // rsi: points to monitor entry
3517   __ bind(found);
3518   __ push_ptr(rax); // make sure object is on stack (contract with oopMaps)  
3519   __ unlock_object(c_rarg1);    
3520   __ pop_ptr(rax); // discard object  
3521 }
3522 
3523 
3524 // Wide instructions
3525 void TemplateTable::wide() {
3526   transition(vtos, vtos);
3527   __ load_unsigned_byte(rbx, at_bcp(1));
3528   __ lea(rscratch1, ExternalAddress((address)Interpreter::_wentry_point));
3529   __ jmp(Address(rscratch1, rbx, Address::times_8));
3530   // Note: the r13 increment step is part of the individual wide
3531   // bytecode implementations
3532 }
3533 
3534 
3535 // Multi arrays
3536 void TemplateTable::multianewarray() {
3537   transition(vtos, atos);
3538   __ load_unsigned_byte(rax, at_bcp(3)); // get number of dimensions
3539   // last dim is on top of stack; we want address of first one:
3540   // first_addr = last_addr + (ndims - 1) * wordSize
3541   if (TaggedStackInterpreter) __ shll(rax, 1);  // index*2
3542   __ leaq(c_rarg1, Address(rsp, rax, Address::times_8, -wordSize));
3543   call_VM(rax, 
3544           CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray),
3545           c_rarg1);
3546   __ load_unsigned_byte(rbx, at_bcp(3));
3547   if (TaggedStackInterpreter) __ shll(rbx, 1);  // index*2
3548   __ leaq(rsp, Address(rsp, rbx, Address::times_8));
3549 }




   1 /*
   2  * Copyright 2003-2008 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  20  * CA 95054 USA or visit www.sun.com if you need additional information or
  21  * have any questions.
  22  *
  23  */
  24 
  25 #include "incls/_precompiled.incl"
  26 #include "incls/_templateTable_x86_64.cpp.incl"
  27 
  28 #ifndef CC_INTERP
  29 
  30 #define __ _masm->
  31 
  32 // Platform-dependent initialization
  33 
  34 void TemplateTable::pd_initialize() {
  35   // No amd64 specific initialization
  36 }
  37 
  38 // Address computation: local variables
  39 
  40 static inline Address iaddress(int n) {
  41   return Address(r14, Interpreter::local_offset_in_bytes(n));
  42 }
  43 
  44 static inline Address laddress(int n) {
  45   return iaddress(n + 1);
  46 }
  47 
  48 static inline Address faddress(int n) {
  49   return iaddress(n);


  98 static inline Address at_tos_p3() {
  99   return Address(rsp,  Interpreter::expr_offset_in_bytes(3));
 100 }
 101 
 102 // Condition conversion
 103 static Assembler::Condition j_not(TemplateTable::Condition cc) {
 104   switch (cc) {
 105   case TemplateTable::equal        : return Assembler::notEqual;
 106   case TemplateTable::not_equal    : return Assembler::equal;
 107   case TemplateTable::less         : return Assembler::greaterEqual;
 108   case TemplateTable::less_equal   : return Assembler::greater;
 109   case TemplateTable::greater      : return Assembler::lessEqual;
 110   case TemplateTable::greater_equal: return Assembler::less;
 111   }
 112   ShouldNotReachHere();
 113   return Assembler::zero;
 114 }
 115 
 116 
 117 // Miscelaneous helper routines
 118 // Store an oop (or NULL) at the address described by obj.
 119 // If val == noreg this means store a NULL
 120 
 121 static void do_oop_store(InterpreterMacroAssembler* _masm,
 122                          Address obj,
 123                          Register val,
 124                          BarrierSet::Name barrier,
 125                          bool precise) {
 126   assert(val == noreg || val == rax, "parameter is just for looks");
 127   switch (barrier) {
 128 #ifndef SERIALGC
 129     case BarrierSet::G1SATBCT:
 130     case BarrierSet::G1SATBCTLogging:
 131       {
 132         // flatten object address if needed
 133         if (obj.index() == noreg && obj.disp() == 0) {
 134           if (obj.base() != rdx) {
 135             __ movq(rdx, obj.base());
 136           }
 137         } else {
 138           __ leaq(rdx, obj);
 139         }
 140         __ g1_write_barrier_pre(rdx, r8, rbx, val != noreg);
 141         if (val == noreg) {
 142           __ store_heap_oop(Address(rdx, 0), NULL_WORD);
 143         } else {
 144           __ store_heap_oop(Address(rdx, 0), val);
 145           __ g1_write_barrier_post(rdx, val, r8, rbx);
 146         }
 147 
 148       }
 149       break;
 150 #endif // SERIALGC
 151     case BarrierSet::CardTableModRef:
 152     case BarrierSet::CardTableExtension:
 153       {
 154         if (val == noreg) {
 155           __ store_heap_oop(obj, NULL_WORD);
 156         } else {
 157           __ store_heap_oop(obj, val);
 158           // flatten object address if needed
 159           if (!precise || (obj.index() == noreg && obj.disp() == 0)) {
 160             __ store_check(obj.base());
 161           } else {
 162             __ leaq(rdx, obj);
 163             __ store_check(rdx);
 164           }
 165         }
 166       }
 167       break;
 168     case BarrierSet::ModRef:
 169     case BarrierSet::Other:
 170       if (val == noreg) {
 171         __ store_heap_oop(obj, NULL_WORD);
 172       } else {
 173         __ store_heap_oop(obj, val);
 174       }
 175       break;
 176     default      :
 177       ShouldNotReachHere();
 178 
 179   }
 180 }
 181 
 182 Address TemplateTable::at_bcp(int offset) {
 183   assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
 184   return Address(r13, offset);
 185 }
 186 
 187 void TemplateTable::patch_bytecode(Bytecodes::Code bytecode, Register bc,
 188                                    Register scratch,
 189                                    bool load_bc_into_scratch/*=true*/) {
 190   if (!RewriteBytecodes) {
 191     return;
 192   }
 193   // the pair bytecodes have already done the load.
 194   if (load_bc_into_scratch) {
 195     __ movl(bc, bytecode);
 196   }
 197   Label patch_done;
 198   if (JvmtiExport::can_post_breakpoint()) {
 199     Label fast_patch;
 200     // if a breakpoint is present we can't rewrite the stream directly


 365 #ifdef ASSERT
 366   {
 367     Label L;
 368     __ cmpl(rdx, JVM_CONSTANT_Integer);
 369     __ jcc(Assembler::equal, L);
 370     __ cmpl(rdx, JVM_CONSTANT_String);
 371     __ jcc(Assembler::equal, L);
 372     __ stop("unexpected tag type in ldc");
 373     __ bind(L);
 374   }
 375 #endif
 376   // atos and itos
 377   Label isOop;
 378   __ cmpl(rdx, JVM_CONSTANT_Integer);
 379   __ jcc(Assembler::notEqual, isOop);
 380   __ movl(rax, Address(rcx, rbx, Address::times_8, base_offset));
 381   __ push_i(rax);
 382   __ jmp(Done);
 383 
 384   __ bind(isOop);
 385   __ movptr(rax, Address(rcx, rbx, Address::times_8, base_offset));
 386   __ push_ptr(rax);
 387 
 388   if (VerifyOops) {
 389     __ verify_oop(rax);
 390   }
 391 
 392   __ bind(Done);
 393 }
 394 
 395 void TemplateTable::ldc2_w() {
 396   transition(vtos, vtos);
 397   Label Long, Done;
 398   __ get_unsigned_2_byte_index_at_bcp(rbx, 1);
 399 
 400   __ get_cpool_and_tags(rcx, rax);
 401   const int base_offset = constantPoolOopDesc::header_size() * wordSize;
 402   const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
 403 
 404   // get type
 405   __ cmpb(Address(rax, rbx, Address::times_1, tags_offset),
 406           JVM_CONSTANT_Double);
 407   __ jccb(Assembler::notEqual, Long);
 408   // dtos
 409   __ movdbl(xmm0, Address(rcx, rbx, Address::times_8, base_offset));
 410   __ push_d();
 411   __ jmpb(Done);
 412 
 413   __ bind(Long);
 414   // ltos
 415   __ movq(rax, Address(rcx, rbx, Address::times_8, base_offset));
 416   __ push_l();
 417 
 418   __ bind(Done);
 419 }
 420 
 421 void TemplateTable::locals_index(Register reg, int offset) {
 422   __ load_unsigned_byte(reg, at_bcp(offset));
 423   __ negptr(reg);
 424   if (TaggedStackInterpreter) __ shlptr(reg, 1);  // index = index*2
 425 }
 426 
 427 void TemplateTable::iload() {
 428   transition(vtos, itos);
 429   if (RewriteFrequentPairs) {
 430     Label rewrite, done;
 431     const Register bc = c_rarg3;
 432     assert(rbx != bc, "register damaged");
 433 
 434     // get next byte
 435     __ load_unsigned_byte(rbx,
 436                           at_bcp(Bytecodes::length_for(Bytecodes::_iload)));
 437     // if _iload, wait to rewrite to iload2.  We only want to rewrite the
 438     // last two iloads in a pair.  Comparing against fast_iload means that
 439     // the next bytecode is neither an iload or a caload, and therefore
 440     // an iload pair.
 441     __ cmpl(rbx, Bytecodes::_iload);
 442     __ jcc(Assembler::equal, done);
 443 
 444     __ cmpl(rbx, Bytecodes::_fast_iload);


 491   debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
 492 }
 493 
 494 void TemplateTable::fload() {
 495   transition(vtos, ftos);
 496   locals_index(rbx);
 497   __ movflt(xmm0, faddress(rbx));
 498   debug_only(__ verify_local_tag(frame::TagValue, rbx));
 499 }
 500 
 501 void TemplateTable::dload() {
 502   transition(vtos, dtos);
 503   locals_index(rbx);
 504   __ movdbl(xmm0, daddress(rbx));
 505   debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
 506 }
 507 
 508 void TemplateTable::aload() {
 509   transition(vtos, atos);
 510   locals_index(rbx);
 511   __ movptr(rax, aaddress(rbx));
 512   debug_only(__ verify_local_tag(frame::TagReference, rbx));
 513 }
 514 
 515 void TemplateTable::locals_index_wide(Register reg) {
 516   __ movl(reg, at_bcp(2));
 517   __ bswapl(reg);
 518   __ shrl(reg, 16);
 519   __ negptr(reg);
 520   if (TaggedStackInterpreter) __ shlptr(reg, 1);  // index = index*2
 521 }
 522 
 523 void TemplateTable::wide_iload() {
 524   transition(vtos, itos);
 525   locals_index_wide(rbx);
 526   __ movl(rax, iaddress(rbx));
 527   debug_only(__ verify_local_tag(frame::TagValue, rbx));
 528 }
 529 
 530 void TemplateTable::wide_lload() {
 531   transition(vtos, ltos);
 532   locals_index_wide(rbx);
 533   __ movq(rax, laddress(rbx));
 534   debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
 535 }
 536 
 537 void TemplateTable::wide_fload() {
 538   transition(vtos, ftos);
 539   locals_index_wide(rbx);
 540   __ movflt(xmm0, faddress(rbx));
 541   debug_only(__ verify_local_tag(frame::TagValue, rbx));
 542 }
 543 
 544 void TemplateTable::wide_dload() {
 545   transition(vtos, dtos);
 546   locals_index_wide(rbx);
 547   __ movdbl(xmm0, daddress(rbx));
 548   debug_only(__ verify_local_tag(frame::TagCategory2, rbx));
 549 }
 550 
 551 void TemplateTable::wide_aload() {
 552   transition(vtos, atos);
 553   locals_index_wide(rbx);
 554   __ movptr(rax, aaddress(rbx));
 555   debug_only(__ verify_local_tag(frame::TagReference, rbx));
 556 }
 557 
 558 void TemplateTable::index_check(Register array, Register index) {
 559   // destroys rbx
 560   // check array
 561   __ null_check(array, arrayOopDesc::length_offset_in_bytes());
 562   // sign extend index for use by indexed load
 563   __ movl2ptr(index, index);
 564   // check index
 565   __ cmpl(index, Address(array, arrayOopDesc::length_offset_in_bytes()));
 566   if (index != rbx) {
 567     // ??? convention: move aberrant index into ebx for exception message
 568     assert(rbx != array, "different registers");
 569     __ movl(rbx, index);
 570   }
 571   __ jump_cc(Assembler::aboveEqual,
 572              ExternalAddress(Interpreter::_throw_ArrayIndexOutOfBoundsException_entry));
 573 }
 574 
 575 void TemplateTable::iaload() {
 576   transition(itos, itos);
 577   __ pop_ptr(rdx);
 578   // eax: index
 579   // rdx: array
 580   index_check(rdx, rax); // kills rbx
 581   __ movl(rax, Address(rdx, rax,
 582                        Address::times_4,
 583                        arrayOopDesc::base_offset_in_bytes(T_INT)));


 605                          arrayOopDesc::base_offset_in_bytes(T_FLOAT)));
 606 }
 607 
 608 void TemplateTable::daload() {
 609   transition(itos, dtos);
 610   __ pop_ptr(rdx);
 611   // eax: index
 612   // rdx: array
 613   index_check(rdx, rax); // kills rbx
 614   __ movdbl(xmm0, Address(rdx, rax,
 615                           Address::times_8,
 616                           arrayOopDesc::base_offset_in_bytes(T_DOUBLE)));
 617 }
 618 
 619 void TemplateTable::aaload() {
 620   transition(itos, atos);
 621   __ pop_ptr(rdx);
 622   // eax: index
 623   // rdx: array
 624   index_check(rdx, rax); // kills rbx
 625   __ load_heap_oop(rax, Address(rdx, rax,
 626                                 UseCompressedOops ? Address::times_4 : Address::times_8,
 627                                 arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
 628 }
 629 
 630 void TemplateTable::baload() {
 631   transition(itos, itos);
 632   __ pop_ptr(rdx);
 633   // eax: index
 634   // rdx: array
 635   index_check(rdx, rax); // kills rbx
 636   __ load_signed_byte(rax,
 637                       Address(rdx, rax,
 638                               Address::times_1,
 639                               arrayOopDesc::base_offset_in_bytes(T_BYTE)));
 640 }
 641 
 642 void TemplateTable::caload() {
 643   transition(itos, itos);
 644   __ pop_ptr(rdx);
 645   // eax: index
 646   // rdx: array


 690 void TemplateTable::lload(int n) {
 691   transition(vtos, ltos);
 692   __ movq(rax, laddress(n));
 693   debug_only(__ verify_local_tag(frame::TagCategory2, n));
 694 }
 695 
 696 void TemplateTable::fload(int n) {
 697   transition(vtos, ftos);
 698   __ movflt(xmm0, faddress(n));
 699   debug_only(__ verify_local_tag(frame::TagValue, n));
 700 }
 701 
 702 void TemplateTable::dload(int n) {
 703   transition(vtos, dtos);
 704   __ movdbl(xmm0, daddress(n));
 705   debug_only(__ verify_local_tag(frame::TagCategory2, n));
 706 }
 707 
 708 void TemplateTable::aload(int n) {
 709   transition(vtos, atos);
 710   __ movptr(rax, aaddress(n));
 711   debug_only(__ verify_local_tag(frame::TagReference, n));
 712 }
 713 
 714 void TemplateTable::aload_0() {
 715   transition(vtos, atos);
 716   // According to bytecode histograms, the pairs:
 717   //
 718   // _aload_0, _fast_igetfield
 719   // _aload_0, _fast_agetfield
 720   // _aload_0, _fast_fgetfield
 721   //
 722   // occur frequently. If RewriteFrequentPairs is set, the (slow)
 723   // _aload_0 bytecode checks if the next bytecode is either
 724   // _fast_igetfield, _fast_agetfield or _fast_fgetfield and then
 725   // rewrites the current bytecode into a pair bytecode; otherwise it
 726   // rewrites the current bytecode into _fast_aload_0 that doesn't do
 727   // the pair check anymore.
 728   //
 729   // Note: If the next bytecode is _getfield, the rewrite must be
 730   //       delayed, otherwise we may miss an opportunity for a pair.


 805 }
 806 
 807 void TemplateTable::fstore() {
 808   transition(ftos, vtos);
 809   locals_index(rbx);
 810   __ movflt(faddress(rbx), xmm0);
 811   __ tag_local(frame::TagValue, rbx);
 812 }
 813 
 814 void TemplateTable::dstore() {
 815   transition(dtos, vtos);
 816   locals_index(rbx);
 817   __ movdbl(daddress(rbx), xmm0);
 818   __ tag_local(frame::TagCategory2, rbx);
 819 }
 820 
 821 void TemplateTable::astore() {
 822   transition(vtos, vtos);
 823   __ pop_ptr(rax, rdx);    // will need to pop tag too
 824   locals_index(rbx);
 825   __ movptr(aaddress(rbx), rax);
 826   __ tag_local(rdx, rbx);  // store tag from stack, might be returnAddr
 827 }
 828 
 829 void TemplateTable::wide_istore() {
 830   transition(vtos, vtos);
 831   __ pop_i();
 832   locals_index_wide(rbx);
 833   __ movl(iaddress(rbx), rax);
 834   __ tag_local(frame::TagValue, rbx);
 835 }
 836 
 837 void TemplateTable::wide_lstore() {
 838   transition(vtos, vtos);
 839   __ pop_l();
 840   locals_index_wide(rbx);
 841   __ movq(laddress(rbx), rax);
 842   __ tag_local(frame::TagCategory2, rbx);
 843 }
 844 
 845 void TemplateTable::wide_fstore() {
 846   transition(vtos, vtos);
 847   __ pop_f();
 848   locals_index_wide(rbx);
 849   __ movflt(faddress(rbx), xmm0);
 850   __ tag_local(frame::TagValue, rbx);
 851 }
 852 
 853 void TemplateTable::wide_dstore() {
 854   transition(vtos, vtos);
 855   __ pop_d();
 856   locals_index_wide(rbx);
 857   __ movdbl(daddress(rbx), xmm0);
 858   __ tag_local(frame::TagCategory2, rbx);
 859 }
 860 
 861 void TemplateTable::wide_astore() {
 862   transition(vtos, vtos);
 863   __ pop_ptr(rax, rdx);    // will need to pop tag too
 864   locals_index_wide(rbx);
 865   __ movptr(aaddress(rbx), rax);
 866   __ tag_local(rdx, rbx);  // store tag from stack, might be returnAddr
 867 }
 868 
 869 void TemplateTable::iastore() {
 870   transition(itos, vtos);
 871   __ pop_i(rbx);
 872   __ pop_ptr(rdx);
 873   // eax: value
 874   // ebx: index
 875   // rdx: array
 876   index_check(rdx, rbx); // prefer index in ebx
 877   __ movl(Address(rdx, rbx,
 878                   Address::times_4,
 879                   arrayOopDesc::base_offset_in_bytes(T_INT)),
 880           rax);
 881 }
 882 
 883 void TemplateTable::lastore() {
 884   transition(ltos, vtos);
 885   __ pop_i(rbx);


 909 }
 910 
 911 void TemplateTable::dastore() {
 912   transition(dtos, vtos);
 913   __ pop_i(rbx);
 914   __ pop_ptr(rdx);
 915   // xmm0: value
 916   // ebx:  index
 917   // rdx:  array
 918   index_check(rdx, rbx); // prefer index in ebx
 919   __ movdbl(Address(rdx, rbx,
 920                    Address::times_8,
 921                    arrayOopDesc::base_offset_in_bytes(T_DOUBLE)),
 922            xmm0);
 923 }
 924 
 925 void TemplateTable::aastore() {
 926   Label is_null, ok_is_subtype, done;
 927   transition(vtos, vtos);
 928   // stack: ..., array, index, value
 929   __ movptr(rax, at_tos());    // value
 930   __ movl(rcx, at_tos_p1()); // index
 931   __ movptr(rdx, at_tos_p2()); // array
 932 
 933   Address element_address(rdx, rcx,
 934                           UseCompressedOops? Address::times_4 : Address::times_8,
 935                           arrayOopDesc::base_offset_in_bytes(T_OBJECT));
 936 
 937   index_check(rdx, rcx);     // kills rbx
 938   // do array store check - check for NULL value first
 939   __ testptr(rax, rax);
 940   __ jcc(Assembler::zero, is_null);
 941 
 942   // Move subklass into rbx
 943   __ load_klass(rbx, rax);
 944   // Move superklass into rax
 945   __ load_klass(rax, rdx);
 946   __ movptr(rax, Address(rax,
 947                          sizeof(oopDesc) +
 948                          objArrayKlass::element_klass_offset_in_bytes()));
 949   // Compress array + index*oopSize + 12 into a single register.  Frees rcx.
 950   __ lea(rdx, element_address);


 951 
 952   // Generate subtype check.  Blows rcx, rdi
 953   // Superklass in rax.  Subklass in rbx.
 954   __ gen_subtype_check(rbx, ok_is_subtype);
 955 
 956   // Come here on failure
 957   // object is at TOS
 958   __ jump(ExternalAddress(Interpreter::_throw_ArrayStoreException_entry));
 959 
 960   // Come here on success
 961   __ bind(ok_is_subtype);
 962 
 963   // Get the value we will store
 964   __ movptr(rax, at_tos());
 965   // Now store using the appropriate barrier
 966   do_oop_store(_masm, Address(rdx, 0), rax, _bs->kind(), true);
 967   __ jmp(done);
 968 
 969   // Have a NULL in rax, rdx=array, ecx=index.  Store NULL at ary[idx]
 970   __ bind(is_null);
 971   __ profile_null_seen(rbx);
 972 
 973   // Store a NULL
 974   do_oop_store(_masm, element_address, noreg, _bs->kind(), true);

 975 
 976   // Pop stack arguments
 977   __ bind(done);
 978   __ addptr(rsp, 3 * Interpreter::stackElementSize());
 979 }
 980 
 981 void TemplateTable::bastore() {
 982   transition(itos, vtos);
 983   __ pop_i(rbx);
 984   __ pop_ptr(rdx);
 985   // eax: value
 986   // ebx: index
 987   // rdx: array
 988   index_check(rdx, rbx); // prefer index in ebx
 989   __ movb(Address(rdx, rbx,
 990                   Address::times_1,
 991                   arrayOopDesc::base_offset_in_bytes(T_BYTE)),
 992           rax);
 993 }
 994 
 995 void TemplateTable::castore() {
 996   transition(itos, vtos);
 997   __ pop_i(rbx);
 998   __ pop_ptr(rdx);


1020   transition(ltos, vtos);
1021   __ movq(laddress(n), rax);
1022   __ tag_local(frame::TagCategory2, n);
1023 }
1024 
1025 void TemplateTable::fstore(int n) {
1026   transition(ftos, vtos);
1027   __ movflt(faddress(n), xmm0);
1028   __ tag_local(frame::TagValue, n);
1029 }
1030 
1031 void TemplateTable::dstore(int n) {
1032   transition(dtos, vtos);
1033   __ movdbl(daddress(n), xmm0);
1034   __ tag_local(frame::TagCategory2, n);
1035 }
1036 
1037 void TemplateTable::astore(int n) {
1038   transition(vtos, vtos);
1039   __ pop_ptr(rax, rdx);
1040   __ movptr(aaddress(n), rax);
1041   __ tag_local(rdx, n);
1042 }
1043 
1044 void TemplateTable::pop() {
1045   transition(vtos, vtos);
1046   __ addptr(rsp, Interpreter::stackElementSize());
1047 }
1048 
1049 void TemplateTable::pop2() {
1050   transition(vtos, vtos);
1051   __ addptr(rsp, 2 * Interpreter::stackElementSize());
1052 }
1053 
1054 void TemplateTable::dup() {
1055   transition(vtos, vtos);
1056   __ load_ptr_and_tag(0, rax, rdx);
1057   __ push_ptr(rax, rdx);
1058   // stack: ..., a, a
1059 }
1060 
1061 void TemplateTable::dup_x1() {
1062   transition(vtos, vtos);
1063   // stack: ..., a, b
1064   __ load_ptr_and_tag(0, rax, rdx);  // load b
1065   __ load_ptr_and_tag(1, rcx, rbx);  // load a
1066   __ store_ptr_and_tag(1, rax, rdx); // store b
1067   __ store_ptr_and_tag(0, rcx, rbx); // store a
1068   __ push_ptr(rax, rdx);             // push b
1069   // stack: ..., b, a, b
1070 }
1071 


1142 
1143 void TemplateTable::iop2(Operation op) {
1144   transition(itos, itos);
1145   switch (op) {
1146   case add  :                    __ pop_i(rdx); __ addl (rax, rdx); break;
1147   case sub  : __ movl(rdx, rax); __ pop_i(rax); __ subl (rax, rdx); break;
1148   case mul  :                    __ pop_i(rdx); __ imull(rax, rdx); break;
1149   case _and :                    __ pop_i(rdx); __ andl (rax, rdx); break;
1150   case _or  :                    __ pop_i(rdx); __ orl  (rax, rdx); break;
1151   case _xor :                    __ pop_i(rdx); __ xorl (rax, rdx); break;
1152   case shl  : __ movl(rcx, rax); __ pop_i(rax); __ shll (rax);      break;
1153   case shr  : __ movl(rcx, rax); __ pop_i(rax); __ sarl (rax);      break;
1154   case ushr : __ movl(rcx, rax); __ pop_i(rax); __ shrl (rax);      break;
1155   default   : ShouldNotReachHere();
1156   }
1157 }
1158 
1159 void TemplateTable::lop2(Operation op) {
1160   transition(ltos, ltos);
1161   switch (op) {
1162   case add  :                    __ pop_l(rdx); __ addptr (rax, rdx); break;
1163   case sub  : __ mov(rdx, rax);  __ pop_l(rax); __ subptr (rax, rdx); break;
1164   case _and :                    __ pop_l(rdx); __ andptr (rax, rdx); break;
1165   case _or  :                    __ pop_l(rdx); __ orptr  (rax, rdx); break;
1166   case _xor :                    __ pop_l(rdx); __ xorptr (rax, rdx); break;
1167   default : ShouldNotReachHere();
1168   }
1169 }
1170 
1171 void TemplateTable::idiv() {
1172   transition(itos, itos);
1173   __ movl(rcx, rax);
1174   __ pop_i(rax);
1175   // Note: could xor eax and ecx and compare with (-1 ^ min_int). If
1176   //       they are not equal, one could do a normal division (no correction
1177   //       needed), which may speed up this implementation for the common case.
1178   //       (see also JVM spec., p.243 & p.271)
1179   __ corrected_idivl(rcx);
1180 }
1181 
1182 void TemplateTable::irem() {
1183   transition(itos, itos);
1184   __ movl(rcx, rax);
1185   __ pop_i(rax);
1186   // Note: could xor eax and ecx and compare with (-1 ^ min_int). If
1187   //       they are not equal, one could do a normal division (no correction
1188   //       needed), which may speed up this implementation for the common case.
1189   //       (see also JVM spec., p.243 & p.271)
1190   __ corrected_idivl(rcx);
1191   __ movl(rax, rdx);
1192 }
1193 
1194 void TemplateTable::lmul() {
1195   transition(ltos, ltos);
1196   __ pop_l(rdx);
1197   __ imulq(rax, rdx);
1198 }
1199 
1200 void TemplateTable::ldiv() {
1201   transition(ltos, ltos);
1202   __ mov(rcx, rax);
1203   __ pop_l(rax);
1204   // generate explicit div0 check
1205   __ testq(rcx, rcx);
1206   __ jump_cc(Assembler::zero,
1207              ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
1208   // Note: could xor rax and rcx and compare with (-1 ^ min_int). If
1209   //       they are not equal, one could do a normal division (no correction
1210   //       needed), which may speed up this implementation for the common case.
1211   //       (see also JVM spec., p.243 & p.271)
1212   __ corrected_idivq(rcx); // kills rbx
1213 }
1214 
1215 void TemplateTable::lrem() {
1216   transition(ltos, ltos);
1217   __ mov(rcx, rax);
1218   __ pop_l(rax);
1219   __ testq(rcx, rcx);
1220   __ jump_cc(Assembler::zero,
1221              ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
1222   // Note: could xor rax and rcx and compare with (-1 ^ min_int). If
1223   //       they are not equal, one could do a normal division (no correction
1224   //       needed), which may speed up this implementation for the common case.
1225   //       (see also JVM spec., p.243 & p.271)
1226   __ corrected_idivq(rcx); // kills rbx
1227   __ mov(rax, rdx);
1228 }
1229 
1230 void TemplateTable::lshl() {
1231   transition(itos, ltos);
1232   __ movl(rcx, rax);                             // get shift count
1233   __ pop_l(rax);                                 // get shift value
1234   __ shlq(rax);
1235 }
1236 
1237 void TemplateTable::lshr() {
1238   transition(itos, ltos);
1239   __ movl(rcx, rax);                             // get shift count
1240   __ pop_l(rax);                                 // get shift value
1241   __ sarq(rax);
1242 }
1243 
1244 void TemplateTable::lushr() {
1245   transition(itos, ltos);
1246   __ movl(rcx, rax);                             // get shift count
1247   __ pop_l(rax);                                 // get shift value
1248   __ shrq(rax);
1249 }
1250 
1251 void TemplateTable::fop2(Operation op) {
1252   transition(ftos, ftos);
1253   switch (op) {
1254   case add:
1255     __ addss(xmm0, at_rsp());
1256     __ addptr(rsp, Interpreter::stackElementSize());
1257     break;
1258   case sub:
1259     __ movflt(xmm1, xmm0);
1260     __ pop_f(xmm0);
1261     __ subss(xmm0, xmm1);
1262     break;
1263   case mul:
1264     __ mulss(xmm0, at_rsp());
1265     __ addptr(rsp, Interpreter::stackElementSize());
1266     break;
1267   case div:
1268     __ movflt(xmm1, xmm0);
1269     __ pop_f(xmm0);
1270     __ divss(xmm0, xmm1);
1271     break;
1272   case rem:
1273     __ movflt(xmm1, xmm0);
1274     __ pop_f(xmm0);
1275     __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::frem), 2);
1276     break;
1277   default:
1278     ShouldNotReachHere();
1279     break;
1280   }
1281 }
1282 
1283 void TemplateTable::dop2(Operation op) {
1284   transition(dtos, dtos);
1285   switch (op) {
1286   case add:
1287     __ addsd(xmm0, at_rsp());
1288     __ addptr(rsp, 2 * Interpreter::stackElementSize());
1289     break;
1290   case sub:
1291     __ movdbl(xmm1, xmm0);
1292     __ pop_d(xmm0);
1293     __ subsd(xmm0, xmm1);
1294     break;
1295   case mul:
1296     __ mulsd(xmm0, at_rsp());
1297     __ addptr(rsp, 2 * Interpreter::stackElementSize());
1298     break;
1299   case div:
1300     __ movdbl(xmm1, xmm0);
1301     __ pop_d(xmm0);
1302     __ divsd(xmm0, xmm1);
1303     break;
1304   case rem:
1305     __ movdbl(xmm1, xmm0);
1306     __ pop_d(xmm0);
1307     __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::drem), 2);
1308     break;
1309   default:
1310     ShouldNotReachHere();
1311     break;
1312   }
1313 }
1314 
1315 void TemplateTable::ineg() {
1316   transition(itos, itos);
1317   __ negl(rax);


1538 }
1539 
1540 void TemplateTable::branch(bool is_jsr, bool is_wide) {
1541   __ get_method(rcx); // rcx holds method
1542   __ profile_taken_branch(rax, rbx); // rax holds updated MDP, rbx
1543                                      // holds bumped taken count
1544 
1545   const ByteSize be_offset = methodOopDesc::backedge_counter_offset() +
1546                              InvocationCounter::counter_offset();
1547   const ByteSize inv_offset = methodOopDesc::invocation_counter_offset() +
1548                               InvocationCounter::counter_offset();
1549   const int method_offset = frame::interpreter_frame_method_offset * wordSize;
1550 
1551   // Load up edx with the branch displacement
1552   __ movl(rdx, at_bcp(1));
1553   __ bswapl(rdx);
1554 
1555   if (!is_wide) {
1556     __ sarl(rdx, 16);
1557   }
1558   __ movl2ptr(rdx, rdx);
1559 
1560   // Handle all the JSR stuff here, then exit.
1561   // It's much shorter and cleaner than intermingling with the non-JSR
1562   // normal-branch stuff occuring below.
1563   if (is_jsr) {
1564     // Pre-load the next target bytecode into rbx
1565     __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1, 0));
1566 
1567     // compute return address as bci in rax
1568     __ lea(rax, at_bcp((is_wide ? 5 : 3) -
1569                         in_bytes(constMethodOopDesc::codes_offset())));
1570     __ subptr(rax, Address(rcx, methodOopDesc::const_offset()));
1571     // Adjust the bcp in r13 by the displacement in rdx
1572     __ addptr(r13, rdx);
1573     // jsr returns atos that is not an oop
1574     __ push_i(rax);
1575     __ dispatch_only(vtos);
1576     return;
1577   }
1578 
1579   // Normal (non-jsr) branch handling
1580 
1581   // Adjust the bcp in r13 by the displacement in rdx
1582   __ addptr(r13, rdx);
1583 
1584   assert(UseLoopCounter || !UseOnStackReplacement,
1585          "on-stack-replacement requires loop counters");
1586   Label backedge_counter_overflow;
1587   Label profile_method;
1588   Label dispatch;
1589   if (UseLoopCounter) {
1590     // increment backedge counter for backward branches
1591     // rax: MDO
1592     // ebx: MDO bumped taken-count
1593     // rcx: method
1594     // rdx: target offset
1595     // r13: target bcp
1596     // r14: locals pointer
1597     __ testl(rdx, rdx);             // check if forward or backward branch
1598     __ jcc(Assembler::positive, dispatch); // count only if backward branch
1599 
1600     // increment counter
1601     __ movl(rax, Address(rcx, be_offset));        // load backedge counter
1602     __ incrementl(rax, InvocationCounter::count_increment); // increment


1646     __ bind(dispatch);
1647   }
1648 
1649   // Pre-load the next target bytecode into rbx
1650   __ load_unsigned_byte(rbx, Address(r13, 0));
1651 
1652   // continue with the bytecode @ target
1653   // eax: return bci for jsr's, unused otherwise
1654   // ebx: target bytecode
1655   // r13: target bcp
1656   __ dispatch_only(vtos);
1657 
1658   if (UseLoopCounter) {
1659     if (ProfileInterpreter) {
1660       // Out-of-line code to allocate method data oop.
1661       __ bind(profile_method);
1662       __ call_VM(noreg,
1663                  CAST_FROM_FN_PTR(address,
1664                                   InterpreterRuntime::profile_method), r13);
1665       __ load_unsigned_byte(rbx, Address(r13, 0));  // restore target bytecode
1666       __ movptr(rcx, Address(rbp, method_offset));
1667       __ movptr(rcx, Address(rcx,
1668                              in_bytes(methodOopDesc::method_data_offset())));
1669       __ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize),
1670                 rcx);
1671       __ test_method_data_pointer(rcx, dispatch);
1672       // offset non-null mdp by MDO::data_offset() + IR::profile_method()
1673       __ addptr(rcx, in_bytes(methodDataOopDesc::data_offset()));
1674       __ addptr(rcx, rax);
1675       __ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize),
1676                 rcx);
1677       __ jmp(dispatch);
1678     }
1679 
1680     if (UseOnStackReplacement) {
1681       // invocation counter overflow
1682       __ bind(backedge_counter_overflow);
1683       __ negptr(rdx);
1684       __ addptr(rdx, r13); // branch bcp
1685       // IcoResult frequency_counter_overflow([JavaThread*], address branch_bcp)
1686       __ call_VM(noreg,
1687                  CAST_FROM_FN_PTR(address,
1688                                   InterpreterRuntime::frequency_counter_overflow),
1689                  rdx);
1690       __ load_unsigned_byte(rbx, Address(r13, 0));  // restore target bytecode
1691 
1692       // rax: osr nmethod (osr ok) or NULL (osr not possible)
1693       // ebx: target bytecode
1694       // rdx: scratch
1695       // r14: locals pointer
1696       // r13: bcp
1697       __ testptr(rax, rax);                        // test result
1698       __ jcc(Assembler::zero, dispatch);         // no osr if null
1699       // nmethod may have been invalidated (VM may block upon call_VM return)
1700       __ movl(rcx, Address(rax, nmethod::entry_bci_offset()));
1701       __ cmpl(rcx, InvalidOSREntryBci);
1702       __ jcc(Assembler::equal, dispatch);
1703 
1704       // We have the address of an on stack replacement routine in eax
1705       // We need to prepare to execute the OSR method. First we must
1706       // migrate the locals and monitors off of the stack.
1707 
1708       __ mov(r13, rax);                             // save the nmethod
1709 
1710       call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin));
1711 
1712       // eax is OSR buffer, move it to expected parameter location
1713       __ mov(j_rarg0, rax);
1714 
1715       // We use j_rarg definitions here so that registers don't conflict as parameter
1716       // registers change across platforms as we are in the midst of a calling
1717       // sequence to the OSR nmethod and we don't want collision. These are NOT parameters.
1718 
1719       const Register retaddr = j_rarg2;
1720       const Register sender_sp = j_rarg1;
1721 
1722       // pop the interpreter frame
1723       __ movptr(sender_sp, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); // get sender sp
1724       __ leave();                                // remove frame anchor
1725       __ pop(retaddr);                           // get return address
1726       __ mov(rsp, sender_sp);                   // set sp to sender sp
1727       // Ensure compiled code always sees stack at proper alignment
1728       __ andptr(rsp, -(StackAlignmentInBytes));
1729 
1730       // unlike x86 we need no specialized return from compiled code
1731       // to the interpreter or the call stub.
1732 
1733       // push the return address
1734       __ push(retaddr);
1735 
1736       // and begin the OSR nmethod
1737       __ jmp(Address(r13, nmethod::osr_entry_point_offset()));
1738     }
1739   }
1740 }
1741 
1742 
1743 void TemplateTable::if_0cmp(Condition cc) {
1744   transition(itos, vtos);
1745   // assume branch is more often taken than not (loops use backward branches)
1746   Label not_taken;
1747   __ testl(rax, rax);
1748   __ jcc(j_not(cc), not_taken);
1749   branch(false, false);
1750   __ bind(not_taken);
1751   __ profile_not_taken_branch(rax);
1752 }
1753 
1754 void TemplateTable::if_icmp(Condition cc) {
1755   transition(itos, vtos);
1756   // assume branch is more often taken than not (loops use backward branches)
1757   Label not_taken;
1758   __ pop_i(rdx);
1759   __ cmpl(rdx, rax);
1760   __ jcc(j_not(cc), not_taken);
1761   branch(false, false);
1762   __ bind(not_taken);
1763   __ profile_not_taken_branch(rax);
1764 }
1765 
1766 void TemplateTable::if_nullcmp(Condition cc) {
1767   transition(atos, vtos);
1768   // assume branch is more often taken than not (loops use backward branches)
1769   Label not_taken;
1770   __ testptr(rax, rax);
1771   __ jcc(j_not(cc), not_taken);
1772   branch(false, false);
1773   __ bind(not_taken);
1774   __ profile_not_taken_branch(rax);
1775 }
1776 
1777 void TemplateTable::if_acmp(Condition cc) {
1778   transition(atos, vtos);
1779   // assume branch is more often taken than not (loops use backward branches)
1780   Label not_taken;
1781   __ pop_ptr(rdx);
1782   __ cmpptr(rdx, rax);
1783   __ jcc(j_not(cc), not_taken);
1784   branch(false, false);
1785   __ bind(not_taken);
1786   __ profile_not_taken_branch(rax);
1787 }
1788 
1789 void TemplateTable::ret() {
1790   transition(vtos, vtos);
1791   locals_index(rbx);
1792   __ movslq(rbx, iaddress(rbx)); // get return bci, compute return bcp
1793   __ profile_ret(rbx, rcx);
1794   __ get_method(rax);
1795   __ movptr(r13, Address(rax, methodOopDesc::const_offset()));
1796   __ lea(r13, Address(r13, rbx, Address::times_1,
1797                       constMethodOopDesc::codes_offset()));
1798   __ dispatch_next(vtos);
1799 }
1800 
1801 void TemplateTable::wide_ret() {
1802   transition(vtos, vtos);
1803   locals_index_wide(rbx);
1804   __ movptr(rbx, aaddress(rbx)); // get return bci, compute return bcp
1805   __ profile_ret(rbx, rcx);
1806   __ get_method(rax);
1807   __ movptr(r13, Address(rax, methodOopDesc::const_offset()));
1808   __ lea(r13, Address(r13, rbx, Address::times_1, constMethodOopDesc::codes_offset()));
1809   __ dispatch_next(vtos);
1810 }
1811 
1812 void TemplateTable::tableswitch() {
1813   Label default_case, continue_execution;
1814   transition(itos, vtos);
1815   // align r13
1816   __ lea(rbx, at_bcp(BytesPerInt));
1817   __ andptr(rbx, -BytesPerInt);
1818   // load lo & hi
1819   __ movl(rcx, Address(rbx, BytesPerInt));
1820   __ movl(rdx, Address(rbx, 2 * BytesPerInt));
1821   __ bswapl(rcx);
1822   __ bswapl(rdx);
1823   // check against lo & hi
1824   __ cmpl(rax, rcx);
1825   __ jcc(Assembler::less, default_case);
1826   __ cmpl(rax, rdx);
1827   __ jcc(Assembler::greater, default_case);
1828   // lookup dispatch offset
1829   __ subl(rax, rcx);
1830   __ movl(rdx, Address(rbx, rax, Address::times_4, 3 * BytesPerInt));
1831   __ profile_switch_case(rax, rbx, rcx);
1832   // continue execution
1833   __ bind(continue_execution);
1834   __ bswapl(rdx);
1835   __ movl2ptr(rdx, rdx);
1836   __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1));
1837   __ addptr(r13, rdx);
1838   __ dispatch_only(vtos);
1839   // handle default
1840   __ bind(default_case);
1841   __ profile_switch_default(rax);
1842   __ movl(rdx, Address(rbx, 0));
1843   __ jmp(continue_execution);
1844 }
1845 
1846 void TemplateTable::lookupswitch() {
1847   transition(itos, itos);
1848   __ stop("lookupswitch bytecode should have been rewritten");
1849 }
1850 
1851 void TemplateTable::fast_linearswitch() {
1852   transition(itos, vtos);
1853   Label loop_entry, loop, found, continue_execution;
1854   // bswap rax so we can avoid bswapping the table entries
1855   __ bswapl(rax);
1856   // align r13
1857   __ lea(rbx, at_bcp(BytesPerInt)); // btw: should be able to get rid of
1858                                     // this instruction (change offsets
1859                                     // below)
1860   __ andptr(rbx, -BytesPerInt);
1861   // set counter
1862   __ movl(rcx, Address(rbx, BytesPerInt));
1863   __ bswapl(rcx);
1864   __ jmpb(loop_entry);
1865   // table search
1866   __ bind(loop);
1867   __ cmpl(rax, Address(rbx, rcx, Address::times_8, 2 * BytesPerInt));
1868   __ jcc(Assembler::equal, found);
1869   __ bind(loop_entry);
1870   __ decrementl(rcx);
1871   __ jcc(Assembler::greaterEqual, loop);
1872   // default case
1873   __ profile_switch_default(rax);
1874   __ movl(rdx, Address(rbx, 0));
1875   __ jmp(continue_execution);
1876   // entry found -> get offset
1877   __ bind(found);
1878   __ movl(rdx, Address(rbx, rcx, Address::times_8, 3 * BytesPerInt));
1879   __ profile_switch_case(rcx, rax, rbx);
1880   // continue execution
1881   __ bind(continue_execution);
1882   __ bswapl(rdx);
1883   __ movl2ptr(rdx, rdx);
1884   __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1));
1885   __ addptr(r13, rdx);
1886   __ dispatch_only(vtos);
1887 }
1888 
1889 void TemplateTable::fast_binaryswitch() {
1890   transition(itos, vtos);
1891   // Implementation using the following core algorithm:
1892   //
1893   // int binary_search(int key, LookupswitchPair* array, int n) {
1894   //   // Binary search according to "Methodik des Programmierens" by
1895   //   // Edsger W. Dijkstra and W.H.J. Feijen, Addison Wesley Germany 1985.
1896   //   int i = 0;
1897   //   int j = n;
1898   //   while (i+1 < j) {
1899   //     // invariant P: 0 <= i < j <= n and (a[i] <= key < a[j] or Q)
1900   //     // with      Q: for all i: 0 <= i < n: key < a[i]
1901   //     // where a stands for the array and assuming that the (inexisting)
1902   //     // element a[n] is infinitely big.
1903   //     int h = (i + j) >> 1;
1904   //     // i < h < j
1905   //     if (key < array[h].fast_match()) {
1906   //       j = h;
1907   //     } else {
1908   //       i = h;
1909   //     }
1910   //   }
1911   //   // R: a[i] <= key < a[i+1] or Q
1912   //   // (i.e., if key is within array, i is the correct index)
1913   //   return i;
1914   // }
1915 
1916   // Register allocation
1917   const Register key   = rax; // already set (tosca)
1918   const Register array = rbx;
1919   const Register i     = rcx;
1920   const Register j     = rdx;
1921   const Register h     = rdi;
1922   const Register temp  = rsi;
1923 
1924   // Find array start
1925   __ lea(array, at_bcp(3 * BytesPerInt)); // btw: should be able to
1926                                           // get rid of this
1927                                           // instruction (change
1928                                           // offsets below)
1929   __ andptr(array, -BytesPerInt);
1930 
1931   // Initialize i & j
1932   __ xorl(i, i);                            // i = 0;
1933   __ movl(j, Address(array, -BytesPerInt)); // j = length(array);
1934 
1935   // Convert j into native byteordering
1936   __ bswapl(j);
1937 
1938   // And start
1939   Label entry;
1940   __ jmp(entry);
1941 
1942   // binary search loop
1943   {
1944     Label loop;
1945     __ bind(loop);
1946     // int h = (i + j) >> 1;
1947     __ leal(h, Address(i, j, Address::times_1)); // h = i + j;
1948     __ sarl(h, 1);                               // h = (i + j) >> 1;
1949     // if (key < array[h].fast_match()) {


1961     __ cmovl(Assembler::greaterEqual, i, h);
1962     // while (i+1 < j)
1963     __ bind(entry);
1964     __ leal(h, Address(i, 1)); // i+1
1965     __ cmpl(h, j);             // i+1 < j
1966     __ jcc(Assembler::less, loop);
1967   }
1968 
1969   // end of binary search, result index is i (must check again!)
1970   Label default_case;
1971   // Convert array[i].match to native byte-ordering before compare
1972   __ movl(temp, Address(array, i, Address::times_8));
1973   __ bswapl(temp);
1974   __ cmpl(key, temp);
1975   __ jcc(Assembler::notEqual, default_case);
1976 
1977   // entry found -> j = offset
1978   __ movl(j , Address(array, i, Address::times_8, BytesPerInt));
1979   __ profile_switch_case(i, key, array);
1980   __ bswapl(j);
1981   __ movl2ptr(j, j);
1982   __ load_unsigned_byte(rbx, Address(r13, j, Address::times_1));
1983   __ addptr(r13, j);
1984   __ dispatch_only(vtos);
1985 
1986   // default case -> j = default offset
1987   __ bind(default_case);
1988   __ profile_switch_default(i);
1989   __ movl(j, Address(array, -2 * BytesPerInt));
1990   __ bswapl(j);
1991   __ movl2ptr(j, j);
1992   __ load_unsigned_byte(rbx, Address(r13, j, Address::times_1));
1993   __ addptr(r13, j);
1994   __ dispatch_only(vtos);
1995 }
1996 
1997 
1998 void TemplateTable::_return(TosState state) {
1999   transition(state, state);
2000   assert(_desc->calls_vm(),
2001          "inconsistent calls_vm information"); // call in remove_activation
2002 
2003   if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
2004     assert(state == vtos, "only valid state");
2005     __ movptr(c_rarg1, aaddress(0));
2006     __ load_klass(rdi, c_rarg1);
2007     __ movl(rdi, Address(rdi, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc)));
2008     __ testl(rdi, JVM_ACC_HAS_FINALIZER);
2009     Label skip_register_finalizer;
2010     __ jcc(Assembler::zero, skip_register_finalizer);
2011 
2012     __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), c_rarg1);
2013 
2014     __ bind(skip_register_finalizer);
2015   }
2016 
2017   __ remove_activation(state, r13);
2018   __ jmp(r13);
2019 }
2020 
2021 // ----------------------------------------------------------------------------
2022 // Volatile variables demand their effects be made known to all CPU's
2023 // in order.  Store buffers on most chips allow reads & writes to
2024 // reorder; the JMM's ReadAfterWrite.java test fails in -Xint mode
2025 // without some kind of memory barrier (i.e., it's not sufficient that
2026 // the interpreter does not reorder volatile references, the hardware


2096   }
2097   __ movl(temp, (int) bytecode());
2098   __ call_VM(noreg, entry, temp);
2099 
2100   // Update registers with resolved info
2101   __ get_cache_and_index_at_bcp(Rcache, index, 1);
2102   __ bind(resolved);
2103 }
2104 
2105 // The Rcache and index registers must be set before call
2106 void TemplateTable::load_field_cp_cache_entry(Register obj,
2107                                               Register cache,
2108                                               Register index,
2109                                               Register off,
2110                                               Register flags,
2111                                               bool is_static = false) {
2112   assert_different_registers(cache, index, flags, off);
2113 
2114   ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
2115   // Field offset
2116   __ movptr(off, Address(cache, index, Address::times_8,
2117                          in_bytes(cp_base_offset +
2118                                   ConstantPoolCacheEntry::f2_offset())));
2119   // Flags
2120   __ movl(flags, Address(cache, index, Address::times_8,
2121                          in_bytes(cp_base_offset +
2122                                   ConstantPoolCacheEntry::flags_offset())));
2123 
2124   // klass overwrite register
2125   if (is_static) {
2126     __ movptr(obj, Address(cache, index, Address::times_8,
2127                            in_bytes(cp_base_offset +
2128                                     ConstantPoolCacheEntry::f1_offset())));
2129   }
2130 }
2131 
2132 void TemplateTable::load_invoke_cp_cache_entry(int byte_no,
2133                                                Register method,
2134                                                Register itable_index,
2135                                                Register flags,
2136                                                bool is_invokevirtual,
2137                                                bool is_invokevfinal /*unused*/) {
2138   // setup registers
2139   const Register cache = rcx;
2140   const Register index = rdx;
2141   assert_different_registers(method, flags);
2142   assert_different_registers(method, cache, index);
2143   assert_different_registers(itable_index, flags);
2144   assert_different_registers(itable_index, cache, index);
2145   // determine constant pool cache field offsets
2146   const int method_offset = in_bytes(
2147     constantPoolCacheOopDesc::base_offset() +
2148       (is_invokevirtual
2149        ? ConstantPoolCacheEntry::f2_offset()
2150        : ConstantPoolCacheEntry::f1_offset()));
2151   const int flags_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
2152                                     ConstantPoolCacheEntry::flags_offset());
2153   // access constant pool cache fields
2154   const int index_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
2155                                     ConstantPoolCacheEntry::f2_offset());
2156 
2157   resolve_cache_and_index(byte_no, cache, index);
2158 
2159   assert(wordSize == 8, "adjust code below");
2160   __ movptr(method, Address(cache, index, Address::times_8, method_offset));
2161   if (itable_index != noreg) {
2162     __ movptr(itable_index,
2163             Address(cache, index, Address::times_8, index_offset));
2164   }
2165   __ movl(flags , Address(cache, index, Address::times_8, flags_offset));
2166 }
2167 
2168 
2169 // The registers cache and index expected to be set before call.
2170 // Correct values of the cache and index registers are preserved.
2171 void TemplateTable::jvmti_post_field_access(Register cache, Register index,
2172                                             bool is_static, bool has_tos) {
2173   // do the JVMTI work here to avoid disturbing the register state below
2174   // We use c_rarg registers here because we want to use the register used in
2175   // the call to the VM
2176   if (JvmtiExport::can_post_field_access()) {
2177     // Check to see if a field access watch has been set before we
2178     // take the time to call into the VM.
2179     Label L1;
2180     assert_different_registers(cache, index, rax);
2181     __ mov32(rax, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
2182     __ testl(rax, rax);
2183     __ jcc(Assembler::zero, L1);
2184 
2185     __ get_cache_and_index_at_bcp(c_rarg2, c_rarg3, 1);
2186 
2187     // cache entry pointer
2188     __ addptr(c_rarg2, in_bytes(constantPoolCacheOopDesc::base_offset()));
2189     __ shll(c_rarg3, LogBytesPerWord);
2190     __ addptr(c_rarg2, c_rarg3);
2191     if (is_static) {
2192       __ xorl(c_rarg1, c_rarg1); // NULL object reference
2193     } else {
2194       __ movptr(c_rarg1, at_tos()); // get object pointer without popping it
2195       __ verify_oop(c_rarg1);
2196     }
2197     // c_rarg1: object pointer or NULL
2198     // c_rarg2: cache entry pointer
2199     // c_rarg3: jvalue object on the stack
2200     __ call_VM(noreg, CAST_FROM_FN_PTR(address,
2201                                        InterpreterRuntime::post_field_access),
2202                c_rarg1, c_rarg2, c_rarg3);
2203     __ get_cache_and_index_at_bcp(cache, index, 1);
2204     __ bind(L1);
2205   }
2206 }
2207 
2208 void TemplateTable::pop_and_check_object(Register r) {
2209   __ pop_ptr(r);
2210   __ null_check(r);  // for field access must check obj.
2211   __ verify_oop(r);
2212 }
2213 
2214 void TemplateTable::getfield_or_static(int byte_no, bool is_static) {


2236               notLong, notFloat, notObj, notDouble;
2237 
2238   __ shrl(flags, ConstantPoolCacheEntry::tosBits);
2239   assert(btos == 0, "change code, btos != 0");
2240 
2241   __ andl(flags, 0x0F);
2242   __ jcc(Assembler::notZero, notByte);
2243   // btos
2244   __ load_signed_byte(rax, field);
2245   __ push(btos);
2246   // Rewrite bytecode to be faster
2247   if (!is_static) {
2248     patch_bytecode(Bytecodes::_fast_bgetfield, bc, rbx);
2249   }
2250   __ jmp(Done);
2251 
2252   __ bind(notByte);
2253   __ cmpl(flags, atos);
2254   __ jcc(Assembler::notEqual, notObj);
2255   // atos
2256   __ load_heap_oop(rax, field);
2257   __ push(atos);
2258   if (!is_static) {
2259     patch_bytecode(Bytecodes::_fast_agetfield, bc, rbx);
2260   }
2261   __ jmp(Done);
2262 
2263   __ bind(notObj);
2264   __ cmpl(flags, itos);
2265   __ jcc(Assembler::notEqual, notInt);
2266   // itos
2267   __ movl(rax, field);
2268   __ push(itos);
2269   // Rewrite bytecode to be faster
2270   if (!is_static) {
2271     patch_bytecode(Bytecodes::_fast_igetfield, bc, rbx);
2272   }
2273   __ jmp(Done);
2274 
2275   __ bind(notInt);
2276   __ cmpl(flags, ctos);


2371     __ jcc(Assembler::zero, L1);
2372 
2373     __ get_cache_and_index_at_bcp(c_rarg2, rscratch1, 1);
2374 
2375     if (is_static) {
2376       // Life is simple.  Null out the object pointer.
2377       __ xorl(c_rarg1, c_rarg1);
2378     } else {
2379       // Life is harder. The stack holds the value on top, followed by
2380       // the object.  We don't know the size of the value, though; it
2381       // could be one or two words depending on its type. As a result,
2382       // we must find the type to determine where the object is.
2383       __ movl(c_rarg3, Address(c_rarg2, rscratch1,
2384                            Address::times_8,
2385                            in_bytes(cp_base_offset +
2386                                      ConstantPoolCacheEntry::flags_offset())));
2387       __ shrl(c_rarg3, ConstantPoolCacheEntry::tosBits);
2388       // Make sure we don't need to mask rcx for tosBits after the
2389       // above shift
2390       ConstantPoolCacheEntry::verify_tosBits();
2391       __ movptr(c_rarg1, at_tos_p1());  // initially assume a one word jvalue
2392       __ cmpl(c_rarg3, ltos);
2393       __ cmovptr(Assembler::equal,
2394                  c_rarg1, at_tos_p2()); // ltos (two word jvalue)
2395       __ cmpl(c_rarg3, dtos);
2396       __ cmovptr(Assembler::equal,
2397                  c_rarg1, at_tos_p2()); // dtos (two word jvalue)
2398     }
2399     // cache entry pointer
2400     __ addptr(c_rarg2, in_bytes(cp_base_offset));
2401     __ shll(rscratch1, LogBytesPerWord);
2402     __ addptr(c_rarg2, rscratch1);
2403     // object (tos)
2404     __ mov(c_rarg3, rsp);
2405     // c_rarg1: object pointer set up above (NULL if static)
2406     // c_rarg2: cache entry pointer
2407     // c_rarg3: jvalue object on the stack
2408     __ call_VM(noreg,
2409                CAST_FROM_FN_PTR(address,
2410                                 InterpreterRuntime::post_field_modification),
2411                c_rarg1, c_rarg2, c_rarg3);
2412     __ get_cache_and_index_at_bcp(cache, index, 1);
2413     __ bind(L1);
2414   }
2415 }
2416 
2417 void TemplateTable::putfield_or_static(int byte_no, bool is_static) {
2418   transition(vtos, vtos);
2419 
2420   const Register cache = rcx;
2421   const Register index = rdx;
2422   const Register obj   = rcx;
2423   const Register off   = rbx;
2424   const Register flags = rax;


2446   __ shrl(flags, ConstantPoolCacheEntry::tosBits);
2447 
2448   assert(btos == 0, "change code, btos != 0");
2449   __ andl(flags, 0x0f);
2450   __ jcc(Assembler::notZero, notByte);
2451   // btos
2452   __ pop(btos);
2453   if (!is_static) pop_and_check_object(obj);
2454   __ movb(field, rax);
2455   if (!is_static) {
2456     patch_bytecode(Bytecodes::_fast_bputfield, bc, rbx);
2457   }
2458   __ jmp(Done);
2459 
2460   __ bind(notByte);
2461   __ cmpl(flags, atos);
2462   __ jcc(Assembler::notEqual, notObj);
2463   // atos
2464   __ pop(atos);
2465   if (!is_static) pop_and_check_object(obj);
2466 
2467   // Store into the field
2468   do_oop_store(_masm, field, rax, _bs->kind(), false);
2469 
2470   if (!is_static) {
2471     patch_bytecode(Bytecodes::_fast_aputfield, bc, rbx);
2472   }
2473   __ jmp(Done);
2474 
2475   __ bind(notObj);
2476   __ cmpl(flags, itos);
2477   __ jcc(Assembler::notEqual, notInt);
2478   // itos
2479   __ pop(itos);
2480   if (!is_static) pop_and_check_object(obj);
2481   __ movl(field, rax);
2482   if (!is_static) {
2483     patch_bytecode(Bytecodes::_fast_iputfield, bc, rbx);
2484   }
2485   __ jmp(Done);
2486 
2487   __ bind(notInt);
2488   __ cmpl(flags, ctos);
2489   __ jcc(Assembler::notEqual, notChar);


2564 
2565 void TemplateTable::putfield(int byte_no) {
2566   putfield_or_static(byte_no, false);
2567 }
2568 
2569 void TemplateTable::putstatic(int byte_no) {
2570   putfield_or_static(byte_no, true);
2571 }
2572 
2573 void TemplateTable::jvmti_post_fast_field_mod() {
2574   if (JvmtiExport::can_post_field_modification()) {
2575     // Check to see if a field modification watch has been set before
2576     // we take the time to call into the VM.
2577     Label L2;
2578     __ mov32(c_rarg3, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr()));
2579     __ testl(c_rarg3, c_rarg3);
2580     __ jcc(Assembler::zero, L2);
2581     __ pop_ptr(rbx);                  // copy the object pointer from tos
2582     __ verify_oop(rbx);
2583     __ push_ptr(rbx);                 // put the object pointer back on tos
2584     __ subptr(rsp, sizeof(jvalue));  // add space for a jvalue object
2585     __ mov(c_rarg3, rsp);
2586     const Address field(c_rarg3, 0);
2587 
2588     switch (bytecode()) {          // load values into the jvalue object
2589     case Bytecodes::_fast_aputfield: __ movq(field, rax); break;
2590     case Bytecodes::_fast_lputfield: __ movq(field, rax); break;
2591     case Bytecodes::_fast_iputfield: __ movl(field, rax); break;
2592     case Bytecodes::_fast_bputfield: __ movb(field, rax); break;
2593     case Bytecodes::_fast_sputfield: // fall through
2594     case Bytecodes::_fast_cputfield: __ movw(field, rax); break;
2595     case Bytecodes::_fast_fputfield: __ movflt(field, xmm0); break;
2596     case Bytecodes::_fast_dputfield: __ movdbl(field, xmm0); break;
2597     default:
2598       ShouldNotReachHere();
2599     }
2600 
2601     // Save rax because call_VM() will clobber it, then use it for
2602     // JVMTI purposes
2603     __ push(rax);
2604     // access constant pool cache entry
2605     __ get_cache_entry_pointer_at_bcp(c_rarg2, rax, 1);
2606     __ verify_oop(rbx);
2607     // rbx: object pointer copied above
2608     // c_rarg2: cache entry pointer
2609     // c_rarg3: jvalue object on the stack
2610     __ call_VM(noreg,
2611                CAST_FROM_FN_PTR(address,
2612                                 InterpreterRuntime::post_field_modification),
2613                rbx, c_rarg2, c_rarg3);
2614     __ pop(rax);     // restore lower value
2615     __ addptr(rsp, sizeof(jvalue));  // release jvalue object space
2616     __ bind(L2);
2617   }
2618 }
2619 
2620 void TemplateTable::fast_storefield(TosState state) {
2621   transition(state, vtos);
2622 
2623   ByteSize base = constantPoolCacheOopDesc::base_offset();
2624 
2625   jvmti_post_fast_field_mod();
2626 
2627   // access constant pool cache
2628   __ get_cache_and_index_at_bcp(rcx, rbx, 1);
2629 
2630   // test for volatile with rdx
2631   __ movl(rdx, Address(rcx, rbx, Address::times_8,
2632                        in_bytes(base +
2633                                 ConstantPoolCacheEntry::flags_offset())));
2634 
2635   // replace index with field offset from cache entry
2636   __ movptr(rbx, Address(rcx, rbx, Address::times_8,
2637                          in_bytes(base + ConstantPoolCacheEntry::f2_offset())));
2638 
2639   // [jk] not needed currently
2640   // volatile_barrier(Assembler::Membar_mask_bits(Assembler::LoadStore |
2641   //                                              Assembler::StoreStore));
2642 
2643   Label notVolatile;
2644   __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
2645   __ andl(rdx, 0x1);
2646 
2647   // Get object from stack
2648   pop_and_check_object(rcx);
2649 
2650   // field address
2651   const Address field(rcx, rbx, Address::times_1);
2652 
2653   // access field
2654   switch (bytecode()) {
2655   case Bytecodes::_fast_aputfield:
2656     do_oop_store(_masm, field, rax, _bs->kind(), false);

2657     break;
2658   case Bytecodes::_fast_lputfield:
2659     __ movq(field, rax);
2660     break;
2661   case Bytecodes::_fast_iputfield:
2662     __ movl(field, rax);
2663     break;
2664   case Bytecodes::_fast_bputfield:
2665     __ movb(field, rax);
2666     break;
2667   case Bytecodes::_fast_sputfield:
2668     // fall through
2669   case Bytecodes::_fast_cputfield:
2670     __ movw(field, rax);
2671     break;
2672   case Bytecodes::_fast_fputfield:
2673     __ movflt(field, xmm0);
2674     break;
2675   case Bytecodes::_fast_dputfield:
2676     __ movdbl(field, xmm0);


2684   __ jcc(Assembler::zero, notVolatile);
2685   volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad |
2686                                                Assembler::StoreStore));
2687   __ bind(notVolatile);
2688 }
2689 
2690 
2691 void TemplateTable::fast_accessfield(TosState state) {
2692   transition(atos, state);
2693 
2694   // Do the JVMTI work here to avoid disturbing the register state below
2695   if (JvmtiExport::can_post_field_access()) {
2696     // Check to see if a field access watch has been set before we
2697     // take the time to call into the VM.
2698     Label L1;
2699     __ mov32(rcx, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
2700     __ testl(rcx, rcx);
2701     __ jcc(Assembler::zero, L1);
2702     // access constant pool cache entry
2703     __ get_cache_entry_pointer_at_bcp(c_rarg2, rcx, 1);

2704     __ verify_oop(rax);
2705     __ mov(r12, rax);  // save object pointer before call_VM() clobbers it
2706     __ mov(c_rarg1, rax);
2707     // c_rarg1: object pointer copied above
2708     // c_rarg2: cache entry pointer
2709     __ call_VM(noreg,
2710                CAST_FROM_FN_PTR(address,
2711                                 InterpreterRuntime::post_field_access),
2712                c_rarg1, c_rarg2);
2713     __ mov(rax, r12); // restore object pointer
2714     __ reinit_heapbase();
2715     __ bind(L1);
2716   }
2717 
2718   // access constant pool cache
2719   __ get_cache_and_index_at_bcp(rcx, rbx, 1);
2720   // replace index with field offset from cache entry
2721   // [jk] not needed currently
2722   // if (os::is_MP()) {
2723   //   __ movl(rdx, Address(rcx, rbx, Address::times_8,
2724   //                        in_bytes(constantPoolCacheOopDesc::base_offset() +
2725   //                                 ConstantPoolCacheEntry::flags_offset())));
2726   //   __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
2727   //   __ andl(rdx, 0x1);
2728   // }
2729   __ movptr(rbx, Address(rcx, rbx, Address::times_8,
2730                          in_bytes(constantPoolCacheOopDesc::base_offset() +
2731                                   ConstantPoolCacheEntry::f2_offset())));
2732 
2733   // rax: object
2734   __ verify_oop(rax);
2735   __ null_check(rax);
2736   Address field(rax, rbx, Address::times_1);
2737 
2738   // access field
2739   switch (bytecode()) {
2740   case Bytecodes::_fast_agetfield:
2741     __ load_heap_oop(rax, field);
2742     __ verify_oop(rax);
2743     break;
2744   case Bytecodes::_fast_lgetfield:
2745     __ movq(rax, field);
2746     break;
2747   case Bytecodes::_fast_igetfield:
2748     __ movl(rax, field);
2749     break;
2750   case Bytecodes::_fast_bgetfield:
2751     __ movsbl(rax, field);
2752     break;
2753   case Bytecodes::_fast_sgetfield:
2754     __ load_signed_word(rax, field);
2755     break;
2756   case Bytecodes::_fast_cgetfield:
2757     __ load_unsigned_word(rax, field);
2758     break;
2759   case Bytecodes::_fast_fgetfield:
2760     __ movflt(xmm0, field);
2761     break;
2762   case Bytecodes::_fast_dgetfield:
2763     __ movdbl(xmm0, field);
2764     break;
2765   default:
2766     ShouldNotReachHere();
2767   }
2768   // [jk] not needed currently
2769   // if (os::is_MP()) {
2770   //   Label notVolatile;
2771   //   __ testl(rdx, rdx);
2772   //   __ jcc(Assembler::zero, notVolatile);
2773   //   __ membar(Assembler::LoadLoad);
2774   //   __ bind(notVolatile);
2775   //};
2776 }
2777 
2778 void TemplateTable::fast_xaccess(TosState state) {
2779   transition(vtos, state);
2780 
2781   // get receiver
2782   __ movptr(rax, aaddress(0));
2783   debug_only(__ verify_local_tag(frame::TagReference, 0));
2784   // access constant pool cache
2785   __ get_cache_and_index_at_bcp(rcx, rdx, 2);
2786   __ movptr(rbx,
2787             Address(rcx, rdx, Address::times_8,
2788                     in_bytes(constantPoolCacheOopDesc::base_offset() +
2789                              ConstantPoolCacheEntry::f2_offset())));
2790   // make sure exception is reported in correct bcp range (getfield is
2791   // next instruction)
2792   __ increment(r13);
2793   __ null_check(rax);
2794   switch (state) {
2795   case itos:
2796     __ movl(rax, Address(rax, rbx, Address::times_1));
2797     break;
2798   case atos:
2799     __ load_heap_oop(rax, Address(rax, rbx, Address::times_1));
2800     __ verify_oop(rax);
2801     break;
2802   case ftos:
2803     __ movflt(xmm0, Address(rax, rbx, Address::times_1));
2804     break;
2805   default:
2806     ShouldNotReachHere();
2807   }
2808 
2809   // [jk] not needed currently
2810   // if (os::is_MP()) {
2811   //   Label notVolatile;
2812   //   __ movl(rdx, Address(rcx, rdx, Address::times_8,
2813   //                        in_bytes(constantPoolCacheOopDesc::base_offset() +
2814   //                                 ConstantPoolCacheEntry::flags_offset())));
2815   //   __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
2816   //   __ testl(rdx, 0x1);
2817   //   __ jcc(Assembler::zero, notVolatile);
2818   //   __ membar(Assembler::LoadLoad);
2819   //   __ bind(notVolatile);
2820   // }
2821 
2822   __ decrement(r13);
2823 }
2824 
2825 
2826 
2827 //-----------------------------------------------------------------------------
2828 // Calls
2829 
2830 void TemplateTable::count_calls(Register method, Register temp) {
2831   // implemented elsewhere
2832   ShouldNotReachHere();
2833 }
2834 
2835 void TemplateTable::prepare_invoke(Register method,
2836                                    Register index,
2837                                    int byte_no,
2838                                    Bytecodes::Code code) {
2839   // determine flags
2840   const bool is_invokeinterface  = code == Bytecodes::_invokeinterface;
2841   const bool is_invokevirtual    = code == Bytecodes::_invokevirtual;
2842   const bool is_invokespecial    = code == Bytecodes::_invokespecial;
2843   const bool load_receiver       = code != Bytecodes::_invokestatic;
2844   const bool receiver_null_check = is_invokespecial;
2845   const bool save_flags = is_invokeinterface || is_invokevirtual;
2846   // setup registers & access constant pool cache
2847   const Register recv   = rcx;
2848   const Register flags  = rdx;
2849   assert_different_registers(method, index, recv, flags);
2850 
2851   // save 'interpreter return address'
2852   __ save_bcp();
2853 
2854   load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual);
2855 
2856   // load receiver if needed (note: no return address pushed yet)
2857   if (load_receiver) {
2858     __ movl(recv, flags);
2859     __ andl(recv, 0xFF);
2860     if (TaggedStackInterpreter) __ shll(recv, 1);  // index*2
2861     __ movptr(recv, Address(rsp, recv, Address::times_8,
2862                                  -Interpreter::expr_offset_in_bytes(1)));
2863     __ verify_oop(recv);
2864   }
2865 
2866   // do null check if needed
2867   if (receiver_null_check) {
2868     __ null_check(recv);
2869   }
2870 
2871   if (save_flags) {
2872     __ movl(r13, flags);
2873   }
2874 
2875   // compute return type
2876   __ shrl(flags, ConstantPoolCacheEntry::tosBits);
2877   // Make sure we don't need to mask flags for tosBits after the above shift
2878   ConstantPoolCacheEntry::verify_tosBits();
2879   // load return address
2880   {
2881     ExternalAddress return_5((address)Interpreter::return_5_addrs_by_index_table());
2882     ExternalAddress return_3((address)Interpreter::return_3_addrs_by_index_table());
2883     __ lea(rscratch1, (is_invokeinterface ? return_5 : return_3));
2884     __ movptr(flags, Address(rscratch1, flags, Address::times_8));
2885   }
2886 
2887   // push return address
2888   __ push(flags);
2889 
2890   // Restore flag field from the constant pool cache, and restore esi
2891   // for later null checks.  r13 is the bytecode pointer
2892   if (save_flags) {
2893     __ movl(flags, r13);
2894     __ restore_bcp();
2895   }
2896 }
2897 
2898 
2899 void TemplateTable::invokevirtual_helper(Register index,
2900                                          Register recv,
2901                                          Register flags) {
2902   // Uses temporary registers rax, rdx  assert_different_registers(index, recv, rax, rdx);
2903 
2904   // Test for an invoke of a final method
2905   Label notFinal;
2906   __ movl(rax, flags);
2907   __ andl(rax, (1 << ConstantPoolCacheEntry::vfinalMethod));
2908   __ jcc(Assembler::zero, notFinal);
2909 
2910   const Register method = index;  // method must be rbx
2911   assert(method == rbx,
2912          "methodOop must be rbx for interpreter calling convention");
2913 
2914   // do the call - the index is actually the method to call
2915   __ verify_oop(method);
2916 
2917   // It's final, need a null check here!
2918   __ null_check(recv);
2919 
2920   // profile this call
2921   __ profile_final_call(rax);
2922 
2923   __ jump_from_interpreted(method, rax);
2924 
2925   __ bind(notFinal);
2926 
2927   // get receiver klass
2928   __ null_check(recv, oopDesc::klass_offset_in_bytes());
2929   __ load_klass(rax, recv);
2930 
2931   __ verify_oop(rax);
2932 
2933   // profile this call
2934   __ profile_virtual_call(rax, r14, rdx);
2935 
2936   // get target methodOop & entry point
2937   const int base = instanceKlass::vtable_start_offset() * wordSize;
2938   assert(vtableEntry::size() * wordSize == 8,
2939          "adjust the scaling in the code below");
2940   __ movptr(method, Address(rax, index,
2941                                  Address::times_8,
2942                                  base + vtableEntry::method_offset_in_bytes()));
2943   __ movptr(rdx, Address(method, methodOopDesc::interpreter_entry_offset()));
2944   __ jump_from_interpreted(method, rdx);
2945 }
2946 
2947 
2948 void TemplateTable::invokevirtual(int byte_no) {
2949   transition(vtos, vtos);
2950   prepare_invoke(rbx, noreg, byte_no, bytecode());
2951 
2952   // rbx: index
2953   // rcx: receiver
2954   // rdx: flags
2955 
2956   invokevirtual_helper(rbx, rcx, rdx);
2957 }
2958 
2959 
2960 void TemplateTable::invokespecial(int byte_no) {
2961   transition(vtos, vtos);
2962   prepare_invoke(rbx, noreg, byte_no, bytecode());
2963   // do the call


2987 
2988   // rax: Interface
2989   // rbx: index
2990   // rcx: receiver
2991   // rdx: flags
2992 
2993   // Special case of invokeinterface called for virtual method of
2994   // java.lang.Object.  See cpCacheOop.cpp for details.
2995   // This code isn't produced by javac, but could be produced by
2996   // another compliant java compiler.
2997   Label notMethod;
2998   __ movl(r14, rdx);
2999   __ andl(r14, (1 << ConstantPoolCacheEntry::methodInterface));
3000   __ jcc(Assembler::zero, notMethod);
3001 
3002   invokevirtual_helper(rbx, rcx, rdx);
3003   __ bind(notMethod);
3004 
3005   // Get receiver klass into rdx - also a null check
3006   __ restore_locals(); // restore r14
3007   __ load_klass(rdx, rcx);
3008   __ verify_oop(rdx);
3009 
3010   // profile this call
3011   __ profile_virtual_call(rdx, r13, r14);
3012 
3013   __ mov(r14, rdx); // Save klassOop in r14
3014 
3015   // Compute start of first itableOffsetEntry (which is at the end of
3016   // the vtable)
3017   const int base = instanceKlass::vtable_start_offset() * wordSize;
3018   // Get length of vtable
3019   assert(vtableEntry::size() * wordSize == 8,
3020          "adjust the scaling in the code below");
3021   __ movl(r13, Address(rdx,
3022                        instanceKlass::vtable_length_offset() * wordSize));
3023   __ lea(rdx, Address(rdx, r13, Address::times_8, base));
3024 
3025   if (HeapWordsPerLong > 1) {
3026     // Round up to align_object_offset boundary
3027     __ round_to(rdx, BytesPerLong);
3028   }
3029 
3030   Label entry, search, interface_ok;
3031 
3032   __ jmpb(entry);
3033   __ bind(search);
3034   __ addptr(rdx, itableOffsetEntry::size() * wordSize);
3035 
3036   __ bind(entry);
3037 
3038   // Check that the entry is non-null.  A null entry means that the
3039   // receiver class doesn't implement the interface, and wasn't the
3040   // same as the receiver class checked when the interface was
3041   // resolved.
3042   __ push(rdx);
3043   __ movptr(rdx, Address(rdx, itableOffsetEntry::interface_offset_in_bytes()));
3044   __ testptr(rdx, rdx);
3045   __ jcc(Assembler::notZero, interface_ok);
3046   // throw exception
3047   __ pop(rdx); // pop saved register first.
3048   __ pop(rbx); // pop return address (pushed by prepare_invoke)
3049   __ restore_bcp(); // r13 must be correct for exception handler (was
3050                     // destroyed)
3051   __ restore_locals(); // make sure locals pointer is correct as well
3052                        // (was destroyed)
3053   __ call_VM(noreg, CAST_FROM_FN_PTR(address,
3054                    InterpreterRuntime::throw_IncompatibleClassChangeError));
3055   // the call_VM checks for exception, so we should never return here.
3056   __ should_not_reach_here();
3057   __ bind(interface_ok);
3058 
3059   __ pop(rdx);
3060 
3061   __ cmpptr(rax, Address(rdx, itableOffsetEntry::interface_offset_in_bytes()));
3062   __ jcc(Assembler::notEqual, search);
3063 
3064   __ movl(rdx, Address(rdx, itableOffsetEntry::offset_offset_in_bytes()));
3065 
3066   __ addptr(rdx, r14); // Add offset to klassOop
3067   assert(itableMethodEntry::size() * wordSize == 8,
3068          "adjust the scaling in the code below");
3069   __ movptr(rbx, Address(rdx, rbx, Address::times_8));
3070   // rbx: methodOop to call
3071   // rcx: receiver
3072   // Check for abstract method error
3073   // Note: This should be done more efficiently via a
3074   // throw_abstract_method_error interpreter entry point and a
3075   // conditional jump to it in case of a null method.
3076   {
3077     Label L;
3078     __ testptr(rbx, rbx);
3079     __ jcc(Assembler::notZero, L);
3080     // throw exception
3081     // note: must restore interpreter registers to canonical
3082     //       state for exception handling to work correctly!
3083     __ pop(rbx);  // pop return address (pushed by prepare_invoke)
3084     __ restore_bcp(); // r13 must be correct for exception handler
3085                       // (was destroyed)
3086     __ restore_locals(); // make sure locals pointer is correct as
3087                          // well (was destroyed)
3088     __ call_VM(noreg,
3089                CAST_FROM_FN_PTR(address,
3090                              InterpreterRuntime::throw_AbstractMethodError));
3091     // the call_VM checks for exception, so we should never return here.
3092     __ should_not_reach_here();
3093     __ bind(L);
3094   }
3095 
3096   __ movptr(rcx, Address(rbx, methodOopDesc::interpreter_entry_offset()));
3097 
3098   // do the call
3099   // rcx: receiver
3100   // rbx: methodOop
3101   __ jump_from_interpreted(rbx, rdx);
3102 }
3103 
3104 //-----------------------------------------------------------------------------
3105 // Allocation
3106 
3107 void TemplateTable::_new() {
3108   transition(vtos, atos);
3109   __ get_unsigned_2_byte_index_at_bcp(rdx, 1);
3110   Label slow_case;
3111   Label done;
3112   Label initialize_header;
3113   Label initialize_object; // including clearing the fields
3114   Label allocate_shared;


3115 
3116   __ get_cpool_and_tags(rsi, rax);
3117   // get instanceKlass
3118   __ movptr(rsi, Address(rsi, rdx,
3119                          Address::times_8, sizeof(constantPoolOopDesc)));
3120 
3121   // make sure the class we're about to instantiate has been
3122   // resolved. Note: slow_case does a pop of stack, which is why we
3123   // loaded class/pushed above
3124   const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
3125   __ cmpb(Address(rax, rdx, Address::times_1, tags_offset),
3126           JVM_CONSTANT_Class);
3127   __ jcc(Assembler::notEqual, slow_case);
3128 
3129   // make sure klass is initialized & doesn't have finalizer
3130   // make sure klass is fully initialized
3131   __ cmpl(Address(rsi,
3132                   instanceKlass::init_state_offset_in_bytes() +
3133                   sizeof(oopDesc)),
3134           instanceKlass::fully_initialized);
3135   __ jcc(Assembler::notEqual, slow_case);
3136 
3137   // get instance_size in instanceKlass (scaled to a count of bytes)
3138   __ movl(rdx,
3139           Address(rsi,
3140                   Klass::layout_helper_offset_in_bytes() + sizeof(oopDesc)));
3141   // test to see if it has a finalizer or is malformed in some way
3142   __ testl(rdx, Klass::_lh_instance_slow_path_bit);
3143   __ jcc(Assembler::notZero, slow_case);
3144 
3145   // Allocate the instance
3146   // 1) Try to allocate in the TLAB
3147   // 2) if fail and the object is large allocate in the shared Eden
3148   // 3) if the above fails (or is not applicable), go to a slow case
3149   // (creates a new TLAB, etc.)
3150 
3151   const bool allow_shared_alloc =
3152     Universe::heap()->supports_inline_contig_alloc() && !CMSIncrementalMode;
3153 
3154   if (UseTLAB) {
3155     __ movptr(rax, Address(r15_thread, in_bytes(JavaThread::tlab_top_offset())));
3156     __ lea(rbx, Address(rax, rdx, Address::times_1));
3157     __ cmpptr(rbx, Address(r15_thread, in_bytes(JavaThread::tlab_end_offset())));
3158     __ jcc(Assembler::above, allow_shared_alloc ? allocate_shared : slow_case);
3159     __ movptr(Address(r15_thread, in_bytes(JavaThread::tlab_top_offset())), rbx);
3160     if (ZeroTLAB) {
3161       // the fields have been already cleared
3162       __ jmp(initialize_header);
3163     } else {
3164       // initialize both the header and fields
3165       __ jmp(initialize_object);
3166     }
3167   }
3168 
3169   // Allocation in the shared Eden, if allowed.
3170   //
3171   // rdx: instance size in bytes
3172   if (allow_shared_alloc) {
3173     __ bind(allocate_shared);
3174 
3175     ExternalAddress top((address)Universe::heap()->top_addr());
3176     ExternalAddress end((address)Universe::heap()->end_addr());
3177 
3178     const Register RtopAddr = rscratch1;
3179     const Register RendAddr = rscratch2;
3180 
3181     __ lea(RtopAddr, top);
3182     __ lea(RendAddr, end);
3183     __ movptr(rax, Address(RtopAddr, 0));
3184 
3185     // For retries rax gets set by cmpxchgq
3186     Label retry;
3187     __ bind(retry);
3188     __ lea(rbx, Address(rax, rdx, Address::times_1));
3189     __ cmpptr(rbx, Address(RendAddr, 0));
3190     __ jcc(Assembler::above, slow_case);
3191 
3192     // Compare rax with the top addr, and if still equal, store the new
3193     // top addr in rbx at the address of the top addr pointer. Sets ZF if was
3194     // equal, and clears it otherwise. Use lock prefix for atomicity on MPs.
3195     //
3196     // rax: object begin
3197     // rbx: object end
3198     // rdx: instance size in bytes
3199     if (os::is_MP()) {
3200       __ lock();
3201     }
3202     __ cmpxchgptr(rbx, Address(RtopAddr, 0));
3203 
3204     // if someone beat us on the allocation, try again, otherwise continue
3205     __ jcc(Assembler::notEqual, retry);
3206   }
3207 
3208   if (UseTLAB || Universe::heap()->supports_inline_contig_alloc()) {
3209     // The object is initialized before the header.  If the object size is
3210     // zero, go directly to the header initialization.
3211     __ bind(initialize_object);
3212     __ decrementl(rdx, sizeof(oopDesc));
3213     __ jcc(Assembler::zero, initialize_header);
3214 
3215     // Initialize object fields
3216     __ xorl(rcx, rcx); // use zero reg to clear memory (shorter code)
3217     __ shrl(rdx, LogBytesPerLong);  // divide by oopSize to simplify the loop
3218     {
3219       Label loop;
3220       __ bind(loop);
3221       __ movq(Address(rax, rdx, Address::times_8,
3222                       sizeof(oopDesc) - oopSize),
3223               rcx);
3224       __ decrementl(rdx);
3225       __ jcc(Assembler::notZero, loop);
3226     }
3227 
3228     // initialize object header only.
3229     __ bind(initialize_header);
3230     if (UseBiasedLocking) {
3231       __ movptr(rscratch1, Address(rsi, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
3232       __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()), rscratch1);
3233     } else {
3234       __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()),
3235                (intptr_t) markOopDesc::prototype()); // header (address 0x1)
3236     }
3237     __ xorl(rcx, rcx); // use zero reg to clear memory (shorter code)
3238     __ store_klass_gap(rax, rcx);  // zero klass gap for compressed oops
3239     __ store_klass(rax, rsi);      // store klass last
3240     __ jmp(done);
3241   }
3242 
3243   {
3244     SkipIfEqual skip(_masm, &DTraceAllocProbes, false);
3245     // Trigger dtrace event for fastpath
3246     __ push(atos); // save the return value
3247     __ call_VM_leaf(
3248          CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc), rax);
3249     __ pop(atos); // restore the return value
3250   }
3251 
3252   // slow case
3253   __ bind(slow_case);
3254   __ get_constant_pool(c_rarg1);
3255   __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
3256   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2);
3257   __ verify_oop(rax);
3258 
3259   // continue


3269 }
3270 
3271 void TemplateTable::anewarray() {
3272   transition(itos, atos);
3273   __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
3274   __ get_constant_pool(c_rarg1);
3275   __ movl(c_rarg3, rax);
3276   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray),
3277           c_rarg1, c_rarg2, c_rarg3);
3278 }
3279 
3280 void TemplateTable::arraylength() {
3281   transition(atos, itos);
3282   __ null_check(rax, arrayOopDesc::length_offset_in_bytes());
3283   __ movl(rax, Address(rax, arrayOopDesc::length_offset_in_bytes()));
3284 }
3285 
3286 void TemplateTable::checkcast() {
3287   transition(atos, atos);
3288   Label done, is_null, ok_is_subtype, quicked, resolved;
3289   __ testptr(rax, rax); // object is in rax
3290   __ jcc(Assembler::zero, is_null);
3291 
3292   // Get cpool & tags index
3293   __ get_cpool_and_tags(rcx, rdx); // rcx=cpool, rdx=tags array
3294   __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // rbx=index
3295   // See if bytecode has already been quicked
3296   __ cmpb(Address(rdx, rbx,
3297                   Address::times_1,
3298                   typeArrayOopDesc::header_size(T_BYTE) * wordSize),
3299           JVM_CONSTANT_Class);
3300   __ jcc(Assembler::equal, quicked);


3301   __ push(atos); // save receiver for result, and for GC
3302   __ mov(r12, rcx); // save rcx XXX
3303   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc));

3304   __ movq(rcx, r12); // restore rcx XXX
3305   __ reinit_heapbase();
3306   __ pop_ptr(rdx); // restore receiver
3307   __ jmpb(resolved);
3308 
3309   // Get superklass in rax and subklass in rbx
3310   __ bind(quicked);
3311   __ mov(rdx, rax); // Save object in rdx; rax needed for subtype check
3312   __ movptr(rax, Address(rcx, rbx,
3313                        Address::times_8, sizeof(constantPoolOopDesc)));
3314 
3315   __ bind(resolved);
3316   __ load_klass(rbx, rdx);
3317 
3318   // Generate subtype check.  Blows rcx, rdi.  Object in rdx.
3319   // Superklass in rax.  Subklass in rbx.
3320   __ gen_subtype_check(rbx, ok_is_subtype);
3321 
3322   // Come here on failure
3323   __ push_ptr(rdx);
3324   // object is at TOS
3325   __ jump(ExternalAddress(Interpreter::_throw_ClassCastException_entry));
3326 
3327   // Come here on success
3328   __ bind(ok_is_subtype);
3329   __ mov(rax, rdx); // Restore object in rdx
3330 
3331   // Collect counts on whether this check-cast sees NULLs a lot or not.
3332   if (ProfileInterpreter) {
3333     __ jmp(done);
3334     __ bind(is_null);
3335     __ profile_null_seen(rcx);
3336   } else {
3337     __ bind(is_null);   // same as 'done'
3338   }
3339   __ bind(done);
3340 }
3341 
3342 void TemplateTable::instanceof() {
3343   transition(atos, itos);
3344   Label done, is_null, ok_is_subtype, quicked, resolved;
3345   __ testptr(rax, rax);
3346   __ jcc(Assembler::zero, is_null);
3347 
3348   // Get cpool & tags index
3349   __ get_cpool_and_tags(rcx, rdx); // rcx=cpool, rdx=tags array
3350   __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // rbx=index
3351   // See if bytecode has already been quicked
3352   __ cmpb(Address(rdx, rbx,
3353                   Address::times_1,
3354                   typeArrayOopDesc::header_size(T_BYTE) * wordSize),
3355           JVM_CONSTANT_Class);
3356   __ jcc(Assembler::equal, quicked);
3357 

3358   __ push(atos); // save receiver for result, and for GC
3359   __ mov(r12, rcx); // save rcx
3360   call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc));


3361   __ movq(rcx, r12); // restore rcx
3362   __ reinit_heapbase();
3363   __ pop_ptr(rdx); // restore receiver
3364   __ load_klass(rdx, rdx);
3365   __ jmpb(resolved);
3366 
3367   // Get superklass in rax and subklass in rdx
3368   __ bind(quicked);
3369   __ load_klass(rdx, rax);
3370   __ movptr(rax, Address(rcx, rbx,
3371                          Address::times_8, sizeof(constantPoolOopDesc)));
3372 
3373   __ bind(resolved);
3374 
3375   // Generate subtype check.  Blows rcx, rdi
3376   // Superklass in rax.  Subklass in rdx.
3377   __ gen_subtype_check(rdx, ok_is_subtype);
3378 
3379   // Come here on failure
3380   __ xorl(rax, rax);
3381   __ jmpb(done);
3382   // Come here on success
3383   __ bind(ok_is_subtype);
3384   __ movl(rax, 1);
3385 
3386   // Collect counts on whether this test sees NULLs a lot or not.
3387   if (ProfileInterpreter) {
3388     __ jmp(done);
3389     __ bind(is_null);
3390     __ profile_null_seen(rcx);


3394   __ bind(done);
3395   // rax = 0: obj == NULL or  obj is not an instanceof the specified klass
3396   // rax = 1: obj != NULL and obj is     an instanceof the specified klass
3397 }
3398 
3399 //-----------------------------------------------------------------------------
3400 // Breakpoints
3401 void TemplateTable::_breakpoint() {
3402   // Note: We get here even if we are single stepping..
3403   // jbug inists on setting breakpoints at every bytecode
3404   // even if we are in single step mode.
3405 
3406   transition(vtos, vtos);
3407 
3408   // get the unpatched byte code
3409   __ get_method(c_rarg1);
3410   __ call_VM(noreg,
3411              CAST_FROM_FN_PTR(address,
3412                               InterpreterRuntime::get_original_bytecode_at),
3413              c_rarg1, r13);
3414   __ mov(rbx, rax);
3415 
3416   // post the breakpoint event
3417   __ get_method(c_rarg1);
3418   __ call_VM(noreg,
3419              CAST_FROM_FN_PTR(address, InterpreterRuntime::_breakpoint),
3420              c_rarg1, r13);
3421 
3422   // complete the execution of original bytecode
3423   __ dispatch_only_normal(vtos);
3424 }
3425 
3426 //-----------------------------------------------------------------------------
3427 // Exceptions
3428 
3429 void TemplateTable::athrow() {
3430   transition(atos, vtos);
3431   __ null_check(rax);
3432   __ jump(ExternalAddress(Interpreter::throw_exception_entry()));
3433 }
3434 


3452 void TemplateTable::monitorenter() {
3453   transition(atos, vtos);
3454 
3455   // check for NULL object
3456   __ null_check(rax);
3457 
3458   const Address monitor_block_top(
3459         rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
3460   const Address monitor_block_bot(
3461         rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
3462   const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
3463 
3464   Label allocated;
3465 
3466   // initialize entry pointer
3467   __ xorl(c_rarg1, c_rarg1); // points to free slot or NULL
3468 
3469   // find a free slot in the monitor block (result in c_rarg1)
3470   {
3471     Label entry, loop, exit;
3472     __ movptr(c_rarg3, monitor_block_top); // points to current entry,
3473                                      // starting with top-most entry
3474     __ lea(c_rarg2, monitor_block_bot); // points to word before bottom
3475                                      // of monitor block
3476     __ jmpb(entry);
3477 
3478     __ bind(loop);
3479     // check if current entry is used
3480     __ cmpptr(Address(c_rarg3, BasicObjectLock::obj_offset_in_bytes()), (int32_t) NULL_WORD);
3481     // if not used then remember entry in c_rarg1
3482     __ cmov(Assembler::equal, c_rarg1, c_rarg3);
3483     // check if current entry is for same object
3484     __ cmpptr(rax, Address(c_rarg3, BasicObjectLock::obj_offset_in_bytes()));
3485     // if same object then stop searching
3486     __ jccb(Assembler::equal, exit);
3487     // otherwise advance to next entry
3488     __ addptr(c_rarg3, entry_size);
3489     __ bind(entry);
3490     // check if bottom reached
3491     __ cmpptr(c_rarg3, c_rarg2);
3492     // if not at bottom then check this entry
3493     __ jcc(Assembler::notEqual, loop);
3494     __ bind(exit);
3495   }
3496 
3497   __ testptr(c_rarg1, c_rarg1); // check if a slot has been found
3498   __ jcc(Assembler::notZero, allocated); // if found, continue with that one
3499 
3500   // allocate one if there's no free slot
3501   {
3502     Label entry, loop;
3503     // 1. compute new pointers             // rsp: old expression stack top
3504     __ movptr(c_rarg1, monitor_block_bot); // c_rarg1: old expression stack bottom
3505     __ subptr(rsp, entry_size);            // move expression stack top
3506     __ subptr(c_rarg1, entry_size);        // move expression stack bottom
3507     __ mov(c_rarg3, rsp);                  // set start value for copy loop
3508     __ movptr(monitor_block_bot, c_rarg1); // set new monitor block bottom
3509     __ jmp(entry);
3510     // 2. move expression stack contents
3511     __ bind(loop);
3512     __ movptr(c_rarg2, Address(c_rarg3, entry_size)); // load expression stack
3513                                                       // word from old location
3514     __ movptr(Address(c_rarg3, 0), c_rarg2);          // and store it at new location
3515     __ addptr(c_rarg3, wordSize);                     // advance to next word
3516     __ bind(entry);
3517     __ cmpptr(c_rarg3, c_rarg1);            // check if bottom reached
3518     __ jcc(Assembler::notEqual, loop);      // if not at bottom then
3519                                             // copy next word
3520   }
3521 
3522   // call run-time routine
3523   // c_rarg1: points to monitor entry
3524   __ bind(allocated);
3525 
3526   // Increment bcp to point to the next bytecode, so exception
3527   // handling for async. exceptions work correctly.
3528   // The object has already been poped from the stack, so the
3529   // expression stack looks correct.
3530   __ increment(r13);
3531 
3532   // store object
3533   __ movptr(Address(c_rarg1, BasicObjectLock::obj_offset_in_bytes()), rax);
3534   __ lock_object(c_rarg1);
3535 
3536   // check to make sure this monitor doesn't cause stack overflow after locking
3537   __ save_bcp();  // in case of exception
3538   __ generate_stack_overflow_check(0);
3539 
3540   // The bcp has already been incremented. Just need to dispatch to
3541   // next instruction.
3542   __ dispatch_next(vtos);
3543 }
3544 
3545 
3546 void TemplateTable::monitorexit() {
3547   transition(atos, vtos);
3548 
3549   // check for NULL object
3550   __ null_check(rax);
3551 
3552   const Address monitor_block_top(
3553         rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
3554   const Address monitor_block_bot(
3555         rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
3556   const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
3557 
3558   Label found;
3559 
3560   // find matching slot
3561   {
3562     Label entry, loop;
3563     __ movptr(c_rarg1, monitor_block_top); // points to current entry,
3564                                      // starting with top-most entry
3565     __ lea(c_rarg2, monitor_block_bot); // points to word before bottom
3566                                      // of monitor block
3567     __ jmpb(entry);
3568 
3569     __ bind(loop);
3570     // check if current entry is for same object
3571     __ cmpptr(rax, Address(c_rarg1, BasicObjectLock::obj_offset_in_bytes()));
3572     // if same object then stop searching
3573     __ jcc(Assembler::equal, found);
3574     // otherwise advance to next entry
3575     __ addptr(c_rarg1, entry_size);
3576     __ bind(entry);
3577     // check if bottom reached
3578     __ cmpptr(c_rarg1, c_rarg2);
3579     // if not at bottom then check this entry
3580     __ jcc(Assembler::notEqual, loop);
3581   }
3582 
3583   // error handling. Unlocking was not block-structured
3584   __ call_VM(noreg, CAST_FROM_FN_PTR(address,
3585                    InterpreterRuntime::throw_illegal_monitor_state_exception));
3586   __ should_not_reach_here();
3587 
3588   // call run-time routine
3589   // rsi: points to monitor entry
3590   __ bind(found);
3591   __ push_ptr(rax); // make sure object is on stack (contract with oopMaps)
3592   __ unlock_object(c_rarg1);
3593   __ pop_ptr(rax); // discard object
3594 }
3595 
3596 
3597 // Wide instructions
3598 void TemplateTable::wide() {
3599   transition(vtos, vtos);
3600   __ load_unsigned_byte(rbx, at_bcp(1));
3601   __ lea(rscratch1, ExternalAddress((address)Interpreter::_wentry_point));
3602   __ jmp(Address(rscratch1, rbx, Address::times_8));
3603   // Note: the r13 increment step is part of the individual wide
3604   // bytecode implementations
3605 }
3606 
3607 
3608 // Multi arrays
3609 void TemplateTable::multianewarray() {
3610   transition(vtos, atos);
3611   __ load_unsigned_byte(rax, at_bcp(3)); // get number of dimensions
3612   // last dim is on top of stack; we want address of first one:
3613   // first_addr = last_addr + (ndims - 1) * wordSize
3614   if (TaggedStackInterpreter) __ shll(rax, 1);  // index*2
3615   __ lea(c_rarg1, Address(rsp, rax, Address::times_8, -wordSize));
3616   call_VM(rax,
3617           CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray),
3618           c_rarg1);
3619   __ load_unsigned_byte(rbx, at_bcp(3));
3620   if (TaggedStackInterpreter) __ shll(rbx, 1);  // index*2
3621   __ lea(rsp, Address(rsp, rbx, Address::times_8));
3622 }
3623 #endif // !CC_INTERP