433 G1BarrierSetC1* bs = (G1BarrierSetC1*)BarrierSet::barrier_set()->barrier_set_c1();
434 __ bind(*stub->entry());
435 assert(stub->addr()->is_register(), "Precondition.");
436 assert(stub->new_val()->is_register(), "Precondition.");
437 Register new_val_reg = stub->new_val()->as_register();
438 __ cmpptr(new_val_reg, (int32_t) NULL_WORD);
439 __ jcc(Assembler::equal, *stub->continuation());
440 ce->store_parameter(stub->addr()->as_pointer_register(), 0);
441 __ call(RuntimeAddress(bs->post_barrier_c1_runtime_code_blob()->code_begin()));
442 __ jmp(*stub->continuation());
443 }
444
445 #undef __
446
447 #define __ sasm->
448
449 void G1BarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAssembler* sasm) {
450 __ prologue("g1_pre_barrier", false);
451 // arg0 : previous value of memory
452
453 BarrierSet* bs = BarrierSet::barrier_set();
454 __ push(rax);
455 __ push(rdx);
456
457 const Register pre_val = rax;
458 const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread);
459 const Register tmp = rdx;
460
461 NOT_LP64(__ get_thread(thread);)
462
463 Address queue_active(thread, in_bytes(G1ThreadLocalData::satb_mark_queue_active_offset()));
464 Address queue_index(thread, in_bytes(G1ThreadLocalData::satb_mark_queue_index_offset()));
465 Address buffer(thread, in_bytes(G1ThreadLocalData::satb_mark_queue_buffer_offset()));
466
467 Label done;
468 Label runtime;
469
470 // Is marking still active?
471 if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {
472 __ cmpl(queue_active, 0);
|
433 G1BarrierSetC1* bs = (G1BarrierSetC1*)BarrierSet::barrier_set()->barrier_set_c1();
434 __ bind(*stub->entry());
435 assert(stub->addr()->is_register(), "Precondition.");
436 assert(stub->new_val()->is_register(), "Precondition.");
437 Register new_val_reg = stub->new_val()->as_register();
438 __ cmpptr(new_val_reg, (int32_t) NULL_WORD);
439 __ jcc(Assembler::equal, *stub->continuation());
440 ce->store_parameter(stub->addr()->as_pointer_register(), 0);
441 __ call(RuntimeAddress(bs->post_barrier_c1_runtime_code_blob()->code_begin()));
442 __ jmp(*stub->continuation());
443 }
444
445 #undef __
446
447 #define __ sasm->
448
449 void G1BarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAssembler* sasm) {
450 __ prologue("g1_pre_barrier", false);
451 // arg0 : previous value of memory
452
453 __ push(rax);
454 __ push(rdx);
455
456 const Register pre_val = rax;
457 const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread);
458 const Register tmp = rdx;
459
460 NOT_LP64(__ get_thread(thread);)
461
462 Address queue_active(thread, in_bytes(G1ThreadLocalData::satb_mark_queue_active_offset()));
463 Address queue_index(thread, in_bytes(G1ThreadLocalData::satb_mark_queue_index_offset()));
464 Address buffer(thread, in_bytes(G1ThreadLocalData::satb_mark_queue_buffer_offset()));
465
466 Label done;
467 Label runtime;
468
469 // Is marking still active?
470 if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {
471 __ cmpl(queue_active, 0);
|