70 __ pop(saved_regs, sp); |
70 __ pop(saved_regs, sp); |
71 } |
71 } |
72 } |
72 } |
73 |
73 |
74 void G1BarrierSetAssembler::gen_write_ref_array_post_barrier(MacroAssembler* masm, DecoratorSet decorators, |
74 void G1BarrierSetAssembler::gen_write_ref_array_post_barrier(MacroAssembler* masm, DecoratorSet decorators, |
75 Register start, Register end, Register scratch, RegSet saved_regs) { |
75 Register start, Register count, Register scratch, RegSet saved_regs) { |
76 __ push(saved_regs, sp); |
76 __ push(saved_regs, sp); |
77 // must compute element count unless barrier set interface is changed (other platforms supply count) |
77 assert_different_registers(start, count, scratch); |
78 assert_different_registers(start, end, scratch); |
78 assert_different_registers(c_rarg0, count); |
79 __ lea(scratch, Address(end, BytesPerHeapOop)); |
|
80 __ sub(scratch, scratch, start); // subtract start to get #bytes |
|
81 __ lsr(scratch, scratch, LogBytesPerHeapOop); // convert to element count |
|
82 __ mov(c_rarg0, start); |
79 __ mov(c_rarg0, start); |
83 __ mov(c_rarg1, scratch); |
80 __ mov(c_rarg1, count); |
84 __ call_VM_leaf(CAST_FROM_FN_PTR(address, G1BarrierSetRuntime::write_ref_array_post_entry), 2); |
81 __ call_VM_leaf(CAST_FROM_FN_PTR(address, G1BarrierSetRuntime::write_ref_array_post_entry), 2); |
85 __ pop(saved_regs, sp); |
82 __ pop(saved_regs, sp); |
86 } |
83 } |
87 |
84 |
88 void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm, |
85 void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm, |