153
154 class ShenandoahBarrierStubC2 : public BarrierStubC2 {
155 Register _obj;
156 Address const _addr;
157 Register const _tmp1;
158 Register const _tmp2;
159 const bool _do_load;
160 const bool _narrow;
161 const bool _needs_load_ref_barrier;
162 const bool _needs_load_ref_weak_barrier;
163 const bool _needs_keep_alive_barrier;
164 bool _needs_far_jump;
165
166 static void register_stub(ShenandoahBarrierStubC2* stub);
167
168 int available_gp_registers();
169 bool is_live_register(Register reg);
170 bool is_special_register(Register reg);
171 Register select_temp_register(bool& selected_live, Register skip_reg1 = noreg, Register skip_reg2 = noreg);
172
173 void maybe_far_jump_if_zero(MacroAssembler& masm, Register reg);
174
175 void enter_if_gc_state(MacroAssembler& masm, const char test_state, Register tmp);
176
177 void keepalive(MacroAssembler& masm, Label* L_done);
178 void lrb(MacroAssembler& masm);
179
180 static void cardtable(MacroAssembler& masm, Address addr, Register tmp1, Register tmp2);
181
182 address keepalive_runtime_entry_addr();
183 address lrb_runtime_entry_addr();
184
185 static ShenandoahBarrierStubC2* create(const MachNode* node, Register obj, Address addr, Register tmp1, Register tmp2, bool narrow, bool do_load);
186 void post_init();
187
188 ShenandoahBarrierStubC2(const MachNode* node, Register obj, Address addr, Register tmp1, Register tmp2, bool narrow, bool do_load) :
189 BarrierStubC2(node),
190 _obj(obj),
191 _addr(addr),
192 _tmp1(tmp1),
193 _tmp2(tmp2),
|
153
154 class ShenandoahBarrierStubC2 : public BarrierStubC2 {
155 Register _obj;
156 Address const _addr;
157 Register const _tmp1;
158 Register const _tmp2;
159 const bool _do_load;
160 const bool _narrow;
161 const bool _needs_load_ref_barrier;
162 const bool _needs_load_ref_weak_barrier;
163 const bool _needs_keep_alive_barrier;
164 bool _needs_far_jump;
165
166 static void register_stub(ShenandoahBarrierStubC2* stub);
167
168 int available_gp_registers();
169 bool is_live_register(Register reg);
170 bool is_special_register(Register reg);
171 Register select_temp_register(bool& selected_live, Register skip_reg1 = noreg, Register skip_reg2 = noreg);
172
173 void maybe_far_jump_if_zero(MacroAssembler& masm, Register reg, Label* L_target);
174
175 void enter_if_gc_state(MacroAssembler& masm, const char test_state, Register tmp);
176
177 void keepalive(MacroAssembler& masm, Label* L_done);
178 void lrb(MacroAssembler& masm);
179
180 static void cardtable(MacroAssembler& masm, Address addr, Register tmp1, Register tmp2);
181
182 address keepalive_runtime_entry_addr();
183 address lrb_runtime_entry_addr();
184
185 static ShenandoahBarrierStubC2* create(const MachNode* node, Register obj, Address addr, Register tmp1, Register tmp2, bool narrow, bool do_load);
186 void post_init();
187
188 ShenandoahBarrierStubC2(const MachNode* node, Register obj, Address addr, Register tmp1, Register tmp2, bool narrow, bool do_load) :
189 BarrierStubC2(node),
190 _obj(obj),
191 _addr(addr),
192 _tmp1(tmp1),
193 _tmp2(tmp2),
|