1.1 --- a/src/cpu/x86/vm/methodHandles_x86.cpp Wed Oct 13 11:46:46 2010 -0400 1.2 +++ b/src/cpu/x86/vm/methodHandles_x86.cpp Fri Oct 15 15:12:04 2010 -0400 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);