src/cpu/x86/vm/c1_LIRAssembler_x86.cpp

changeset 1495
323bd24c6520
parent 1424
148e5441d916
child 1635
ba263cfb7611
child 1648
6deeaebad47a
     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  

mercurial