< prev index next >
src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.hpp
Print this page
rev 51517 : 8207169: X86: Modularize cmpxchg-oop assembler for C1 and C2
*** 36,45 ****
--- 36,54 ----
void incr_allocated_bytes(MacroAssembler* masm, Register thread,
Register var_size_in_bytes,
int con_size_in_bytes,
Register t1);
+ protected:
+ // Atomically store newval into addr, if addr currently contains oldval.
+ // - exchange: if true, the previous value is returned in oldval, res is expected to be noreg
+ // - expect_null: if true, oldval is known to be NULL, might allow for optimizations
+ virtual void cmpxchg_oop(MacroAssembler* masm,
+ Address addr, Register oldval, Register newval,
+ Register tmp1, Register tmp2,
+ bool narrow);
+
public:
virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
Register src, Register dst, Register count) {}
virtual void arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
Register src, Register dst, Register count) {}
*** 47,56 ****
--- 56,78 ----
virtual void load_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
Register dst, Address src, Register tmp1, Register tmp_thread);
virtual void store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
Address dst, Register val, Register tmp1, Register tmp2);
+ virtual bool handle_cmpxchg_oop() const { return BarrierSetAlwaysHandlesCmpxchg; }
+
+ // Atomically store newval into addr, if addr currently contains oldval.
+ // This version is intended for use by C1 assembler, and encodes uncompressed
+ // oops if necessary.
+ virtual void cmpxchg_oop_c1(MacroAssembler* masm, Address addr, Register oldval, Register newval,
+ Register tmp1, Register tmp2);
+
+ virtual void cmpxchg_oop_c2(MacroAssembler* masm,
+ Register res, Address addr, Register oldval, Register newval,
+ Register tmp1, Register tmp2,
+ bool narrow, bool exchange, bool expect_null);
+
#ifndef _LP64
virtual void obj_equals(MacroAssembler* masm,
Address obj1, jobject obj2);
virtual void obj_equals(MacroAssembler* masm,
Register obj1, jobject obj2);
< prev index next >