src/cpu/sparc/vm/assembler_sparc.cpp

changeset 1229
315a5d70b295
parent 1162
6b2273dd6fa9
child 1280
df6caf649ff7
equal deleted inserted replaced
1193:9b3a41ccc927 1229:315a5d70b295
4452 // XXX Should I predict this taken or not? Does it mattern? 4452 // XXX Should I predict this taken or not? Does it mattern?
4453 br_on_reg_cond(rc_z, /*annul*/false, Assembler::pt, tmp, filtered); 4453 br_on_reg_cond(rc_z, /*annul*/false, Assembler::pt, tmp, filtered);
4454 delayed()->nop(); 4454 delayed()->nop();
4455 } 4455 }
4456 4456
4457 // Now we decide how to generate the card table write. If we're 4457 // If the "store_addr" register is an "in" or "local" register, move it to
4458 // enqueueing, we call out to a generated function. Otherwise, we do it 4458 // a scratch reg so we can pass it as an argument.
4459 // inline here. 4459 bool use_scr = !(store_addr->is_global() || store_addr->is_out());
4460 4460 // Pick a scratch register different from "tmp".
4461 if (G1RSBarrierUseQueue) { 4461 Register scr = (tmp == G1_scratch ? G3_scratch : G1_scratch);
4462 // If the "store_addr" register is an "in" or "local" register, move it to 4462 // Make sure we use up the delay slot!
4463 // a scratch reg so we can pass it as an argument. 4463 if (use_scr) {
4464 bool use_scr = !(store_addr->is_global() || store_addr->is_out()); 4464 post_filter_masm->mov(store_addr, scr);
4465 // Pick a scratch register different from "tmp".
4466 Register scr = (tmp == G1_scratch ? G3_scratch : G1_scratch);
4467 // Make sure we use up the delay slot!
4468 if (use_scr) {
4469 post_filter_masm->mov(store_addr, scr);
4470 } else {
4471 post_filter_masm->nop();
4472 }
4473 generate_dirty_card_log_enqueue_if_necessary(bs->byte_map_base);
4474 save_frame(0);
4475 call(dirty_card_log_enqueue);
4476 if (use_scr) {
4477 delayed()->mov(scr, O0);
4478 } else {
4479 delayed()->mov(store_addr->after_save(), O0);
4480 }
4481 restore();
4482
4483 } else { 4465 } else {
4484 4466 post_filter_masm->nop();
4485 #ifdef _LP64 4467 }
4486 post_filter_masm->srlx(store_addr, CardTableModRefBS::card_shift, store_addr); 4468 generate_dirty_card_log_enqueue_if_necessary(bs->byte_map_base);
4487 #else 4469 save_frame(0);
4488 post_filter_masm->srl(store_addr, CardTableModRefBS::card_shift, store_addr); 4470 call(dirty_card_log_enqueue);
4489 #endif 4471 if (use_scr) {
4490 assert(tmp != store_addr, "need separate temp reg"); 4472 delayed()->mov(scr, O0);
4491 set(bs->byte_map_base, tmp); 4473 } else {
4492 stb(G0, tmp, store_addr); 4474 delayed()->mov(store_addr->after_save(), O0);
4493 } 4475 }
4476 restore();
4494 4477
4495 bind(filtered); 4478 bind(filtered);
4496 4479
4497 } 4480 }
4498 4481

mercurial