src/cpu/x86/vm/methodHandles_x86.cpp

changeset 2201
d55217dc206f
parent 2173
c93c652551b5
child 2227
beba40b26a79
     1.1 --- a/src/cpu/x86/vm/methodHandles_x86.cpp	Fri Oct 08 02:42:17 2010 -0700
     1.2 +++ b/src/cpu/x86/vm/methodHandles_x86.cpp	Mon Oct 11 04:18:58 2010 -0700
     1.3 @@ -123,11 +123,9 @@
     1.4    }
     1.5  
     1.6    // given the MethodType, find out where the MH argument is buried
     1.7 -  __ movptr(rdx_temp, Address(rax_mtype,
     1.8 -                              __ delayed_value(java_dyn_MethodType::form_offset_in_bytes, rdi_temp)));
     1.9 +  __ load_heap_oop(rdx_temp, Address(rax_mtype, __ delayed_value(java_dyn_MethodType::form_offset_in_bytes, rdi_temp)));
    1.10    Register rdx_vmslots = rdx_temp;
    1.11 -  __ movl(rdx_vmslots, Address(rdx_temp,
    1.12 -                               __ delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, rdi_temp)));
    1.13 +  __ movl(rdx_vmslots, Address(rdx_temp, __ delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, rdi_temp)));
    1.14    __ movptr(rcx_recv, __ argument_address(rdx_vmslots));
    1.15  
    1.16    trace_method_handle(_masm, "invokeExact");
    1.17 @@ -154,20 +152,18 @@
    1.18                     rcx_argslot, rbx_temp, rdx_temp);
    1.19  
    1.20    // load up an adapter from the calling type (Java weaves this)
    1.21 -  __ movptr(rdx_temp, Address(rax_mtype,
    1.22 -                              __ delayed_value(java_dyn_MethodType::form_offset_in_bytes, rdi_temp)));
    1.23 +  __ load_heap_oop(rdx_temp, Address(rax_mtype, __ delayed_value(java_dyn_MethodType::form_offset_in_bytes, rdi_temp)));
    1.24    Register rdx_adapter = rdx_temp;
    1.25 -  // movptr(rdx_adapter, Address(rdx_temp, java_dyn_MethodTypeForm::genericInvoker_offset_in_bytes()));
    1.26 +  // __ load_heap_oop(rdx_adapter, Address(rdx_temp, java_dyn_MethodTypeForm::genericInvoker_offset_in_bytes()));
    1.27    // deal with old JDK versions:
    1.28 -  __ lea(rdi_temp, Address(rdx_temp,
    1.29 -                           __ delayed_value(java_dyn_MethodTypeForm::genericInvoker_offset_in_bytes, rdi_temp)));
    1.30 +  __ lea(rdi_temp, Address(rdx_temp, __ delayed_value(java_dyn_MethodTypeForm::genericInvoker_offset_in_bytes, rdi_temp)));
    1.31    __ cmpptr(rdi_temp, rdx_temp);
    1.32    Label sorry_no_invoke_generic;
    1.33 -  __ jccb(Assembler::below, sorry_no_invoke_generic);
    1.34 +  __ jcc(Assembler::below, sorry_no_invoke_generic);
    1.35  
    1.36 -  __ movptr(rdx_adapter, Address(rdi_temp, 0));
    1.37 +  __ load_heap_oop(rdx_adapter, Address(rdi_temp, 0));
    1.38    __ testptr(rdx_adapter, rdx_adapter);
    1.39 -  __ jccb(Assembler::zero, sorry_no_invoke_generic);
    1.40 +  __ jcc(Assembler::zero, sorry_no_invoke_generic);
    1.41    __ movptr(Address(rcx_argslot, 1 * Interpreter::stackElementSize), rdx_adapter);
    1.42    // As a trusted first argument, pass the type being called, so the adapter knows
    1.43    // the actual types of the arguments and return values.
    1.44 @@ -431,7 +427,6 @@
    1.45    }
    1.46  
    1.47    address interp_entry = __ pc();
    1.48 -  if (UseCompressedOops)  __ unimplemented("UseCompressedOops");
    1.49  
    1.50    trace_method_handle(_masm, entry_name(ek));
    1.51  
    1.52 @@ -489,7 +484,7 @@
    1.53    case _invokespecial_mh:
    1.54      {
    1.55        Register rbx_method = rbx_temp;
    1.56 -      __ movptr(rbx_method, rcx_mh_vmtarget); // target is a methodOop
    1.57 +      __ load_heap_oop(rbx_method, rcx_mh_vmtarget); // target is a methodOop
    1.58        __ verify_oop(rbx_method);
    1.59        // same as TemplateTable::invokestatic or invokespecial,
    1.60        // minus the CP setup and profiling:
    1.61 @@ -546,8 +541,8 @@
    1.62        __ load_method_handle_vmslots(rax_argslot, rcx_recv, rdx_temp);
    1.63        Register rdx_intf  = rdx_temp;
    1.64        Register rbx_index = rbx_temp;
    1.65 -      __ movptr(rdx_intf,  rcx_mh_vmtarget);
    1.66 -      __ movl(rbx_index,   rcx_dmh_vmindex);
    1.67 +      __ load_heap_oop(rdx_intf, rcx_mh_vmtarget);
    1.68 +      __ movl(rbx_index, rcx_dmh_vmindex);
    1.69        __ movptr(rcx_recv, __ argument_address(rax_argslot, -1));
    1.70        __ null_check(rcx_recv, oopDesc::klass_offset_in_bytes());
    1.71  
    1.72 @@ -602,7 +597,7 @@
    1.73                         rax_argslot, rbx_temp, rdx_temp);
    1.74  
    1.75        // store bound argument into the new stack slot:
    1.76 -      __ movptr(rbx_temp, rcx_bmh_argument);
    1.77 +      __ load_heap_oop(rbx_temp, rcx_bmh_argument);
    1.78        Address prim_value_addr(rbx_temp, java_lang_boxing_object::value_offset_in_bytes(arg_type));
    1.79        if (arg_type == T_OBJECT) {
    1.80          __ movptr(Address(rax_argslot, 0), rbx_temp);
    1.81 @@ -620,11 +615,11 @@
    1.82  
    1.83        if (direct_to_method) {
    1.84          Register rbx_method = rbx_temp;
    1.85 -        __ movptr(rbx_method, rcx_mh_vmtarget);
    1.86 +        __ load_heap_oop(rbx_method, rcx_mh_vmtarget);
    1.87          __ verify_oop(rbx_method);
    1.88          __ jmp(rbx_method_fie);
    1.89        } else {
    1.90 -        __ movptr(rcx_recv, rcx_mh_vmtarget);
    1.91 +        __ load_heap_oop(rcx_recv, rcx_mh_vmtarget);
    1.92          __ verify_oop(rcx_recv);
    1.93          __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
    1.94        }
    1.95 @@ -634,7 +629,7 @@
    1.96    case _adapter_retype_only:
    1.97    case _adapter_retype_raw:
    1.98      // immediately jump to the next MH layer:
    1.99 -    __ movptr(rcx_recv, rcx_mh_vmtarget);
   1.100 +    __ load_heap_oop(rcx_recv, rcx_mh_vmtarget);
   1.101      __ verify_oop(rcx_recv);
   1.102      __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
   1.103      // This is OK when all parameter types widen.
   1.104 @@ -651,13 +646,13 @@
   1.105        vmarg = __ argument_address(rax_argslot);
   1.106  
   1.107        // What class are we casting to?
   1.108 -      __ movptr(rbx_klass, rcx_amh_argument); // this is a Class object!
   1.109 -      __ movptr(rbx_klass, Address(rbx_klass, java_lang_Class::klass_offset_in_bytes()));
   1.110 +      __ load_heap_oop(rbx_klass, rcx_amh_argument); // this is a Class object!
   1.111 +      __ load_heap_oop(rbx_klass, Address(rbx_klass, java_lang_Class::klass_offset_in_bytes()));
   1.112  
   1.113        Label done;
   1.114        __ movptr(rdx_temp, vmarg);
   1.115        __ testptr(rdx_temp, rdx_temp);
   1.116 -      __ jccb(Assembler::zero, done);         // no cast if null
   1.117 +      __ jcc(Assembler::zero, done);         // no cast if null
   1.118        __ load_klass(rdx_temp, rdx_temp);
   1.119  
   1.120        // live at this point:
   1.121 @@ -672,14 +667,15 @@
   1.122        __ movl(rax_argslot, rcx_amh_vmargslot);  // reload argslot field
   1.123        __ movptr(rdx_temp, vmarg);
   1.124  
   1.125 -      __ pushptr(rcx_amh_argument); // required class
   1.126 -      __ push(rdx_temp);            // bad object
   1.127 -      __ push((int)Bytecodes::_checkcast);  // who is complaining?
   1.128 +      __ load_heap_oop(rbx_klass, rcx_amh_argument); // required class
   1.129 +      __ push(rbx_klass);
   1.130 +      __ push(rdx_temp);                             // bad object
   1.131 +      __ push((int)Bytecodes::_checkcast);           // who is complaining?
   1.132        __ jump(ExternalAddress(from_interpreted_entry(_raise_exception)));
   1.133  
   1.134        __ bind(done);
   1.135        // get the new MH:
   1.136 -      __ movptr(rcx_recv, rcx_mh_vmtarget);
   1.137 +      __ load_heap_oop(rcx_recv, rcx_mh_vmtarget);
   1.138        __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
   1.139      }
   1.140      break;
   1.141 @@ -741,7 +737,7 @@
   1.142        assert(CONV_VMINFO_SHIFT == 0, "preshifted");
   1.143  
   1.144        // get the new MH:
   1.145 -      __ movptr(rcx_recv, rcx_mh_vmtarget);
   1.146 +      __ load_heap_oop(rcx_recv, rcx_mh_vmtarget);
   1.147        // (now we are done with the old MH)
   1.148  
   1.149        // original 32-bit vmdata word must be of this form:
   1.150 @@ -816,7 +812,7 @@
   1.151          ShouldNotReachHere();
   1.152        }
   1.153  
   1.154 -      __ movptr(rcx_recv, rcx_mh_vmtarget);
   1.155 +      __ load_heap_oop(rcx_recv, rcx_mh_vmtarget);
   1.156        __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
   1.157      }
   1.158      break;
   1.159 @@ -858,7 +854,7 @@
   1.160                           rax_argslot, rbx_temp, rdx_temp);
   1.161        }
   1.162  
   1.163 -      __ movptr(rcx_recv, rcx_mh_vmtarget);
   1.164 +      __ load_heap_oop(rcx_recv, rcx_mh_vmtarget);
   1.165        __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
   1.166      }
   1.167      break;
   1.168 @@ -969,7 +965,7 @@
   1.169          }
   1.170        }
   1.171  
   1.172 -      __ movptr(rcx_recv, rcx_mh_vmtarget);
   1.173 +      __ load_heap_oop(rcx_recv, rcx_mh_vmtarget);
   1.174        __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
   1.175      }
   1.176      break;
   1.177 @@ -1029,7 +1025,7 @@
   1.178  
   1.179        __ pop(rdi);              // restore temp
   1.180  
   1.181 -      __ movptr(rcx_recv, rcx_mh_vmtarget);
   1.182 +      __ load_heap_oop(rcx_recv, rcx_mh_vmtarget);
   1.183        __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
   1.184      }
   1.185      break;
   1.186 @@ -1052,7 +1048,7 @@
   1.187  
   1.188        __ pop(rdi);              // restore temp
   1.189  
   1.190 -      __ movptr(rcx_recv, rcx_mh_vmtarget);
   1.191 +      __ load_heap_oop(rcx_recv, rcx_mh_vmtarget);
   1.192        __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
   1.193      }
   1.194      break;
   1.195 @@ -1103,8 +1099,8 @@
   1.196  
   1.197        // Check the array type.
   1.198        Register rbx_klass = rbx_temp;
   1.199 -      __ movptr(rbx_klass, rcx_amh_argument); // this is a Class object!
   1.200 -      __ movptr(rbx_klass, Address(rbx_klass, java_lang_Class::klass_offset_in_bytes()));
   1.201 +      __ load_heap_oop(rbx_klass, rcx_amh_argument); // this is a Class object!
   1.202 +      __ load_heap_oop(rbx_klass, Address(rbx_klass, java_lang_Class::klass_offset_in_bytes()));
   1.203  
   1.204        Label ok_array_klass, bad_array_klass, bad_array_length;
   1.205        __ check_klass_subtype(rdx_array_klass, rbx_klass, rdi, ok_array_klass);
   1.206 @@ -1186,7 +1182,7 @@
   1.207  
   1.208        // Arguments are spread.  Move to next method handle.
   1.209        UNPUSH_RSI_RDI;
   1.210 -      __ movptr(rcx_recv, rcx_mh_vmtarget);
   1.211 +      __ load_heap_oop(rcx_recv, rcx_mh_vmtarget);
   1.212        __ jump_to_method_handle_entry(rcx_recv, rdx_temp);
   1.213  
   1.214        __ bind(bad_array_klass);

mercurial