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