1 /*
   2  * Copyright 1997-2009 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/_methodHandles_x86.cpp.incl"
  27 
  28 #define __ _masm->
  29 
  30 address MethodHandleEntry::start_compiled_entry(MacroAssembler* _masm,
  31                                                 address interpreted_entry) {
  32   // Just before the actual machine code entry point, allocate space
  33   // for a MethodHandleEntry::Data record, so that we can manage everything
  34   // from one base pointer.
  35   __ align(wordSize);
  36   address target = __ pc() + sizeof(Data);
  37   while (__ pc() < target) {
  38     __ nop();
  39     __ align(wordSize);
  40   }
  41 
  42   MethodHandleEntry* me = (MethodHandleEntry*) __ pc();
  43   me->set_end_address(__ pc());         // set a temporary end_address
  44   me->set_from_interpreted_entry(interpreted_entry);
  45   me->set_type_checking_entry(NULL);
  46 
  47   return (address) me;
  48 }
  49 
  50 MethodHandleEntry* MethodHandleEntry::finish_compiled_entry(MacroAssembler* _masm,
  51                                                 address start_addr) {
  52   MethodHandleEntry* me = (MethodHandleEntry*) start_addr;
  53   assert(me->end_address() == start_addr, "valid ME");
  54 
  55   // Fill in the real end_address:
  56   __ align(wordSize);
  57   me->set_end_address(__ pc());
  58 
  59   return me;
  60 }
  61 
  62 #ifdef ASSERT
  63 static void verify_argslot(MacroAssembler* _masm, Register rax_argslot,
  64                            const char* error_message) {
  65   // Verify that argslot lies within (rsp, rbp].
  66   Label L_ok, L_bad;
  67   __ cmpptr(rax_argslot, rbp);
  68   __ jcc(Assembler::above, L_bad);
  69   __ cmpptr(rsp, rax_argslot);
  70   __ jcc(Assembler::below, L_ok);
  71   __ bind(L_bad);
  72   __ stop(error_message);
  73   __ bind(L_ok);
  74 }
  75 #endif
  76 
  77 
  78 // Code generation
  79 address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler* _masm) {
  80   // rbx: methodOop
  81   // rcx: receiver method handle (must load from sp[MethodTypeForm.vmslots])
  82   // rsi/r13: sender SP (must preserve; see prepare_to_jump_from_interpreted)
  83   // rdx: garbage temp, blown away
  84 
  85   Register rbx_method = rbx;
  86   Register rcx_recv   = rcx;
  87   Register rax_mtype  = rax;
  88   Register rdx_temp   = rdx;
  89 
  90   // emit WrongMethodType path first, to enable jccb back-branch from main path
  91   Label wrong_method_type;
  92   __ bind(wrong_method_type);
  93   __ push(rax_mtype);       // required mtype
  94   __ push(rcx_recv);        // bad mh (1st stacked argument)
  95   __ jump(ExternalAddress(Interpreter::throw_WrongMethodType_entry()));
  96 
  97   // here's where control starts out:
  98   __ align(CodeEntryAlignment);
  99   address entry_point = __ pc();
 100 
 101   // fetch the MethodType from the method handle into rax (the 'check' register)
 102   {
 103     Register tem = rbx_method;
 104     for (jint* pchase = methodOopDesc::method_type_offsets_chain(); (*pchase) != -1; pchase++) {
 105       __ movptr(rax_mtype, Address(tem, *pchase));
 106       tem = rax_mtype;          // in case there is another indirection
 107     }
 108   }
 109   Register rbx_temp = rbx_method; // done with incoming methodOop
 110 
 111   // given the MethodType, find out where the MH argument is buried
 112   __ movptr(rdx_temp, Address(rax_mtype,
 113                               __ delayed_value(java_dyn_MethodType::form_offset_in_bytes, rbx_temp)));
 114   __ movl(rdx_temp, Address(rdx_temp,
 115                             __ delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, rbx_temp)));
 116   __ movptr(rcx_recv, __ argument_address(rdx_temp));
 117 
 118   __ check_method_handle_type(rax_mtype, rcx_recv, rdx_temp, wrong_method_type);
 119   __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
 120 
 121   return entry_point;
 122 }
 123 
 124 // Helper to insert argument slots into the stack.
 125 // arg_slots must be a multiple of stack_move_unit() and <= 0
 126 void MethodHandles::insert_arg_slots(MacroAssembler* _masm,
 127                                      RegisterOrConstant arg_slots,
 128                                      int arg_mask,
 129                                      Register rax_argslot,
 130                                      Register rbx_temp, Register rdx_temp) {
 131   assert_different_registers(rax_argslot, rbx_temp, rdx_temp,
 132                              (!arg_slots.is_register() ? rsp : arg_slots.as_register()));
 133 
 134 #ifdef ASSERT
 135   verify_argslot(_masm, rax_argslot, "insertion point must fall within current frame");
 136   if (arg_slots.is_register()) {
 137     Label L_ok, L_bad;
 138     __ cmpptr(arg_slots.as_register(), (int32_t) NULL_WORD);
 139     __ jcc(Assembler::greater, L_bad);
 140     __ testl(arg_slots.as_register(), -stack_move_unit() - 1);
 141     __ jcc(Assembler::zero, L_ok);
 142     __ bind(L_bad);
 143     __ stop("assert arg_slots <= 0 and clear low bits");
 144     __ bind(L_ok);
 145   } else {
 146     assert(arg_slots.as_constant() <= 0, "");
 147     assert(arg_slots.as_constant() % -stack_move_unit() == 0, "");
 148   }
 149 #endif //ASSERT
 150 
 151 #ifdef _LP64
 152   if (arg_slots.is_register()) {
 153     // clean high bits of stack motion register (was loaded as an int)
 154     __ movslq(arg_slots.as_register(), arg_slots.as_register());
 155   }
 156 #endif
 157 
 158   // Make space on the stack for the inserted argument(s).
 159   // Then pull down everything shallower than rax_argslot.
 160   // The stacked return address gets pulled down with everything else.
 161   // That is, copy [rsp, argslot) downward by -size words.  In pseudo-code:
 162   //   rsp -= size;
 163   //   for (rdx = rsp + size; rdx < argslot; rdx++)
 164   //     rdx[-size] = rdx[0]
 165   //   argslot -= size;
 166   __ mov(rdx_temp, rsp);                        // source pointer for copy
 167   __ lea(rsp, Address(rsp, arg_slots, Address::times_ptr));
 168   {
 169     Label loop;
 170     __ bind(loop);
 171     // pull one word down each time through the loop
 172     __ movptr(rbx_temp, Address(rdx_temp, 0));
 173     __ movptr(Address(rdx_temp, arg_slots, Address::times_ptr), rbx_temp);
 174     __ addptr(rdx_temp, wordSize);
 175     __ cmpptr(rdx_temp, rax_argslot);
 176     __ jcc(Assembler::less, loop);
 177   }
 178 
 179   // Now move the argslot down, to point to the opened-up space.
 180   __ lea(rax_argslot, Address(rax_argslot, arg_slots, Address::times_ptr));
 181 
 182   if (TaggedStackInterpreter && arg_mask != _INSERT_NO_MASK) {
 183     // The caller has specified a bitmask of tags to put into the opened space.
 184     // This only works when the arg_slots value is an assembly-time constant.
 185     int constant_arg_slots = arg_slots.as_constant() / stack_move_unit();
 186     int tag_offset = Interpreter::tag_offset_in_bytes() - Interpreter::value_offset_in_bytes();
 187     for (int slot = 0; slot < constant_arg_slots; slot++) {
 188       BasicType slot_type   = ((arg_mask & (1 << slot)) == 0 ? T_OBJECT : T_INT);
 189       int       slot_offset = Interpreter::stackElementSize() * slot;
 190       Address   tag_addr(rax_argslot, slot_offset + tag_offset);
 191       __ movptr(tag_addr, frame::tag_for_basic_type(slot_type));
 192     }
 193     // Note that the new argument slots are tagged properly but contain
 194     // garbage at this point.  The value portions must be initialized
 195     // by the caller.  (Especially references!)
 196   }
 197 }
 198 
 199 // Helper to remove argument slots from the stack.
 200 // arg_slots must be a multiple of stack_move_unit() and >= 0
 201 void MethodHandles::remove_arg_slots(MacroAssembler* _masm,
 202                                     RegisterOrConstant arg_slots,
 203                                     Register rax_argslot,
 204                                     Register rbx_temp, Register rdx_temp) {
 205   assert_different_registers(rax_argslot, rbx_temp, rdx_temp,
 206                              (!arg_slots.is_register() ? rsp : arg_slots.as_register()));
 207 
 208 #ifdef ASSERT
 209   {
 210     // Verify that [argslot..argslot+size) lies within (rsp, rbp).
 211     Label L_ok, L_bad;
 212     __ lea(rbx_temp, Address(rax_argslot, arg_slots, Address::times_ptr));
 213     __ cmpptr(rbx_temp, rbp);
 214     __ jcc(Assembler::above, L_bad);
 215     __ cmpptr(rsp, rax_argslot);
 216     __ jcc(Assembler::below, L_ok);
 217     __ bind(L_bad);
 218     __ stop("deleted argument(s) must fall within current frame");
 219     __ bind(L_ok);
 220   }
 221   if (arg_slots.is_register()) {
 222     Label L_ok, L_bad;
 223     __ cmpptr(arg_slots.as_register(), (int32_t) NULL_WORD);
 224     __ jcc(Assembler::less, L_bad);
 225     __ testl(arg_slots.as_register(), -stack_move_unit() - 1);
 226     __ jcc(Assembler::zero, L_ok);
 227     __ bind(L_bad);
 228     __ stop("assert arg_slots >= 0 and clear low bits");
 229     __ bind(L_ok);
 230   } else {
 231     assert(arg_slots.as_constant() >= 0, "");
 232     assert(arg_slots.as_constant() % -stack_move_unit() == 0, "");
 233   }
 234 #endif //ASSERT
 235 
 236 #ifdef _LP64
 237   if (false) {                  // not needed, since register is positive
 238     // clean high bits of stack motion register (was loaded as an int)
 239     if (arg_slots.is_register())
 240       __ movslq(arg_slots.as_register(), arg_slots.as_register());
 241   }
 242 #endif
 243 
 244   // Pull up everything shallower than rax_argslot.
 245   // Then remove the excess space on the stack.
 246   // The stacked return address gets pulled up with everything else.
 247   // That is, copy [rsp, argslot) upward by size words.  In pseudo-code:
 248   //   for (rdx = argslot-1; rdx >= rsp; --rdx)
 249   //     rdx[size] = rdx[0]
 250   //   argslot += size;
 251   //   rsp += size;
 252   __ lea(rdx_temp, Address(rax_argslot, -wordSize)); // source pointer for copy
 253   {
 254     Label loop;
 255     __ bind(loop);
 256     // pull one word up each time through the loop
 257     __ movptr(rbx_temp, Address(rdx_temp, 0));
 258     __ movptr(Address(rdx_temp, arg_slots, Address::times_ptr), rbx_temp);
 259     __ addptr(rdx_temp, -wordSize);
 260     __ cmpptr(rdx_temp, rsp);
 261     __ jcc(Assembler::greaterEqual, loop);
 262   }
 263 
 264   // Now move the argslot up, to point to the just-copied block.
 265   __ lea(rsp, Address(rsp, arg_slots, Address::times_ptr));
 266   // And adjust the argslot address to point at the deletion point.
 267   __ lea(rax_argslot, Address(rax_argslot, arg_slots, Address::times_ptr));
 268 }
 269 
 270 #ifndef PRODUCT
 271 extern "C" void print_method_handle(oopDesc* mh);
 272 void trace_method_handle_stub(const char* adaptername,
 273                               oopDesc* mh,
 274                               intptr_t* entry_sp,
 275                               intptr_t* saved_sp,
 276                               intptr_t* saved_bp) {
 277   // called as a leaf from native code: do not block the JVM!
 278   intptr_t* last_sp = (intptr_t*) saved_bp[frame::interpreter_frame_last_sp_offset];
 279   intptr_t* base_sp = (intptr_t*) saved_bp[frame::interpreter_frame_monitor_block_top_offset];
 280   printf("MH %s mh="INTPTR_FORMAT" sp=("INTPTR_FORMAT"+"INTX_FORMAT") stack_size="INTX_FORMAT" bp="INTPTR_FORMAT"\n",
 281          adaptername, (intptr_t)mh, (intptr_t)entry_sp, (intptr_t)(saved_sp - entry_sp), (intptr_t)(base_sp - last_sp), (intptr_t)saved_bp);
 282   if (last_sp != saved_sp)
 283     printf("*** last_sp="INTPTR_FORMAT"\n", (intptr_t)last_sp);
 284   if (Verbose)  print_method_handle(mh);
 285 }
 286 #endif //PRODUCT
 287 
 288 // Generate an "entry" field for a method handle.
 289 // This determines how the method handle will respond to calls.
 290 void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHandles::EntryKind ek) {
 291   // Here is the register state during an interpreted call,
 292   // as set up by generate_method_handle_interpreter_entry():
 293   // - rbx: garbage temp (was MethodHandle.invoke methodOop, unused)
 294   // - rcx: receiver method handle
 295   // - rax: method handle type (only used by the check_mtype entry point)
 296   // - rsi/r13: sender SP (must preserve; see prepare_to_jump_from_interpreted)
 297   // - rdx: garbage temp, can blow away
 298 
 299   Register rcx_recv    = rcx;
 300   Register rax_argslot = rax;
 301   Register rbx_temp    = rbx;
 302   Register rdx_temp    = rdx;
 303 
 304   // This guy is set up by prepare_to_jump_from_interpreted (from interpreted calls)
 305   // and gen_c2i_adapter (from compiled calls):
 306   Register saved_last_sp = LP64_ONLY(r13) NOT_LP64(rsi);
 307 
 308   guarantee(java_dyn_MethodHandle::vmentry_offset_in_bytes() != 0, "must have offsets");
 309 
 310   // some handy addresses
 311   Address rbx_method_fie(     rbx,      methodOopDesc::from_interpreted_offset() );
 312 
 313   Address rcx_mh_vmtarget(    rcx_recv, java_dyn_MethodHandle::vmtarget_offset_in_bytes() );
 314   Address rcx_dmh_vmindex(    rcx_recv, sun_dyn_DirectMethodHandle::vmindex_offset_in_bytes() );
 315 
 316   Address rcx_bmh_vmargslot(  rcx_recv, sun_dyn_BoundMethodHandle::vmargslot_offset_in_bytes() );
 317   Address rcx_bmh_argument(   rcx_recv, sun_dyn_BoundMethodHandle::argument_offset_in_bytes() );
 318 
 319   Address rcx_amh_vmargslot(  rcx_recv, sun_dyn_AdapterMethodHandle::vmargslot_offset_in_bytes() );
 320   Address rcx_amh_argument(   rcx_recv, sun_dyn_AdapterMethodHandle::argument_offset_in_bytes() );
 321   Address rcx_amh_conversion( rcx_recv, sun_dyn_AdapterMethodHandle::conversion_offset_in_bytes() );
 322   Address vmarg;                // __ argument_address(vmargslot)
 323 
 324   int tag_offset = -1;
 325   if (TaggedStackInterpreter) {
 326     tag_offset = Interpreter::tag_offset_in_bytes() - Interpreter::value_offset_in_bytes();
 327     assert(tag_offset = wordSize, "stack grows as expected");
 328   }
 329 
 330   const int java_mirror_offset = klassOopDesc::klass_part_offset_in_bytes() + Klass::java_mirror_offset_in_bytes();
 331 
 332   if (have_entry(ek)) {
 333     __ nop();                   // empty stubs make SG sick
 334     return;
 335   }
 336 
 337   address interp_entry = __ pc();
 338   if (UseCompressedOops)  __ unimplemented("UseCompressedOops");
 339 
 340 #ifndef PRODUCT
 341   if (TraceMethodHandles) {
 342     __ push(rax); __ push(rbx); __ push(rcx); __ push(rdx); __ push(rsi); __ push(rdi);
 343     __ lea(rax, Address(rsp, wordSize*6)); // entry_sp
 344     // arguments:
 345     __ push(rbp);               // interpreter frame pointer
 346     __ push(rsi);               // saved_sp
 347     __ push(rax);               // entry_sp
 348     __ push(rcx);               // mh
 349     __ push(rcx);
 350     __ movptr(Address(rsp, 0), (intptr_t)entry_name(ek));
 351     __ call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub), 5);
 352     __ pop(rdi); __ pop(rsi); __ pop(rdx); __ pop(rcx); __ pop(rbx); __ pop(rax);
 353   }
 354 #endif //PRODUCT
 355 
 356   switch ((int) ek) {
 357   case _raise_exception:
 358     {
 359       // Not a real MH entry, but rather shared code for raising an exception.
 360       // Extra local arguments are pushed on stack, as required type at TOS+8,
 361       // failing object (or NULL) at TOS+4, failing bytecode type at TOS.
 362       // Beyond those local arguments are the PC, of course.
 363       Register rdx_code = rdx_temp;
 364       Register rcx_fail = rcx_recv;
 365       Register rax_want = rax_argslot;
 366       Register rdi_pc   = rdi;
 367       __ pop(rdx_code);  // TOS+0
 368       __ pop(rcx_fail);  // TOS+4
 369       __ pop(rax_want);  // TOS+8
 370       __ pop(rdi_pc);    // caller PC
 371 
 372       __ mov(rsp, rsi);   // cut the stack back to where the caller started
 373 
 374       // Repush the arguments as if coming from the interpreter.
 375       if (TaggedStackInterpreter)  __ push(frame::tag_for_basic_type(T_INT));
 376       __ push(rdx_code);
 377       if (TaggedStackInterpreter)  __ push(frame::tag_for_basic_type(T_OBJECT));
 378       __ push(rcx_fail);
 379       if (TaggedStackInterpreter)  __ push(frame::tag_for_basic_type(T_OBJECT));
 380       __ push(rax_want);
 381 
 382       Register rbx_method = rbx_temp;
 383       Label no_method;
 384       // FIXME: fill in _raise_exception_method with a suitable sun.dyn method
 385       __ movptr(rbx_method, ExternalAddress((address) &_raise_exception_method));
 386       __ testptr(rbx_method, rbx_method);
 387       __ jcc(Assembler::zero, no_method);
 388       int jobject_oop_offset = 0;
 389       __ movptr(rbx_method, Address(rbx_method, jobject_oop_offset));  // dereference the jobject
 390       __ testptr(rbx_method, rbx_method);
 391       __ jcc(Assembler::zero, no_method);
 392       __ verify_oop(rbx_method);
 393       __ push(rdi_pc);          // and restore caller PC
 394       __ jmp(rbx_method_fie);
 395 
 396       // If we get here, the Java runtime did not do its job of creating the exception.
 397       // Do something that is at least causes a valid throw from the interpreter.
 398       __ bind(no_method);
 399       __ pop(rax_want);
 400       if (TaggedStackInterpreter)  __ pop(rcx_fail);
 401       __ pop(rcx_fail);
 402       __ push(rax_want);
 403       __ push(rcx_fail);
 404       __ jump(ExternalAddress(Interpreter::throw_WrongMethodType_entry()));
 405     }
 406     break;
 407 
 408   case _invokestatic_mh:
 409   case _invokespecial_mh:
 410     {
 411       Register rbx_method = rbx_temp;
 412       __ movptr(rbx_method, rcx_mh_vmtarget); // target is a methodOop
 413       __ verify_oop(rbx_method);
 414       // same as TemplateTable::invokestatic or invokespecial,
 415       // minus the CP setup and profiling:
 416       if (ek == _invokespecial_mh) {
 417         // Must load & check the first argument before entering the target method.
 418         __ load_method_handle_vmslots(rax_argslot, rcx_recv, rdx_temp);
 419         __ movptr(rcx_recv, __ argument_address(rax_argslot, -1));
 420         __ null_check(rcx_recv);
 421         __ verify_oop(rcx_recv);
 422       }
 423       __ jmp(rbx_method_fie);
 424     }
 425     break;
 426 
 427   case _invokevirtual_mh:
 428     {
 429       // same as TemplateTable::invokevirtual,
 430       // minus the CP setup and profiling:
 431 
 432       // pick out the vtable index and receiver offset from the MH,
 433       // and then we can discard it:
 434       __ load_method_handle_vmslots(rax_argslot, rcx_recv, rdx_temp);
 435       Register rbx_index = rbx_temp;
 436       __ movl(rbx_index, rcx_dmh_vmindex);
 437       // Note:  The verifier allows us to ignore rcx_mh_vmtarget.
 438       __ movptr(rcx_recv, __ argument_address(rax_argslot, -1));
 439       __ null_check(rcx_recv, oopDesc::klass_offset_in_bytes());
 440 
 441       // get receiver klass
 442       Register rax_klass = rax_argslot;
 443       __ load_klass(rax_klass, rcx_recv);
 444       __ verify_oop(rax_klass);
 445 
 446       // get target methodOop & entry point
 447       const int base = instanceKlass::vtable_start_offset() * wordSize;
 448       assert(vtableEntry::size() * wordSize == wordSize, "adjust the scaling in the code below");
 449       Address vtable_entry_addr(rax_klass,
 450                                 rbx_index, Address::times_ptr,
 451                                 base + vtableEntry::method_offset_in_bytes());
 452       Register rbx_method = rbx_temp;
 453       __ movptr(rbx_method, vtable_entry_addr);
 454 
 455       __ verify_oop(rbx_method);
 456       __ jmp(rbx_method_fie);
 457     }
 458     break;
 459 
 460   case _invokeinterface_mh:
 461     {
 462       // same as TemplateTable::invokeinterface,
 463       // minus the CP setup and profiling:
 464 
 465       // pick out the interface and itable index from the MH.
 466       __ load_method_handle_vmslots(rax_argslot, rcx_recv, rdx_temp);
 467       Register rdx_intf  = rdx_temp;
 468       Register rbx_index = rbx_temp;
 469       __ movptr(rdx_intf,  rcx_mh_vmtarget);
 470       __ movl(rbx_index,   rcx_dmh_vmindex);
 471       __ movptr(rcx_recv, __ argument_address(rax_argslot, -1));
 472       __ null_check(rcx_recv, oopDesc::klass_offset_in_bytes());
 473 
 474       // get receiver klass
 475       Register rax_klass = rax_argslot;
 476       __ load_klass(rax_klass, rcx_recv);
 477       __ verify_oop(rax_klass);
 478 
 479       Register rdi_temp   = rdi;
 480       Register rbx_method = rbx_index;
 481 
 482       // get interface klass
 483       Label no_such_interface;
 484       __ verify_oop(rdx_intf);
 485       __ lookup_interface_method(rax_klass, rdx_intf,
 486                                  // note: next two args must be the same:
 487                                  rbx_index, rbx_method,
 488                                  rdi_temp,
 489                                  no_such_interface);
 490 
 491       __ verify_oop(rbx_method);
 492       __ jmp(rbx_method_fie);
 493       __ hlt();
 494 
 495       __ bind(no_such_interface);
 496       // Throw an exception.
 497       // For historical reasons, it will be IncompatibleClassChangeError.
 498       __ pushptr(Address(rdx_intf, java_mirror_offset));  // required interface
 499       __ push(rcx_recv);        // bad receiver
 500       __ push((int)Bytecodes::_invokeinterface);  // who is complaining?
 501       __ jump(ExternalAddress(from_interpreted_entry(_raise_exception)));
 502     }
 503     break;
 504 
 505   case _bound_ref_mh:
 506   case _bound_int_mh:
 507   case _bound_long_mh:
 508   case _bound_ref_direct_mh:
 509   case _bound_int_direct_mh:
 510   case _bound_long_direct_mh:
 511     {
 512       bool direct_to_method = (ek >= _bound_ref_direct_mh);
 513       BasicType arg_type = T_ILLEGAL;
 514       if (ek == _bound_long_mh || ek == _bound_long_direct_mh) {
 515         arg_type = T_LONG;
 516       } else if (ek == _bound_int_mh || ek == _bound_int_direct_mh) {
 517         arg_type = T_INT;
 518       } else {
 519         assert(ek == _bound_ref_mh || ek == _bound_ref_direct_mh, "must be ref");
 520         arg_type = T_OBJECT;
 521       }
 522       int arg_slots = type2size[arg_type];
 523       int arg_mask  = (arg_type == T_OBJECT ? _INSERT_REF_MASK :
 524                        arg_slots == 1       ? _INSERT_INT_MASK :  _INSERT_LONG_MASK);
 525 
 526       // make room for the new argument:
 527       __ movl(rax_argslot, rcx_bmh_vmargslot);
 528       __ lea(rax_argslot, __ argument_address(rax_argslot));
 529       insert_arg_slots(_masm, arg_slots * stack_move_unit(), arg_mask,
 530                        rax_argslot, rbx_temp, rdx_temp);
 531 
 532       // store bound argument into the new stack slot:
 533       __ movptr(rbx_temp, rcx_bmh_argument);
 534       Address prim_value_addr(rbx_temp, java_lang_boxing_object::value_offset_in_bytes(arg_type));
 535       if (arg_type == T_OBJECT) {
 536         __ movptr(Address(rax_argslot, 0), rbx_temp);
 537       } else {
 538         __ load_sized_value(rbx_temp, prim_value_addr,
 539                             type2aelembytes(arg_type), is_signed_subword_type(arg_type));
 540         __ movptr(Address(rax_argslot, 0), rbx_temp);
 541 #ifndef _LP64
 542         if (arg_slots == 2) {
 543           __ movl(rbx_temp, prim_value_addr.plus_disp(wordSize));
 544           __ movl(Address(rax_argslot, Interpreter::stackElementSize()), rbx_temp);
 545         }
 546 #endif //_LP64
 547         break;
 548       }
 549 
 550       if (direct_to_method) {
 551         Register rbx_method = rbx_temp;
 552         __ movptr(rbx_method, rcx_mh_vmtarget);
 553         __ verify_oop(rbx_method);
 554         __ jmp(rbx_method_fie);
 555       } else {
 556         __ movptr(rcx_recv, rcx_mh_vmtarget);
 557         __ verify_oop(rcx_recv);
 558         __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
 559       }
 560     }
 561     break;
 562 
 563   case _adapter_retype_only:
 564   case _adapter_retype_raw:
 565     // immediately jump to the next MH layer:
 566     __ movptr(rcx_recv, rcx_mh_vmtarget);
 567     __ verify_oop(rcx_recv);
 568     __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
 569     // This is OK when all parameter types widen.
 570     // It is also OK when a return type narrows.
 571     break;
 572 
 573   case _adapter_check_cast:
 574     {
 575       // temps:
 576       Register rbx_klass = rbx_temp; // interesting AMH data
 577 
 578       // check a reference argument before jumping to the next layer of MH:
 579       __ movl(rax_argslot, rcx_amh_vmargslot);
 580       vmarg = __ argument_address(rax_argslot);
 581 
 582       // What class are we casting to?
 583       __ movptr(rbx_klass, rcx_amh_argument); // this is a Class object!
 584       __ movptr(rbx_klass, Address(rbx_klass, java_lang_Class::klass_offset_in_bytes()));
 585 
 586       Label done;
 587       __ movptr(rdx_temp, vmarg);
 588       __ testl(rdx_temp, rdx_temp);
 589       __ jcc(Assembler::zero, done);          // no cast if null
 590       __ load_klass(rdx_temp, rdx_temp);
 591 
 592       // live at this point:
 593       // - rbx_klass:  klass required by the target method
 594       // - rdx_temp:   argument klass to test
 595       // - rcx_recv:   adapter method handle
 596       __ check_klass_subtype(rdx_temp, rbx_klass, rax_argslot, done);
 597 
 598       // If we get here, the type check failed!
 599       // Call the wrong_method_type stub, passing the failing argument type in rax.
 600       Register rax_mtype = rax_argslot;
 601       __ movl(rax_argslot, rcx_amh_vmargslot);  // reload argslot field
 602       __ movptr(rdx_temp, vmarg);
 603 
 604       __ pushptr(rcx_amh_argument); // required class
 605       __ push(rdx_temp);            // bad object
 606       __ push((int)Bytecodes::_checkcast);  // who is complaining?
 607       __ jump(ExternalAddress(from_interpreted_entry(_raise_exception)));
 608 
 609       __ bind(done);
 610       // get the new MH:
 611       __ movptr(rcx_recv, rcx_mh_vmtarget);
 612       __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
 613     }
 614     break;
 615 
 616   case _adapter_prim_to_prim:
 617   case _adapter_ref_to_prim:
 618     // handled completely by optimized cases
 619     __ stop("init_AdapterMethodHandle should not issue this");
 620     break;
 621 
 622   case _adapter_opt_i2i:        // optimized subcase of adapt_prim_to_prim
 623 //case _adapter_opt_f2i:        // optimized subcase of adapt_prim_to_prim
 624   case _adapter_opt_l2i:        // optimized subcase of adapt_prim_to_prim
 625   case _adapter_opt_unboxi:     // optimized subcase of adapt_ref_to_prim
 626     {
 627       // perform an in-place conversion to int or an int subword
 628       __ movl(rax_argslot, rcx_amh_vmargslot);
 629       vmarg = __ argument_address(rax_argslot);
 630 
 631       switch (ek) {
 632       case _adapter_opt_i2i:
 633         __ movl(rdx_temp, vmarg);
 634         break;
 635       case _adapter_opt_l2i:
 636         {
 637           // just delete the extra slot; on a little-endian machine we keep the first
 638           __ lea(rax_argslot, __ argument_address(rax_argslot, 1));
 639           remove_arg_slots(_masm, -stack_move_unit(),
 640                            rax_argslot, rbx_temp, rdx_temp);
 641           vmarg = Address(rax_argslot, -Interpreter::stackElementSize());
 642           __ movl(rdx_temp, vmarg);
 643         }
 644         break;
 645       case _adapter_opt_unboxi:
 646         {
 647           // Load the value up from the heap.
 648           __ movptr(rdx_temp, vmarg);
 649           int value_offset = java_lang_boxing_object::value_offset_in_bytes(T_INT);
 650 #ifdef ASSERT
 651           for (int bt = T_BOOLEAN; bt < T_INT; bt++) {
 652             if (is_subword_type(BasicType(bt)))
 653               assert(value_offset == java_lang_boxing_object::value_offset_in_bytes(BasicType(bt)), "");
 654           }
 655 #endif
 656           __ null_check(rdx_temp, value_offset);
 657           __ movl(rdx_temp, Address(rdx_temp, value_offset));
 658           // We load this as a word.  Because we are little-endian,
 659           // the low bits will be correct, but the high bits may need cleaning.
 660           // The vminfo will guide us to clean those bits.
 661         }
 662         break;
 663       default:
 664         assert(false, "");
 665       }
 666       goto finish_int_conversion;
 667     }
 668 
 669   finish_int_conversion:
 670     {
 671       Register rbx_vminfo = rbx_temp;
 672       __ movl(rbx_vminfo, rcx_amh_conversion);
 673       assert(CONV_VMINFO_SHIFT == 0, "preshifted");
 674 
 675       // get the new MH:
 676       __ movptr(rcx_recv, rcx_mh_vmtarget);
 677       // (now we are done with the old MH)
 678 
 679       // original 32-bit vmdata word must be of this form:
 680       //    | MBZ:16 | signBitCount:8 | srcDstTypes:8 | conversionOp:8 |
 681       __ xchgl(rcx, rbx_vminfo);                // free rcx for shifts
 682       __ shll(rdx_temp /*, rcx*/);
 683       Label zero_extend, done;
 684       __ testl(rcx, CONV_VMINFO_SIGN_FLAG);
 685       __ jcc(Assembler::zero, zero_extend);
 686 
 687       // this path is taken for int->byte, int->short
 688       __ sarl(rdx_temp /*, rcx*/);
 689       __ jmp(done);
 690 
 691       __ bind(zero_extend);
 692       // this is taken for int->char
 693       __ shrl(rdx_temp /*, rcx*/);
 694 
 695       __ bind(done);
 696       __ movptr(vmarg, rdx_temp);
 697       __ xchgl(rcx, rbx_vminfo);                // restore rcx_recv
 698 
 699       __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
 700     }
 701     break;
 702 
 703   case _adapter_opt_i2l:        // optimized subcase of adapt_prim_to_prim
 704   case _adapter_opt_unboxl:     // optimized subcase of adapt_ref_to_prim
 705     {
 706       // perform an in-place int-to-long or ref-to-long conversion
 707       __ movl(rax_argslot, rcx_amh_vmargslot);
 708 
 709       // on a little-endian machine we keep the first slot and add another after
 710       __ lea(rax_argslot, __ argument_address(rax_argslot, 1));
 711       insert_arg_slots(_masm, stack_move_unit(), _INSERT_INT_MASK,
 712                        rax_argslot, rbx_temp, rdx_temp);
 713       Address vmarg1(rax_argslot, -Interpreter::stackElementSize());
 714       Address vmarg2 = vmarg1.plus_disp(Interpreter::stackElementSize());
 715 
 716       switch (ek) {
 717       case _adapter_opt_i2l:
 718         {
 719           __ movl(rdx_temp, vmarg1);
 720           __ sarl(rdx_temp, 31);  // __ extend_sign()
 721           __ movl(vmarg2, rdx_temp); // store second word
 722         }
 723         break;
 724       case _adapter_opt_unboxl:
 725         {
 726           // Load the value up from the heap.
 727           __ movptr(rdx_temp, vmarg1);
 728           int value_offset = java_lang_boxing_object::value_offset_in_bytes(T_LONG);
 729           assert(value_offset == java_lang_boxing_object::value_offset_in_bytes(T_DOUBLE), "");
 730           __ null_check(rdx_temp, value_offset);
 731           __ movl(rbx_temp, Address(rdx_temp, value_offset + 0*BytesPerInt));
 732           __ movl(rdx_temp, Address(rdx_temp, value_offset + 1*BytesPerInt));
 733           __ movl(vmarg1, rbx_temp);
 734           __ movl(vmarg2, rdx_temp);
 735         }
 736         break;
 737       default:
 738         assert(false, "");
 739       }
 740 
 741       __ movptr(rcx_recv, rcx_mh_vmtarget);
 742       __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
 743     }
 744     break;
 745 
 746   case _adapter_opt_f2d:        // optimized subcase of adapt_prim_to_prim
 747   case _adapter_opt_d2f:        // optimized subcase of adapt_prim_to_prim
 748     {
 749       // perform an in-place floating primitive conversion
 750       __ movl(rax_argslot, rcx_amh_vmargslot);
 751       __ lea(rax_argslot, __ argument_address(rax_argslot, 1));
 752       if (ek == _adapter_opt_f2d) {
 753         insert_arg_slots(_masm, stack_move_unit(), _INSERT_INT_MASK,
 754                          rax_argslot, rbx_temp, rdx_temp);
 755       }
 756       Address vmarg(rax_argslot, -Interpreter::stackElementSize());
 757 
 758 #ifdef _LP64
 759       if (ek == _adapter_opt_f2d) {
 760         __ movflt(xmm0, vmarg);
 761         __ cvtss2sd(xmm0, xmm0);
 762         __ movdbl(vmarg, xmm0);
 763       } else {
 764         __ movdbl(xmm0, vmarg);
 765         __ cvtsd2ss(xmm0, xmm0);
 766         __ movflt(vmarg, xmm0);
 767       }
 768 #else //_LP64
 769       if (ek == _adapter_opt_f2d) {
 770         __ fld_s(vmarg);        // load float to ST0
 771         __ fstp_s(vmarg);       // store single
 772       } else if (!TaggedStackInterpreter) {
 773         __ fld_d(vmarg);        // load double to ST0
 774         __ fstp_s(vmarg);       // store single
 775       } else {
 776         Address vmarg_tag = vmarg.plus_disp(tag_offset);
 777         Address vmarg2    = vmarg.plus_disp(Interpreter::stackElementSize());
 778         // vmarg2_tag does not participate in this code
 779         Register rbx_tag = rbx_temp;
 780         __ movl(rbx_tag, vmarg_tag); // preserve tag
 781         __ movl(rdx_temp, vmarg2); // get second word of double
 782         __ movl(vmarg_tag, rdx_temp); // align with first word
 783         __ fld_d(vmarg);        // load double to ST0
 784         __ movl(vmarg_tag, rbx_tag); // restore tag
 785         __ fstp_s(vmarg);       // store single
 786       }
 787 #endif //_LP64
 788 
 789       if (ek == _adapter_opt_d2f) {
 790         remove_arg_slots(_masm, -stack_move_unit(),
 791                          rax_argslot, rbx_temp, rdx_temp);
 792       }
 793 
 794       __ movptr(rcx_recv, rcx_mh_vmtarget);
 795       __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
 796     }
 797     break;
 798 
 799   case _adapter_prim_to_ref:
 800     __ unimplemented(entry_name(ek)); // %%% FIXME: NYI
 801     break;
 802 
 803   case _adapter_swap_args:
 804   case _adapter_rot_args:
 805     // handled completely by optimized cases
 806     __ stop("init_AdapterMethodHandle should not issue this");
 807     break;
 808 
 809   case _adapter_opt_swap_1:
 810   case _adapter_opt_swap_2:
 811   case _adapter_opt_rot_1_up:
 812   case _adapter_opt_rot_1_down:
 813   case _adapter_opt_rot_2_up:
 814   case _adapter_opt_rot_2_down:
 815     {
 816       int rotate = 0, swap_slots = 0;
 817       switch ((int)ek) {
 818       case _adapter_opt_swap_1:     swap_slots = 1; break;
 819       case _adapter_opt_swap_2:     swap_slots = 2; break;
 820       case _adapter_opt_rot_1_up:   swap_slots = 1; rotate++; break;
 821       case _adapter_opt_rot_1_down: swap_slots = 1; rotate--; break;
 822       case _adapter_opt_rot_2_up:   swap_slots = 2; rotate++; break;
 823       case _adapter_opt_rot_2_down: swap_slots = 2; rotate--; break;
 824       default: assert(false, "");
 825       }
 826 
 827       // the real size of the move must be doubled if TaggedStackInterpreter:
 828       int swap_bytes = (int)( swap_slots * Interpreter::stackElementWords() * wordSize );
 829 
 830       // 'argslot' is the position of the first argument to swap
 831       __ movl(rax_argslot, rcx_amh_vmargslot);
 832       __ lea(rax_argslot, __ argument_address(rax_argslot));
 833 
 834       // 'vminfo' is the second
 835       Register rbx_destslot = rbx_temp;
 836       __ movl(rbx_destslot, rcx_amh_conversion);
 837       assert(CONV_VMINFO_SHIFT == 0, "preshifted");
 838       __ andl(rbx_destslot, CONV_VMINFO_MASK);
 839       __ lea(rbx_destslot, __ argument_address(rbx_destslot));
 840       DEBUG_ONLY(verify_argslot(_masm, rbx_destslot, "swap point must fall within current frame"));
 841 
 842       if (!rotate) {
 843         for (int i = 0; i < swap_bytes; i += wordSize) {
 844           __ movptr(rdx_temp, Address(rax_argslot , i));
 845           __ push(rdx_temp);
 846           __ movptr(rdx_temp, Address(rbx_destslot, i));
 847           __ movptr(Address(rax_argslot, i), rdx_temp);
 848           __ pop(rdx_temp);
 849           __ movptr(Address(rbx_destslot, i), rdx_temp);
 850         }
 851       } else {
 852         // push the first chunk, which is going to get overwritten
 853         for (int i = swap_bytes; (i -= wordSize) >= 0; ) {
 854           __ movptr(rdx_temp, Address(rax_argslot, i));
 855           __ push(rdx_temp);
 856         }
 857 
 858         if (rotate > 0) {
 859           // rotate upward
 860           __ subptr(rax_argslot, swap_bytes);
 861 #ifdef ASSERT
 862           {
 863             // Verify that argslot > destslot, by at least swap_bytes.
 864             Label L_ok;
 865             __ cmpptr(rax_argslot, rbx_destslot);
 866             __ jcc(Assembler::aboveEqual, L_ok);
 867             __ stop("source must be above destination (upward rotation)");
 868             __ bind(L_ok);
 869           }
 870 #endif
 871           // work argslot down to destslot, copying contiguous data upwards
 872           // pseudo-code:
 873           //   rax = src_addr - swap_bytes
 874           //   rbx = dest_addr
 875           //   while (rax >= rbx) *(rax + swap_bytes) = *(rax + 0), rax--;
 876           Label loop;
 877           __ bind(loop);
 878           __ movptr(rdx_temp, Address(rax_argslot, 0));
 879           __ movptr(Address(rax_argslot, swap_bytes), rdx_temp);
 880           __ addptr(rax_argslot, -wordSize);
 881           __ cmpptr(rax_argslot, rbx_destslot);
 882           __ jcc(Assembler::aboveEqual, loop);
 883         } else {
 884           __ addptr(rax_argslot, swap_bytes);
 885 #ifdef ASSERT
 886           {
 887             // Verify that argslot < destslot, by at least swap_bytes.
 888             Label L_ok;
 889             __ cmpptr(rax_argslot, rbx_destslot);
 890             __ jcc(Assembler::belowEqual, L_ok);
 891             __ stop("source must be below destination (downward rotation)");
 892             __ bind(L_ok);
 893           }
 894 #endif
 895           // work argslot up to destslot, copying contiguous data downwards
 896           // pseudo-code:
 897           //   rax = src_addr + swap_bytes
 898           //   rbx = dest_addr
 899           //   while (rax <= rbx) *(rax - swap_bytes) = *(rax + 0), rax++;
 900           Label loop;
 901           __ bind(loop);
 902           __ movptr(rdx_temp, Address(rax_argslot, 0));
 903           __ movptr(Address(rax_argslot, -swap_bytes), rdx_temp);
 904           __ addptr(rax_argslot, wordSize);
 905           __ cmpptr(rax_argslot, rbx_destslot);
 906           __ jcc(Assembler::belowEqual, loop);
 907         }
 908 
 909         // pop the original first chunk into the destination slot, now free
 910         for (int i = 0; i < swap_bytes; i += wordSize) {
 911           __ pop(rdx_temp);
 912           __ movptr(Address(rbx_destslot, i), rdx_temp);
 913         }
 914       }
 915 
 916       __ movptr(rcx_recv, rcx_mh_vmtarget);
 917       __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
 918     }
 919     break;
 920 
 921   case _adapter_dup_args:
 922     {
 923       // 'argslot' is the position of the first argument to duplicate
 924       __ movl(rax_argslot, rcx_amh_vmargslot);
 925       __ lea(rax_argslot, __ argument_address(rax_argslot));
 926 
 927       // 'stack_move' is negative number of words to duplicate
 928       Register rdx_stack_move = rdx_temp;
 929       __ movl(rdx_stack_move, rcx_amh_conversion);
 930       __ sarl(rdx_stack_move, CONV_STACK_MOVE_SHIFT);
 931 
 932       int argslot0_num = 0;
 933       Address argslot0 = __ argument_address(RegisterOrConstant(argslot0_num));
 934       assert(argslot0.base() == rsp, "");
 935       int pre_arg_size = argslot0.disp();
 936       assert(pre_arg_size % wordSize == 0, "");
 937       assert(pre_arg_size > 0, "must include PC");
 938 
 939       // remember the old rsp+1 (argslot[0])
 940       Register rbx_oldarg = rbx_temp;
 941       __ lea(rbx_oldarg, argslot0);
 942 
 943       // move rsp down to make room for dups
 944       __ lea(rsp, Address(rsp, rdx_stack_move, Address::times_ptr));
 945 
 946       // compute the new rsp+1 (argslot[0])
 947       Register rdx_newarg = rdx_temp;
 948       __ lea(rdx_newarg, argslot0);
 949 
 950       __ push(rdi);             // need a temp
 951       // (preceding push must be done after arg addresses are taken!)
 952 
 953       // pull down the pre_arg_size data (PC)
 954       for (int i = -pre_arg_size; i < 0; i += wordSize) {
 955         __ movptr(rdi, Address(rbx_oldarg, i));
 956         __ movptr(Address(rdx_newarg, i), rdi);
 957       }
 958 
 959       // copy from rax_argslot[0...] down to new_rsp[1...]
 960       // pseudo-code:
 961       //   rbx = old_rsp+1
 962       //   rdx = new_rsp+1
 963       //   rax = argslot
 964       //   while (rdx < rbx) *rdx++ = *rax++
 965       Label loop;
 966       __ bind(loop);
 967       __ movptr(rdi, Address(rax_argslot, 0));
 968       __ movptr(Address(rdx_newarg, 0), rdi);
 969       __ addptr(rax_argslot, wordSize);
 970       __ addptr(rdx_newarg, wordSize);
 971       __ cmpptr(rdx_newarg, rbx_oldarg);
 972       __ jcc(Assembler::less, loop);
 973 
 974       __ pop(rdi);              // restore temp
 975 
 976       __ movptr(rcx_recv, rcx_mh_vmtarget);
 977       __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
 978     }
 979     break;
 980 
 981   case _adapter_drop_args:
 982     {
 983       // 'argslot' is the position of the first argument to nuke
 984       __ movl(rax_argslot, rcx_amh_vmargslot);
 985       __ lea(rax_argslot, __ argument_address(rax_argslot));
 986 
 987       __ push(rdi);             // need a temp
 988       // (must do previous push after argslot address is taken)
 989 
 990       // 'stack_move' is number of words to drop
 991       Register rdi_stack_move = rdi;
 992       __ movl(rdi_stack_move, rcx_amh_conversion);
 993       __ sarl(rdi_stack_move, CONV_STACK_MOVE_SHIFT);
 994       remove_arg_slots(_masm, rdi_stack_move,
 995                        rax_argslot, rbx_temp, rdx_temp);
 996 
 997       __ pop(rdi);              // restore temp
 998 
 999       __ movptr(rcx_recv, rcx_mh_vmtarget);
1000       __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
1001     }
1002     break;
1003 
1004   case _adapter_collect_args:
1005     __ unimplemented(entry_name(ek)); // %%% FIXME: NYI
1006     break;
1007 
1008   case _adapter_spread_args:
1009     // handled completely by optimized cases
1010     __ stop("init_AdapterMethodHandle should not issue this");
1011     break;
1012 
1013   case _adapter_opt_spread_0:
1014   case _adapter_opt_spread_1:
1015   case _adapter_opt_spread_more:
1016     {
1017       // spread an array out into a group of arguments
1018       int length_constant = -1;
1019       switch (ek) {
1020       case _adapter_opt_spread_0: length_constant = 0; break;
1021       case _adapter_opt_spread_1: length_constant = 1; break;
1022       }
1023 
1024       // find the address of the array argument
1025       __ movl(rax_argslot, rcx_amh_vmargslot);
1026       __ lea(rax_argslot, __ argument_address(rax_argslot));
1027 
1028       // grab some temps
1029       { __ push(rsi); __ push(rdi); }
1030       // (preceding pushes must be done after argslot address is taken!)
1031 #define UNPUSH_RSI_RDI \
1032       { __ pop(rdi); __ pop(rsi); }
1033 
1034       // arx_argslot points both to the array and to the first output arg
1035       vmarg = Address(rax_argslot, 0);
1036 
1037       // Get the array value.
1038       Register  rsi_array       = rsi;
1039       Register  rdx_array_klass = rdx_temp;
1040       BasicType elem_type       = T_OBJECT;
1041       int       length_offset   = arrayOopDesc::length_offset_in_bytes();
1042       int       elem0_offset    = arrayOopDesc::base_offset_in_bytes(elem_type);
1043       __ movptr(rsi_array, vmarg);
1044       Label skip_array_check;
1045       if (length_constant == 0) {
1046         __ testptr(rsi_array, rsi_array);
1047         __ jcc(Assembler::zero, skip_array_check);
1048       }
1049       __ null_check(rsi_array, oopDesc::klass_offset_in_bytes());
1050       __ load_klass(rdx_array_klass, rsi_array);
1051 
1052       // Check the array type.
1053       Register rbx_klass = rbx_temp;
1054       __ movptr(rbx_klass, rcx_amh_argument); // this is a Class object!
1055       __ movptr(rbx_klass, Address(rbx_klass, java_lang_Class::klass_offset_in_bytes()));
1056 
1057       Label ok_array_klass, bad_array_klass, bad_array_length;
1058       __ check_klass_subtype(rdx_array_klass, rbx_klass, rdi, ok_array_klass);
1059       // If we get here, the type check failed!
1060       __ jmp(bad_array_klass);
1061       __ bind(ok_array_klass);
1062 
1063       // Check length.
1064       if (length_constant >= 0) {
1065         __ cmpl(Address(rsi_array, length_offset), length_constant);
1066       } else {
1067         Register rbx_vminfo = rbx_temp;
1068         __ movl(rbx_vminfo, rcx_amh_conversion);
1069         assert(CONV_VMINFO_SHIFT == 0, "preshifted");
1070         __ andl(rbx_vminfo, CONV_VMINFO_MASK);
1071         __ cmpl(rbx_vminfo, Address(rsi_array, length_offset));
1072       }
1073       __ jcc(Assembler::notEqual, bad_array_length);
1074 
1075       Register rdx_argslot_limit = rdx_temp;
1076 
1077       // Array length checks out.  Now insert any required stack slots.
1078       if (length_constant == -1) {
1079         // Form a pointer to the end of the affected region.
1080         __ lea(rdx_argslot_limit, Address(rax_argslot, Interpreter::stackElementSize()));
1081         // 'stack_move' is negative number of words to insert
1082         Register rdi_stack_move = rdi;
1083         __ movl(rdi_stack_move, rcx_amh_conversion);
1084         __ sarl(rdi_stack_move, CONV_STACK_MOVE_SHIFT);
1085         Register rsi_temp = rsi_array;  // spill this
1086         insert_arg_slots(_masm, rdi_stack_move, -1,
1087                          rax_argslot, rbx_temp, rsi_temp);
1088         // reload the array (since rsi was killed)
1089         __ movptr(rsi_array, vmarg);
1090       } else if (length_constant > 1) {
1091         int arg_mask = 0;
1092         int new_slots = (length_constant - 1);
1093         for (int i = 0; i < new_slots; i++) {
1094           arg_mask <<= 1;
1095           arg_mask |= _INSERT_REF_MASK;
1096         }
1097         insert_arg_slots(_masm, new_slots * stack_move_unit(), arg_mask,
1098                          rax_argslot, rbx_temp, rdx_temp);
1099       } else if (length_constant == 1) {
1100         // no stack resizing required
1101       } else if (length_constant == 0) {
1102         remove_arg_slots(_masm, -stack_move_unit(),
1103                          rax_argslot, rbx_temp, rdx_temp);
1104       }
1105 
1106       // Copy from the array to the new slots.
1107       // Note: Stack change code preserves integrity of rax_argslot pointer.
1108       // So even after slot insertions, rax_argslot still points to first argument.
1109       if (length_constant == -1) {
1110         // [rax_argslot, rdx_argslot_limit) is the area we are inserting into.
1111         Register rsi_source = rsi_array;
1112         __ lea(rsi_source, Address(rsi_array, elem0_offset));
1113         Label loop;
1114         __ bind(loop);
1115         __ movptr(rbx_temp, Address(rsi_source, 0));
1116         __ movptr(Address(rax_argslot, 0), rbx_temp);
1117         __ addptr(rsi_source, type2aelembytes(elem_type));
1118         if (TaggedStackInterpreter) {
1119           __ movptr(Address(rax_argslot, tag_offset),
1120                     frame::tag_for_basic_type(elem_type));
1121         }
1122         __ addptr(rax_argslot, Interpreter::stackElementSize());
1123         __ cmpptr(rax_argslot, rdx_argslot_limit);
1124         __ jcc(Assembler::less, loop);
1125       } else if (length_constant == 0) {
1126         __ bind(skip_array_check);
1127         // nothing to copy
1128       } else {
1129         int elem_offset = elem0_offset;
1130         int slot_offset = 0;
1131         for (int index = 0; index < length_constant; index++) {
1132           __ movptr(rbx_temp, Address(rsi_array, elem_offset));
1133           __ movptr(Address(rax_argslot, slot_offset), rbx_temp);
1134           elem_offset += type2aelembytes(elem_type);
1135           if (TaggedStackInterpreter) {
1136             __ movptr(Address(rax_argslot, slot_offset + tag_offset),
1137                       frame::tag_for_basic_type(elem_type));
1138           }
1139           slot_offset += Interpreter::stackElementSize();
1140         }
1141       }
1142 
1143       // Arguments are spread.  Move to next method handle.
1144       UNPUSH_RSI_RDI;
1145       __ movptr(rcx_recv, rcx_mh_vmtarget);
1146       __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
1147 
1148       __ bind(bad_array_klass);
1149       UNPUSH_RSI_RDI;
1150       __ pushptr(Address(rdx_array_klass, java_mirror_offset)); // required type
1151       __ pushptr(vmarg);                // bad array
1152       __ push((int)Bytecodes::_aaload); // who is complaining?
1153       __ jump(ExternalAddress(from_interpreted_entry(_raise_exception)));
1154 
1155       __ bind(bad_array_length);
1156       UNPUSH_RSI_RDI;
1157       __ push(rcx_recv);        // AMH requiring a certain length
1158       __ pushptr(vmarg);        // bad array
1159       __ push((int)Bytecodes::_arraylength); // who is complaining?
1160       __ jump(ExternalAddress(from_interpreted_entry(_raise_exception)));
1161 
1162 #undef UNPUSH_RSI_RDI
1163     }
1164     break;
1165 
1166   case _adapter_flyby:
1167   case _adapter_ricochet:
1168     __ unimplemented(entry_name(ek)); // %%% FIXME: NYI
1169     break;
1170 
1171   default:  ShouldNotReachHere();
1172   }
1173   __ hlt();
1174 
1175   address me_cookie = MethodHandleEntry::start_compiled_entry(_masm, interp_entry);
1176   __ unimplemented(entry_name(ek)); // %%% FIXME: NYI
1177 
1178   init_entry(ek, MethodHandleEntry::finish_compiled_entry(_masm, me_cookie));
1179 }