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