src/hotspot/cpu/s390/interp_masm_s390.cpp
changeset 59252 623722a6aeb9
parent 58784 9019c186ae99
equal deleted inserted replaced
59251:4cbfa5077d68 59252:623722a6aeb9
   974 
   974 
   975   // template code:
   975   // template code:
   976   //
   976   //
   977   // markWord displaced_header = obj->mark().set_unlocked();
   977   // markWord displaced_header = obj->mark().set_unlocked();
   978   // monitor->lock()->set_displaced_header(displaced_header);
   978   // monitor->lock()->set_displaced_header(displaced_header);
   979   // if (Atomic::cmpxchg(/*ex=*/monitor, /*addr*/obj->mark_addr(), /*cmp*/displaced_header) == displaced_header) {
   979   // if (Atomic::cmpxchg(/*addr*/obj->mark_addr(), /*cmp*/displaced_header, /*ex=*/monitor) == displaced_header) {
   980   //   // We stored the monitor address into the object's mark word.
   980   //   // We stored the monitor address into the object's mark word.
   981   // } else if (THREAD->is_lock_owned((address)displaced_header))
   981   // } else if (THREAD->is_lock_owned((address)displaced_header))
   982   //   // Simple recursive case.
   982   //   // Simple recursive case.
   983   //   monitor->lock()->set_displaced_header(NULL);
   983   //   monitor->lock()->set_displaced_header(NULL);
   984   // } else {
   984   // } else {
  1009 
  1009 
  1010   // Initialize the box (Must happen before we update the object mark!).
  1010   // Initialize the box (Must happen before we update the object mark!).
  1011   z_stg(displaced_header, BasicObjectLock::lock_offset_in_bytes() +
  1011   z_stg(displaced_header, BasicObjectLock::lock_offset_in_bytes() +
  1012                           BasicLock::displaced_header_offset_in_bytes(), monitor);
  1012                           BasicLock::displaced_header_offset_in_bytes(), monitor);
  1013 
  1013 
  1014   // if (Atomic::cmpxchg(/*ex=*/monitor, /*addr*/obj->mark_addr(), /*cmp*/displaced_header) == displaced_header) {
  1014   // if (Atomic::cmpxchg(/*addr*/obj->mark_addr(), /*cmp*/displaced_header, /*ex=*/monitor) == displaced_header) {
  1015 
  1015 
  1016   // Store stack address of the BasicObjectLock (this is monitor) into object.
  1016   // Store stack address of the BasicObjectLock (this is monitor) into object.
  1017   add2reg(object_mark_addr, oopDesc::mark_offset_in_bytes(), object);
  1017   add2reg(object_mark_addr, oopDesc::mark_offset_in_bytes(), object);
  1018 
  1018 
  1019   z_csg(displaced_header, monitor, 0, object_mark_addr);
  1019   z_csg(displaced_header, monitor, 0, object_mark_addr);
  1080   // template code:
  1080   // template code:
  1081   //
  1081   //
  1082   // if ((displaced_header = monitor->displaced_header()) == NULL) {
  1082   // if ((displaced_header = monitor->displaced_header()) == NULL) {
  1083   //   // Recursive unlock. Mark the monitor unlocked by setting the object field to NULL.
  1083   //   // Recursive unlock. Mark the monitor unlocked by setting the object field to NULL.
  1084   //   monitor->set_obj(NULL);
  1084   //   monitor->set_obj(NULL);
  1085   // } else if (Atomic::cmpxchg(displaced_header, obj->mark_addr(), monitor) == monitor) {
  1085   // } else if (Atomic::cmpxchg(obj->mark_addr(), monitor, displaced_header) == monitor) {
  1086   //   // We swapped the unlocked mark in displaced_header into the object's mark word.
  1086   //   // We swapped the unlocked mark in displaced_header into the object's mark word.
  1087   //   monitor->set_obj(NULL);
  1087   //   monitor->set_obj(NULL);
  1088   // } else {
  1088   // } else {
  1089   //   // Slow path.
  1089   //   // Slow path.
  1090   //   InterpreterRuntime::monitorexit(THREAD, monitor);
  1090   //   InterpreterRuntime::monitorexit(THREAD, monitor);
  1121   MacroAssembler::load_and_test_long(displaced_header,
  1121   MacroAssembler::load_and_test_long(displaced_header,
  1122                                      Address(monitor, BasicObjectLock::lock_offset_in_bytes() +
  1122                                      Address(monitor, BasicObjectLock::lock_offset_in_bytes() +
  1123                                                       BasicLock::displaced_header_offset_in_bytes()));
  1123                                                       BasicLock::displaced_header_offset_in_bytes()));
  1124   z_bre(done); // displaced_header == 0 -> goto done
  1124   z_bre(done); // displaced_header == 0 -> goto done
  1125 
  1125 
  1126   // } else if (Atomic::cmpxchg(displaced_header, obj->mark_addr(), monitor) == monitor) {
  1126   // } else if (Atomic::cmpxchg(obj->mark_addr(), monitor, displaced_header) == monitor) {
  1127   //   // We swapped the unlocked mark in displaced_header into the object's mark word.
  1127   //   // We swapped the unlocked mark in displaced_header into the object's mark word.
  1128   //   monitor->set_obj(NULL);
  1128   //   monitor->set_obj(NULL);
  1129 
  1129 
  1130   // If we still have a lightweight lock, unlock the object and be done.
  1130   // If we still have a lightweight lock, unlock the object and be done.
  1131 
  1131