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!!
|
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!!
|