< prev index next >

src/hotspot/share/c1/c1_LIRGenerator.cpp

Print this page
@@ -634,11 +634,11 @@
  void LIRGenerator::monitor_exit(LIR_Opr object, LIR_Opr lock, LIR_Opr new_hdr, LIR_Opr scratch, int monitor_no) {
    if (!GenerateSynchronizationCode) return;
    // setup registers
    LIR_Opr hdr = lock;
    lock = new_hdr;
-   CodeStub* slow_path = new MonitorExitStub(lock, UseFastLocking, monitor_no);
+   CodeStub* slow_path = new MonitorExitStub(lock, LockingMode != LM_MONITOR, monitor_no);
    __ load_stack_address_monitor(monitor_no, lock);
    __ unlock_object(hdr, object, lock, scratch, slow_path);
  }
  
  #ifndef PRODUCT

@@ -1253,29 +1253,33 @@
                                       x->type(),
                                       NULL); // NULL CodeEmitInfo results in a leaf call
    __ move(call_result, result);
  }
  
+ void LIRGenerator::load_klass(LIR_Opr obj, LIR_Opr klass, CodeEmitInfo* null_check_info) {
+   CodeStub* slow_path = UseCompactObjectHeaders ? new LoadKlassStub(klass) : NULL;
+   __ load_klass(obj, klass, null_check_info, slow_path);
+ }
+ 
  // Example: object.getClass ()
  void LIRGenerator::do_getClass(Intrinsic* x) {
    assert(x->number_of_arguments() == 1, "wrong type");
  
    LIRItem rcvr(x->argument_at(0), this);
    rcvr.load_item();
-   LIR_Opr temp = new_register(T_METADATA);
+   LIR_Opr temp = new_register(T_ADDRESS);
    LIR_Opr result = rlock_result(x);
  
    // need to perform the null check on the rcvr
    CodeEmitInfo* info = NULL;
    if (x->needs_null_check()) {
      info = state_for(x);
    }
  
-   // FIXME T_ADDRESS should actually be T_METADATA but it can't because the
-   // meaning of these two is mixed up (see JDK-8026837).
-   __ move(new LIR_Address(rcvr.result(), oopDesc::klass_offset_in_bytes(), T_ADDRESS), temp, info);
-   __ move_wide(new LIR_Address(temp, in_bytes(Klass::java_mirror_offset()), T_ADDRESS), temp);
+   LIR_Opr klass = new_register(T_METADATA);
+   load_klass(rcvr.result(), klass, info);
+   __ move_wide(new LIR_Address(klass, in_bytes(Klass::java_mirror_offset()), T_ADDRESS), temp);
    // mirror = ((OopHandle)mirror)->resolve();
    access_load(IN_NATIVE, T_OBJECT,
                LIR_OprFact::address(new LIR_Address(temp, T_OBJECT)), result);
  }
  

@@ -1351,11 +1355,11 @@
  
    LIRItem value(x->argument_at(2), this);
    value.load_item();
  
    LIR_Opr klass = new_register(T_METADATA);
-   __ move(new LIR_Address(value.result(), oopDesc::klass_offset_in_bytes(), T_ADDRESS), klass, NULL);
+   load_klass(value.result(), klass, NULL);
    LIR_Opr layout = new_register(T_INT);
    __ move(new LIR_Address(klass, in_bytes(Klass::layout_helper_offset()), T_INT), layout);
  
    LabelObj* L_done = new LabelObj();
    LabelObj* L_array = new LabelObj();

@@ -3742,11 +3746,11 @@
      __ logical_and(value_fixed, LIR_OprFact::intConst(1), value_fixed);
    } else {
      __ logical_and(value, LIR_OprFact::intConst(1), value_fixed);
    }
    LIR_Opr klass = new_register(T_METADATA);
-   __ move(new LIR_Address(array, oopDesc::klass_offset_in_bytes(), T_ADDRESS), klass, null_check_info);
+   load_klass(array, klass, null_check_info);
    null_check_info = NULL;
    LIR_Opr layout = new_register(T_INT);
    __ move(new LIR_Address(klass, in_bytes(Klass::layout_helper_offset()), T_INT), layout);
    int diffbit = Klass::layout_helper_boolean_diffbit();
    __ logical_and(layout, LIR_OprFact::intConst(diffbit), layout);
< prev index next >