< prev index next >
src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp
Print this page
@@ -41,10 +41,13 @@
#include "oops/objArrayKlass.hpp"
#include "runtime/sharedRuntime.hpp"
#include "vmreg_aarch64.inline.hpp"
+#if INCLUDE_ALL_GCS
+#include "shenandoahBarrierSetAssembler_aarch64.hpp"
+#endif
#ifndef PRODUCT
#define COMMENT(x) do { __ block_comment(x); } while (0)
#else
#define COMMENT(x)
@@ -1610,33 +1613,59 @@
__ cset(rscratch1, Assembler::NE);
__ membar(__ AnyAny);
}
+// Return 1 in rscratch1 if the CAS fails.
void LIR_Assembler::emit_compare_and_swap(LIR_OpCompareAndSwap* op) {
assert(VM_Version::supports_cx8(), "wrong machine");
Register addr = as_reg(op->addr());
Register newval = as_reg(op->new_value());
Register cmpval = as_reg(op->cmp_value());
Label succeed, fail, around;
+ Register res = op->result_opr()->as_register();
if (op->code() == lir_cas_obj) {
+ assert(op->tmp1()->is_valid(), "must be");
+ Register t1 = op->tmp1()->as_register();
if (UseCompressedOops) {
- Register t1 = op->tmp1()->as_register();
- assert(op->tmp1()->is_valid(), "must be");
- __ encode_heap_oop(t1, cmpval);
- cmpval = t1;
- __ encode_heap_oop(rscratch2, newval);
- newval = rscratch2;
- casw(addr, newval, cmpval);
+#if INCLUDE_ALL_GCS
+ if (UseShenandoahGC && ShenandoahCASBarrier) {
+ __ encode_heap_oop(t1, cmpval);
+ cmpval = t1;
+ assert(op->tmp2()->is_valid(), "must be");
+ Register t2 = op->tmp2()->as_register();
+ __ encode_heap_oop(t2, newval);
+ newval = t2;
+ ShenandoahBarrierSetAssembler::bsasm()->cmpxchg_oop(_masm, addr, cmpval, newval, /*acquire*/ false, /*release*/ true, /*weak*/ false, /*is_cae*/ false, res);
+ } else
+#endif
+ {
+ __ encode_heap_oop(t1, cmpval);
+ cmpval = t1;
+ __ encode_heap_oop(rscratch2, newval);
+ newval = rscratch2;
+ casw(addr, newval, cmpval);
+ __ eorw (res, r8, 1);
+ }
} else {
- casl(addr, newval, cmpval);
+#if INCLUDE_ALL_GCS
+ if (UseShenandoahGC && ShenandoahCASBarrier) {
+ ShenandoahBarrierSetAssembler::bsasm()->cmpxchg_oop(_masm, addr, cmpval, newval, /*acquire*/ false, /*release*/ true, /*weak*/ false, /*is_cae*/ false, res);
+ } else
+#endif
+ {
+ casl(addr, newval, cmpval);
+ __ eorw (res, r8, 1);
+ }
}
} else if (op->code() == lir_cas_int) {
casw(addr, newval, cmpval);
+ __ eorw (res, r8, 1);
} else {
casl(addr, newval, cmpval);
+ __ eorw (res, r8, 1);
}
}
void LIR_Assembler::cmove(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, BasicType type) {
@@ -2877,11 +2906,18 @@
__ fnegd(dest->as_double_reg(), left->as_double_reg());
}
}
-void LIR_Assembler::leal(LIR_Opr addr, LIR_Opr dest) {
+void LIR_Assembler::leal(LIR_Opr addr, LIR_Opr dest, LIR_PatchCode patch_code, CodeEmitInfo* info) {
+#if INCLUDE_ALL_GCS
+ if (UseShenandoahGC && patch_code != lir_patch_none) {
+ deoptimize_trap(info);
+ return;
+ }
+#endif
+
__ lea(dest->as_register_lo(), as_Address(addr->as_address_ptr()));
}
void LIR_Assembler::rt_call(LIR_Opr result, address dest, const LIR_OprList* args, LIR_Opr tmp, CodeEmitInfo* info) {
< prev index next >