< prev index next >
src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp
Print this page
*** 41,50 ****
--- 41,53 ----
#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,1642 ****
__ cset(rscratch1, Assembler::NE);
__ membar(__ AnyAny);
}
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;
if (op->code() == lir_cas_obj) {
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);
} else {
! casl(addr, newval, cmpval);
}
} else if (op->code() == lir_cas_int) {
casw(addr, newval, cmpval);
} else {
casl(addr, newval, cmpval);
}
}
void LIR_Assembler::cmove(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, BasicType type) {
--- 1613,1671 ----
__ 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) {
! #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 {
! #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,2887 ****
__ fnegd(dest->as_double_reg(), left->as_double_reg());
}
}
! void LIR_Assembler::leal(LIR_Opr addr, LIR_Opr dest) {
__ 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) {
--- 2906,2923 ----
__ fnegd(dest->as_double_reg(), left->as_double_reg());
}
}
! 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 >