28 #include "asm/macroAssembler.inline.hpp" |
28 #include "asm/macroAssembler.inline.hpp" |
29 #include "compiler/disassembler.hpp" |
29 #include "compiler/disassembler.hpp" |
30 #include "gc/shared/cardTable.hpp" |
30 #include "gc/shared/cardTable.hpp" |
31 #include "gc/shared/collectedHeap.inline.hpp" |
31 #include "gc/shared/collectedHeap.inline.hpp" |
32 #include "interpreter/interpreter.hpp" |
32 #include "interpreter/interpreter.hpp" |
33 #include "gc/shared/cardTableModRefBS.hpp" |
33 #include "gc/shared/cardTableBarrierSet.hpp" |
34 #include "memory/resourceArea.hpp" |
34 #include "memory/resourceArea.hpp" |
35 #include "memory/universe.hpp" |
35 #include "memory/universe.hpp" |
36 #include "oops/klass.inline.hpp" |
36 #include "oops/klass.inline.hpp" |
37 #include "opto/compile.hpp" |
37 #include "opto/compile.hpp" |
38 #include "opto/intrinsicnode.hpp" |
38 #include "opto/intrinsicnode.hpp" |
3503 } |
3503 } |
3504 |
3504 |
3505 // Write to card table for modification at store_addr - register is destroyed afterwards. |
3505 // Write to card table for modification at store_addr - register is destroyed afterwards. |
3506 void MacroAssembler::card_write_barrier_post(Register store_addr, Register tmp) { |
3506 void MacroAssembler::card_write_barrier_post(Register store_addr, Register tmp) { |
3507 BarrierSet* bs = Universe::heap()->barrier_set(); |
3507 BarrierSet* bs = Universe::heap()->barrier_set(); |
3508 CardTableModRefBS* ctbs = barrier_set_cast<CardTableModRefBS>(bs); |
3508 CardTableBarrierSet* ctbs = barrier_set_cast<CardTableBarrierSet>(bs); |
3509 CardTable* ct = ctbs->card_table(); |
3509 CardTable* ct = ctbs->card_table(); |
3510 assert(bs->kind() == BarrierSet::CardTableModRef, "wrong barrier"); |
3510 assert(bs->kind() == BarrierSet::CardTableBarrierSet, "wrong barrier"); |
3511 assert_different_registers(store_addr, tmp); |
3511 assert_different_registers(store_addr, tmp); |
3512 z_srlg(store_addr, store_addr, CardTable::card_shift); |
3512 z_srlg(store_addr, store_addr, CardTable::card_shift); |
3513 load_absolute_address(tmp, (address)ct->byte_map_base()); |
3513 load_absolute_address(tmp, (address)ct->byte_map_base()); |
3514 z_agr(store_addr, tmp); |
3514 z_agr(store_addr, tmp); |
3515 z_mvi(0, store_addr, 0); // Store byte 0. |
3515 z_mvi(0, store_addr, 0); // Store byte 0. |