1.1 --- a/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Fri Oct 30 16:22:59 2009 -0700 1.2 +++ b/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Mon Nov 02 11:17:55 2009 +0100 1.3 @@ -301,22 +301,25 @@ 1.4 Register OSR_buf = osrBufferPointer()->as_pointer_register(); 1.5 { assert(frame::interpreter_frame_monitor_size() == BasicObjectLock::size(), "adjust code below"); 1.6 int monitor_offset = BytesPerWord * method()->max_locals() + 1.7 - (BasicObjectLock::size() * BytesPerWord) * (number_of_locks - 1); 1.8 + (2 * BytesPerWord) * (number_of_locks - 1); 1.9 + // SharedRuntime::OSR_migration_begin() packs BasicObjectLocks in 1.10 + // the OSR buffer using 2 word entries: first the lock and then 1.11 + // the oop. 1.12 for (int i = 0; i < number_of_locks; i++) { 1.13 - int slot_offset = monitor_offset - ((i * BasicObjectLock::size()) * BytesPerWord); 1.14 + int slot_offset = monitor_offset - ((i * 2) * BytesPerWord); 1.15 #ifdef ASSERT 1.16 // verify the interpreter's monitor has a non-null object 1.17 { 1.18 Label L; 1.19 - __ cmpptr(Address(OSR_buf, slot_offset + BasicObjectLock::obj_offset_in_bytes()), (int32_t)NULL_WORD); 1.20 + __ cmpptr(Address(OSR_buf, slot_offset + 1*BytesPerWord), (int32_t)NULL_WORD); 1.21 __ jcc(Assembler::notZero, L); 1.22 __ stop("locked object is NULL"); 1.23 __ bind(L); 1.24 } 1.25 #endif 1.26 - __ movptr(rbx, Address(OSR_buf, slot_offset + BasicObjectLock::lock_offset_in_bytes())); 1.27 + __ movptr(rbx, Address(OSR_buf, slot_offset + 0)); 1.28 __ movptr(frame_map()->address_for_monitor_lock(i), rbx); 1.29 - __ movptr(rbx, Address(OSR_buf, slot_offset + BasicObjectLock::obj_offset_in_bytes())); 1.30 + __ movptr(rbx, Address(OSR_buf, slot_offset + 1*BytesPerWord)); 1.31 __ movptr(frame_map()->address_for_monitor_object(i), rbx); 1.32 } 1.33 } 1.34 @@ -785,7 +788,13 @@ 1.35 ShouldNotReachHere(); 1.36 __ movoop(as_Address(addr, noreg), c->as_jobject()); 1.37 } else { 1.38 +#ifdef _LP64 1.39 + __ movoop(rscratch1, c->as_jobject()); 1.40 + null_check_here = code_offset(); 1.41 + __ movptr(as_Address_lo(addr), rscratch1); 1.42 +#else 1.43 __ movoop(as_Address(addr), c->as_jobject()); 1.44 +#endif 1.45 } 1.46 } 1.47 break; 1.48 @@ -1118,8 +1127,14 @@ 1.49 __ pushptr(frame_map()->address_for_slot(src ->single_stack_ix())); 1.50 __ popptr (frame_map()->address_for_slot(dest->single_stack_ix())); 1.51 } else { 1.52 +#ifndef _LP64 1.53 __ pushl(frame_map()->address_for_slot(src ->single_stack_ix())); 1.54 __ popl (frame_map()->address_for_slot(dest->single_stack_ix())); 1.55 +#else 1.56 + //no pushl on 64bits 1.57 + __ movl(rscratch1, frame_map()->address_for_slot(src ->single_stack_ix())); 1.58 + __ movl(frame_map()->address_for_slot(dest->single_stack_ix()), rscratch1); 1.59 +#endif 1.60 } 1.61 1.62 } else if (src->is_double_stack()) { 1.63 @@ -3136,8 +3151,10 @@ 1.64 1.65 #ifdef _LP64 1.66 assert_different_registers(c_rarg0, dst, dst_pos, length); 1.67 + __ movl2ptr(src_pos, src_pos); //higher 32bits must be null 1.68 __ lea(c_rarg0, Address(src, src_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type))); 1.69 assert_different_registers(c_rarg1, length); 1.70 + __ movl2ptr(dst_pos, dst_pos); //higher 32bits must be null 1.71 __ lea(c_rarg1, Address(dst, dst_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type))); 1.72 __ mov(c_rarg2, length); 1.73