< prev index next >

src/cpu/s390/vm/macroAssembler_s390.cpp

Print this page




3422 
3423   bind(done);
3424 
3425   BLOCK_COMMENT("} compiler_fast_unlock_object");
3426   // flag == EQ indicates success
3427   // flag == NE indicates failure
3428 }
3429 
3430 // Write to card table for modification at store_addr - register is destroyed afterwards.
3431 void MacroAssembler::card_write_barrier_post(Register store_addr, Register tmp) {
3432   CardTableModRefBS* bs = (CardTableModRefBS*) Universe::heap()->barrier_set();
3433   assert(bs->kind() == BarrierSet::CardTableForRS ||
3434          bs->kind() == BarrierSet::CardTableExtension, "wrong barrier");
3435   assert_different_registers(store_addr, tmp);
3436   z_srlg(store_addr, store_addr, CardTableModRefBS::card_shift);
3437   load_absolute_address(tmp, (address)bs->byte_map_base);
3438   z_agr(store_addr, tmp);
3439   z_mvi(0, store_addr, 0); // Store byte 0.
3440 }
3441 
3442 void MacroAssembler::resolve_jobject(Register value, Register tmp1, Register tmp2) {
3443   NearLabel Ldone;
3444   z_ltgr(tmp1, value);
3445   z_bre(Ldone);          // Use NULL result as-is.
3446 
3447   z_nill(value, ~JNIHandles::weak_tag_mask);
3448   z_lg(value, 0, value); // Resolve (untagged) jobject.
3449 
3450 #if INCLUDE_ALL_GCS
3451   if (UseG1GC) {
3452     NearLabel Lnot_weak;
3453     z_tmll(tmp1, JNIHandles::weak_tag_mask); // Test for jweak tag.
3454     z_braz(Lnot_weak);
3455     verify_oop(value);
3456     g1_write_barrier_pre(noreg /* obj */,
3457                          noreg /* offset */,
3458                          value /* pre_val */,
3459                          noreg /* val */,
3460                          tmp1  /* tmp1 */,
3461                          tmp2  /* tmp2 */,
3462                          true  /* pre_val_needed */);
3463     bind(Lnot_weak);
3464   }
3465 #endif // INCLUDE_ALL_GCS
3466   verify_oop(value);
3467   bind(Ldone);
3468 }
3469 
3470 #if INCLUDE_ALL_GCS
3471 
3472 //------------------------------------------------------
3473 // General G1 pre-barrier generator.
3474 // Purpose: record the previous value if it is not null.
3475 // All non-tmps are preserved.
3476 //------------------------------------------------------
3477 void MacroAssembler::g1_write_barrier_pre(Register           Robj,
3478                                           RegisterOrConstant offset,
3479                                           Register           Rpre_val,      // Ideally, this is a non-volatile register.
3480                                           Register           Rval,          // Will be preserved.
3481                                           Register           Rtmp1,         // If Rpre_val is volatile, either Rtmp1
3482                                           Register           Rtmp2,         // or Rtmp2 has to be non-volatile..
3483                                           bool               pre_val_needed // Save Rpre_val across runtime call, caller uses it.
3484                                        ) {
3485   Label callRuntime, filtered;
3486   const int active_offset = in_bytes(JavaThread::satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_active());
3487   const int buffer_offset = in_bytes(JavaThread::satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_buf());
3488   const int index_offset  = in_bytes(JavaThread::satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_index());
3489   assert_different_registers(Rtmp1, Rtmp2, Z_R0_scratch); // None of the Rtmp<i> must be Z_R0!!




3422 
3423   bind(done);
3424 
3425   BLOCK_COMMENT("} compiler_fast_unlock_object");
3426   // flag == EQ indicates success
3427   // flag == NE indicates failure
3428 }
3429 
3430 // Write to card table for modification at store_addr - register is destroyed afterwards.
3431 void MacroAssembler::card_write_barrier_post(Register store_addr, Register tmp) {
3432   CardTableModRefBS* bs = (CardTableModRefBS*) Universe::heap()->barrier_set();
3433   assert(bs->kind() == BarrierSet::CardTableForRS ||
3434          bs->kind() == BarrierSet::CardTableExtension, "wrong barrier");
3435   assert_different_registers(store_addr, tmp);
3436   z_srlg(store_addr, store_addr, CardTableModRefBS::card_shift);
3437   load_absolute_address(tmp, (address)bs->byte_map_base);
3438   z_agr(store_addr, tmp);
3439   z_mvi(0, store_addr, 0); // Store byte 0.
3440 }
3441 




























3442 #if INCLUDE_ALL_GCS
3443 
3444 //------------------------------------------------------
3445 // General G1 pre-barrier generator.
3446 // Purpose: record the previous value if it is not null.
3447 // All non-tmps are preserved.
3448 //------------------------------------------------------
3449 void MacroAssembler::g1_write_barrier_pre(Register           Robj,
3450                                           RegisterOrConstant offset,
3451                                           Register           Rpre_val,      // Ideally, this is a non-volatile register.
3452                                           Register           Rval,          // Will be preserved.
3453                                           Register           Rtmp1,         // If Rpre_val is volatile, either Rtmp1
3454                                           Register           Rtmp2,         // or Rtmp2 has to be non-volatile..
3455                                           bool               pre_val_needed // Save Rpre_val across runtime call, caller uses it.
3456                                        ) {
3457   Label callRuntime, filtered;
3458   const int active_offset = in_bytes(JavaThread::satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_active());
3459   const int buffer_offset = in_bytes(JavaThread::satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_buf());
3460   const int index_offset  = in_bytes(JavaThread::satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_index());
3461   assert_different_registers(Rtmp1, Rtmp2, Z_R0_scratch); // None of the Rtmp<i> must be Z_R0!!


< prev index next >