Print this page
rev 1022 : 6829192: JSR 292 needs to support 64-bit x86
Summary: changes for method handles and invokedynamic
Reviewed-by: ?, ?

Split Close
Expand all
Collapse all
          --- old/src/cpu/x86/vm/interpreter_x86_64.cpp
          +++ new/src/cpu/x86/vm/interpreter_x86_64.cpp
↓ open down ↓ 269 lines elided ↑ open up ↑
 270  270  
 271  271  // Abstract method entry
 272  272  // Attempt to execute abstract method. Throw exception
 273  273  address InterpreterGenerator::generate_abstract_entry(void) {
 274  274    // rbx: methodOop
 275  275    // r13: sender SP
 276  276  
 277  277    address entry_point = __ pc();
 278  278  
 279  279    // abstract method entry
 280      -  // remove return address. Not really needed, since exception
 281      -  // handling throws away expression stack
 282      -  __ pop(rbx);
 283  280  
 284      -  // adjust stack to what a normal return would do
 285      -  __ mov(rsp, r13);
      281 +  //  pop return address, reset last_sp to NULL
      282 +  __ empty_expression_stack();
      283 +  __ restore_bcp();      // rsi must be correct for exception handler   (was destroyed)
      284 +  __ restore_locals();   // make sure locals pointer is correct as well (was destroyed)
 286  285  
 287  286    // throw exception
 288  287    __ call_VM(noreg, CAST_FROM_FN_PTR(address,
 289  288                               InterpreterRuntime::throw_AbstractMethodError));
 290  289    // the call_VM checks for exception, so we should never return here.
 291  290    __ should_not_reach_here();
 292  291  
 293  292    return entry_point;
 294  293  }
 295  294  
 296  295  
 297  296  // Method handle invoker
 298  297  // Dispatch a method of the form java.dyn.MethodHandles::invoke(...)
 299  298  address InterpreterGenerator::generate_method_handle_entry(void) {
 300  299    if (!EnableMethodHandles) {
 301  300      return generate_abstract_entry();
 302  301    }
 303      -  return generate_abstract_entry(); //6815692//
      302 +
      303 +  address entry_point = MethodHandles::generate_method_handle_interpreter_entry(_masm);
      304 +
      305 +  return entry_point;
 304  306  }
 305  307  
 306  308  
 307  309  // Empty method, generate a very fast return.
 308  310  
 309  311  address InterpreterGenerator::generate_empty_entry(void) {
 310  312    // rbx: methodOop
 311  313    // r13: sender sp must set sp to this value on return
 312  314  
 313  315    if (!UseFastEmptyMethods) {
↓ open down ↓ 54 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX