8338814: [PPC64] Unify interface of cmpxchg for different types
Reviewed-by: lucy
This commit is contained in:
parent
aefdbdc7e5
commit
2edf574f62
@ -292,31 +292,54 @@ void Assembler::stb(Register d, RegisterOrConstant roc, Register s1, Register tm
|
||||
}
|
||||
}
|
||||
|
||||
void Assembler::add(Register d, RegisterOrConstant roc, Register s1) {
|
||||
void Assembler::add(Register d, Register s, RegisterOrConstant roc) {
|
||||
if (roc.is_constant()) {
|
||||
intptr_t c = roc.as_constant();
|
||||
assert(is_simm(c, 16), "too big");
|
||||
addi(d, s1, (int)c);
|
||||
addi(d, s, (int)c);
|
||||
} else {
|
||||
add(d, s, roc.as_register());
|
||||
}
|
||||
else add(d, roc.as_register(), s1);
|
||||
}
|
||||
|
||||
void Assembler::subf(Register d, RegisterOrConstant roc, Register s1) {
|
||||
void Assembler::sub(Register d, Register s, RegisterOrConstant roc) {
|
||||
if (roc.is_constant()) {
|
||||
intptr_t c = roc.as_constant();
|
||||
assert(is_simm(-c, 16), "too big");
|
||||
addi(d, s1, (int)-c);
|
||||
addi(d, s, (int)-c);
|
||||
} else {
|
||||
sub(d, s, roc.as_register());
|
||||
}
|
||||
else subf(d, roc.as_register(), s1);
|
||||
}
|
||||
|
||||
void Assembler::cmpd(ConditionRegister d, RegisterOrConstant roc, Register s1) {
|
||||
void Assembler::xorr(Register d, Register s, RegisterOrConstant roc) {
|
||||
if (roc.is_constant()) {
|
||||
intptr_t c = roc.as_constant();
|
||||
assert(is_uimm(c, 16), "too big");
|
||||
xori(d, s, (int)c);
|
||||
} else {
|
||||
xorr(d, s, roc.as_register());
|
||||
}
|
||||
}
|
||||
|
||||
void Assembler::cmpw(ConditionRegister d, Register s, RegisterOrConstant roc) {
|
||||
if (roc.is_constant()) {
|
||||
intptr_t c = roc.as_constant();
|
||||
assert(is_simm(c, 16), "too big");
|
||||
cmpdi(d, s1, (int)c);
|
||||
cmpwi(d, s, (int)c);
|
||||
} else {
|
||||
cmpw(d, s, roc.as_register());
|
||||
}
|
||||
}
|
||||
|
||||
void Assembler::cmpd(ConditionRegister d, Register s, RegisterOrConstant roc) {
|
||||
if (roc.is_constant()) {
|
||||
intptr_t c = roc.as_constant();
|
||||
assert(is_simm(c, 16), "too big");
|
||||
cmpdi(d, s, (int)c);
|
||||
} else {
|
||||
cmpd(d, s, roc.as_register());
|
||||
}
|
||||
else cmpd(d, roc.as_register(), s1);
|
||||
}
|
||||
|
||||
// Load a 64 bit constant. Patchable.
|
||||
|
@ -2512,9 +2512,13 @@ class Assembler : public AbstractAssembler {
|
||||
void stw( Register d, RegisterOrConstant roc, Register s1 = noreg, Register tmp = noreg);
|
||||
void sth( Register d, RegisterOrConstant roc, Register s1 = noreg, Register tmp = noreg);
|
||||
void stb( Register d, RegisterOrConstant roc, Register s1 = noreg, Register tmp = noreg);
|
||||
void add( Register d, RegisterOrConstant roc, Register s1);
|
||||
void subf(Register d, RegisterOrConstant roc, Register s1);
|
||||
void cmpd(ConditionRegister d, RegisterOrConstant roc, Register s1);
|
||||
void add( Register d, Register s, RegisterOrConstant roc);
|
||||
void add( Register d, RegisterOrConstant roc, Register s) { add(d, s, roc); }
|
||||
void sub( Register d, Register s, RegisterOrConstant roc);
|
||||
void xorr(Register d, Register s, RegisterOrConstant roc);
|
||||
void xorr(Register d, RegisterOrConstant roc, Register s) { xorr(d, s, roc); }
|
||||
void cmpw(ConditionRegister d, Register s, RegisterOrConstant roc);
|
||||
void cmpd(ConditionRegister d, Register s, RegisterOrConstant roc);
|
||||
// Load pointer d from s1+roc.
|
||||
void ld_ptr(Register d, RegisterOrConstant roc, Register s1 = noreg) { ld(d, roc, s1); }
|
||||
|
||||
|
@ -2620,7 +2620,7 @@ void LIR_Assembler::emit_compare_and_swap(LIR_OpCompareAndSwap* op) {
|
||||
__ cmpxchgw(BOOL_RESULT, /*current_value=*/R0, cmp_value, new_value, addr,
|
||||
MacroAssembler::MemBarNone,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, /*check without ldarx first*/true);
|
||||
noreg, nullptr, /*check without ldarx first*/true);
|
||||
}
|
||||
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
|
@ -669,7 +669,7 @@ void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler *masm, Register b
|
||||
// no special processing is required.
|
||||
if (UseCompressedOops) {
|
||||
__ cmpxchgw(CCR0, current_value, expected, new_val, base_addr, MacroAssembler::MemBarNone,
|
||||
false, success_flag, true);
|
||||
false, success_flag, nullptr, true);
|
||||
} else {
|
||||
__ cmpxchgd(CCR0, current_value, expected, new_val, base_addr, MacroAssembler::MemBarNone,
|
||||
false, success_flag, nullptr, true);
|
||||
|
@ -335,7 +335,7 @@ void ZBarrierSetAssembler::store_barrier_medium(MacroAssembler* masm,
|
||||
// Try to self-heal null values for atomic accesses
|
||||
bool need_restore = false;
|
||||
if (!ind_or_offs.is_constant() || ind_or_offs.as_constant() != 0) {
|
||||
__ add(ref_base, ind_or_offs, ref_base);
|
||||
__ add(ref_base, ref_base, ind_or_offs);
|
||||
need_restore = true;
|
||||
}
|
||||
__ ld(R0, in_bytes(ZThreadLocalData::store_good_mask_offset()), R16_thread);
|
||||
@ -343,7 +343,7 @@ void ZBarrierSetAssembler::store_barrier_medium(MacroAssembler* masm,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, need_restore ? nullptr : &slow_path);
|
||||
if (need_restore) {
|
||||
__ subf(ref_base, ind_or_offs, ref_base);
|
||||
__ sub(ref_base, ref_base, ind_or_offs);
|
||||
__ bne(CCR0, slow_path);
|
||||
}
|
||||
} else {
|
||||
|
@ -1620,7 +1620,7 @@ void MacroAssembler::atomic_get_and_modify_generic(Register dest_current_value,
|
||||
// Temps, addr_base and exchange_value are killed if size < 4 and processor does not support respective instructions.
|
||||
// Only signed types are supported with size < 4.
|
||||
void MacroAssembler::cmpxchg_loop_body(ConditionRegister flag, Register dest_current_value,
|
||||
Register compare_value, Register exchange_value,
|
||||
RegisterOrConstant compare_value, Register exchange_value,
|
||||
Register addr_base, Register tmp1, Register tmp2,
|
||||
Label &retry, Label &failed, bool cmpxchgx_hint, int size) {
|
||||
// Sub-word instructions are available since Power 8.
|
||||
@ -1634,7 +1634,7 @@ void MacroAssembler::cmpxchg_loop_body(ConditionRegister flag, Register dest_cur
|
||||
modval = exchange_value;
|
||||
|
||||
if (instruction_type != size) {
|
||||
assert_different_registers(tmp1, tmp2, dest_current_value, compare_value, exchange_value, addr_base);
|
||||
assert_different_registers(tmp1, tmp2, dest_current_value, compare_value.register_or_noreg(), exchange_value, addr_base);
|
||||
shift_amount = tmp1;
|
||||
val32 = tmp2;
|
||||
modval = tmp2;
|
||||
@ -1695,21 +1695,23 @@ void MacroAssembler::cmpxchg_loop_body(ConditionRegister flag, Register dest_cur
|
||||
|
||||
// CmpxchgX sets condition register to cmpX(current, compare).
|
||||
void MacroAssembler::cmpxchg_generic(ConditionRegister flag, Register dest_current_value,
|
||||
Register compare_value, Register exchange_value,
|
||||
RegisterOrConstant compare_value, Register exchange_value,
|
||||
Register addr_base, Register tmp1, Register tmp2,
|
||||
int semantics, bool cmpxchgx_hint,
|
||||
Register int_flag_success, bool contention_hint, bool weak, int size) {
|
||||
int semantics, bool cmpxchgx_hint, Register int_flag_success,
|
||||
Label* failed_ext, bool contention_hint, bool weak, int size) {
|
||||
Label retry;
|
||||
Label failed;
|
||||
Label failed_int;
|
||||
Label& failed = (failed_ext != nullptr) ? *failed_ext : failed_int;
|
||||
Label done;
|
||||
|
||||
// Save one branch if result is returned via register and
|
||||
// result register is different from the other ones.
|
||||
bool use_result_reg = (int_flag_success != noreg);
|
||||
bool preset_result_reg = (int_flag_success != dest_current_value && int_flag_success != compare_value &&
|
||||
bool preset_result_reg = (int_flag_success != dest_current_value && int_flag_success != compare_value.register_or_noreg() &&
|
||||
int_flag_success != exchange_value && int_flag_success != addr_base &&
|
||||
int_flag_success != tmp1 && int_flag_success != tmp2);
|
||||
assert(!weak || flag == CCR0, "weak only supported with CCR0");
|
||||
assert(int_flag_success == noreg || failed_ext == nullptr, "cannot have both");
|
||||
assert(size == 1 || size == 2 || size == 4, "unsupported");
|
||||
|
||||
if (use_result_reg && preset_result_reg) {
|
||||
@ -1760,7 +1762,7 @@ void MacroAssembler::cmpxchg_generic(ConditionRegister flag, Register dest_curre
|
||||
b(done);
|
||||
}
|
||||
|
||||
bind(failed);
|
||||
bind(failed_int);
|
||||
if (use_result_reg && !preset_result_reg) {
|
||||
li(int_flag_success, 0);
|
||||
}
|
||||
@ -1787,10 +1789,11 @@ void MacroAssembler::cmpxchg_generic(ConditionRegister flag, Register dest_curre
|
||||
// To avoid the costly compare exchange the value is tested beforehand.
|
||||
// Several special cases exist to avoid that unnecessary information is generated.
|
||||
//
|
||||
void MacroAssembler::cmpxchgd(ConditionRegister flag,
|
||||
Register dest_current_value, RegisterOrConstant compare_value, Register exchange_value,
|
||||
Register addr_base, int semantics, bool cmpxchgx_hint,
|
||||
Register int_flag_success, Label* failed_ext, bool contention_hint, bool weak) {
|
||||
void MacroAssembler::cmpxchgd(ConditionRegister flag, Register dest_current_value,
|
||||
RegisterOrConstant compare_value, Register exchange_value,
|
||||
Register addr_base,
|
||||
int semantics, bool cmpxchgx_hint, Register int_flag_success,
|
||||
Label* failed_ext, bool contention_hint, bool weak) {
|
||||
Label retry;
|
||||
Label failed_int;
|
||||
Label& failed = (failed_ext != nullptr) ? *failed_ext : failed_int;
|
||||
@ -1810,7 +1813,7 @@ void MacroAssembler::cmpxchgd(ConditionRegister flag,
|
||||
// Add simple guard in order to reduce risk of starving under high contention (recommended by IBM).
|
||||
if (contention_hint) { // Don't try to reserve if cmp fails.
|
||||
ld(dest_current_value, 0, addr_base);
|
||||
cmpd(flag, compare_value, dest_current_value);
|
||||
cmpd(flag, dest_current_value, compare_value);
|
||||
bne(flag, failed);
|
||||
}
|
||||
|
||||
@ -1823,7 +1826,7 @@ void MacroAssembler::cmpxchgd(ConditionRegister flag,
|
||||
bind(retry);
|
||||
|
||||
ldarx(dest_current_value, addr_base, cmpxchgx_hint);
|
||||
cmpd(flag, compare_value, dest_current_value);
|
||||
cmpd(flag, dest_current_value, compare_value);
|
||||
if (UseStaticBranchPredictionInCompareAndSwapPPC64) {
|
||||
bne_predict_not_taken(flag, failed);
|
||||
} else {
|
||||
|
@ -482,13 +482,14 @@ class MacroAssembler: public Assembler {
|
||||
Register addr_base, Register tmp1, Register tmp2, Register tmp3,
|
||||
bool cmpxchgx_hint, bool is_add, int size);
|
||||
void cmpxchg_loop_body(ConditionRegister flag, Register dest_current_value,
|
||||
Register compare_value, Register exchange_value,
|
||||
RegisterOrConstant compare_value, Register exchange_value,
|
||||
Register addr_base, Register tmp1, Register tmp2,
|
||||
Label &retry, Label &failed, bool cmpxchgx_hint, int size);
|
||||
void cmpxchg_generic(ConditionRegister flag,
|
||||
Register dest_current_value, Register compare_value, Register exchange_value, Register addr_base,
|
||||
Register tmp1, Register tmp2,
|
||||
int semantics, bool cmpxchgx_hint, Register int_flag_success, bool contention_hint, bool weak, int size);
|
||||
void cmpxchg_generic(ConditionRegister flag, Register dest_current_value,
|
||||
RegisterOrConstant compare_value, Register exchange_value,
|
||||
Register addr_base, Register tmp1, Register tmp2,
|
||||
int semantics, bool cmpxchgx_hint, Register int_flag_success,
|
||||
Label* failed_ext, bool contention_hint, bool weak, int size);
|
||||
public:
|
||||
// Temps and addr_base are killed if processor does not support Power 8 instructions.
|
||||
// Result will be sign extended.
|
||||
@ -528,33 +529,37 @@ class MacroAssembler: public Assembler {
|
||||
Register tmp, bool cmpxchgx_hint);
|
||||
// Temps, addr_base and exchange_value are killed if processor does not support Power 8 instructions.
|
||||
// compare_value must be at least 32 bit sign extended. Result will be sign extended.
|
||||
void cmpxchgb(ConditionRegister flag,
|
||||
Register dest_current_value, Register compare_value, Register exchange_value, Register addr_base,
|
||||
Register tmp1, Register tmp2, int semantics, bool cmpxchgx_hint = false,
|
||||
Register int_flag_success = noreg, bool contention_hint = false, bool weak = false) {
|
||||
void cmpxchgb(ConditionRegister flag, Register dest_current_value,
|
||||
RegisterOrConstant compare_value, Register exchange_value,
|
||||
Register addr_base, Register tmp1, Register tmp2,
|
||||
int semantics, bool cmpxchgx_hint = false, Register int_flag_success = noreg,
|
||||
Label* failed = nullptr, bool contention_hint = false, bool weak = false) {
|
||||
cmpxchg_generic(flag, dest_current_value, compare_value, exchange_value, addr_base, tmp1, tmp2,
|
||||
semantics, cmpxchgx_hint, int_flag_success, contention_hint, weak, 1);
|
||||
semantics, cmpxchgx_hint, int_flag_success, failed, contention_hint, weak, 1);
|
||||
}
|
||||
// Temps, addr_base and exchange_value are killed if processor does not support Power 8 instructions.
|
||||
// compare_value must be at least 32 bit sign extended. Result will be sign extended.
|
||||
void cmpxchgh(ConditionRegister flag,
|
||||
Register dest_current_value, Register compare_value, Register exchange_value, Register addr_base,
|
||||
Register tmp1, Register tmp2, int semantics, bool cmpxchgx_hint = false,
|
||||
Register int_flag_success = noreg, bool contention_hint = false, bool weak = false) {
|
||||
void cmpxchgh(ConditionRegister flag, Register dest_current_value,
|
||||
RegisterOrConstant compare_value, Register exchange_value,
|
||||
Register addr_base, Register tmp1, Register tmp2,
|
||||
int semantics, bool cmpxchgx_hint = false, Register int_flag_success = noreg,
|
||||
Label* failed = nullptr, bool contention_hint = false, bool weak = false) {
|
||||
cmpxchg_generic(flag, dest_current_value, compare_value, exchange_value, addr_base, tmp1, tmp2,
|
||||
semantics, cmpxchgx_hint, int_flag_success, contention_hint, weak, 2);
|
||||
semantics, cmpxchgx_hint, int_flag_success, failed, contention_hint, weak, 2);
|
||||
}
|
||||
void cmpxchgw(ConditionRegister flag,
|
||||
Register dest_current_value, Register compare_value, Register exchange_value, Register addr_base,
|
||||
int semantics, bool cmpxchgx_hint = false,
|
||||
Register int_flag_success = noreg, bool contention_hint = false, bool weak = false) {
|
||||
void cmpxchgw(ConditionRegister flag, Register dest_current_value,
|
||||
RegisterOrConstant compare_value, Register exchange_value,
|
||||
Register addr_base,
|
||||
int semantics, bool cmpxchgx_hint = false, Register int_flag_success = noreg,
|
||||
Label* failed = nullptr, bool contention_hint = false, bool weak = false) {
|
||||
cmpxchg_generic(flag, dest_current_value, compare_value, exchange_value, addr_base, noreg, noreg,
|
||||
semantics, cmpxchgx_hint, int_flag_success, contention_hint, weak, 4);
|
||||
semantics, cmpxchgx_hint, int_flag_success, failed, contention_hint, weak, 4);
|
||||
}
|
||||
void cmpxchgd(ConditionRegister flag,
|
||||
Register dest_current_value, RegisterOrConstant compare_value, Register exchange_value,
|
||||
Register addr_base, int semantics, bool cmpxchgx_hint = false,
|
||||
Register int_flag_success = noreg, Label* failed = nullptr, bool contention_hint = false, bool weak = false);
|
||||
void cmpxchgd(ConditionRegister flag, Register dest_current_value,
|
||||
RegisterOrConstant compare_value, Register exchange_value,
|
||||
Register addr_base,
|
||||
int semantics, bool cmpxchgx_hint = false, Register int_flag_success = noreg,
|
||||
Label* failed = nullptr, bool contention_hint = false, bool weak = false);
|
||||
|
||||
// interface method calling
|
||||
void lookup_interface_method(Register recv_klass,
|
||||
|
@ -7390,7 +7390,7 @@ instruct compareAndSwapB_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr, iRegIsrc
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgb(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, noreg, noreg,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
$res$$Register, true);
|
||||
$res$$Register, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
@ -7409,7 +7409,7 @@ instruct compareAndSwapB4_regP_regI_regI(iRegIdst res, rarg3RegP mem_ptr, iRegIs
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgb(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, $tmp1$$Register, $tmp2$$Register,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
$res$$Register, true);
|
||||
$res$$Register, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
@ -7428,7 +7428,7 @@ instruct compareAndSwapS_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr, iRegIsrc
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgh(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, noreg, noreg,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
$res$$Register, true);
|
||||
$res$$Register, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
@ -7447,7 +7447,7 @@ instruct compareAndSwapS4_regP_regI_regI(iRegIdst res, rarg3RegP mem_ptr, iRegIs
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgh(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, $tmp1$$Register, $tmp2$$Register,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
$res$$Register, true);
|
||||
$res$$Register, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
@ -7465,7 +7465,7 @@ instruct compareAndSwapI_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr, iRegIsrc
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgw(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
$res$$Register, true);
|
||||
$res$$Register, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
@ -7483,7 +7483,7 @@ instruct compareAndSwapN_regP_regN_regN(iRegIdst res, iRegPdst mem_ptr, iRegNsrc
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgw(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
$res$$Register, true);
|
||||
$res$$Register, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
@ -7541,7 +7541,7 @@ instruct weakCompareAndSwapB_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr, iReg
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgb(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, noreg, noreg,
|
||||
MacroAssembler::MemBarNone,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7555,7 +7555,7 @@ instruct weakCompareAndSwapB4_regP_regI_regI(iRegIdst res, rarg3RegP mem_ptr, iR
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgb(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, $tmp1$$Register, $tmp2$$Register,
|
||||
MacroAssembler::MemBarNone,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7569,7 +7569,7 @@ instruct weakCompareAndSwapB_acq_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr,
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgb(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, noreg, noreg,
|
||||
support_IRIW_for_not_multiple_copy_atomic_cpu ? MacroAssembler::MemBarAcq : MacroAssembler::MemBarFenceAfter,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7583,7 +7583,7 @@ instruct weakCompareAndSwapB4_acq_regP_regI_regI(iRegIdst res, rarg3RegP mem_ptr
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgb(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, $tmp1$$Register, $tmp2$$Register,
|
||||
support_IRIW_for_not_multiple_copy_atomic_cpu ? MacroAssembler::MemBarAcq : MacroAssembler::MemBarFenceAfter,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7597,7 +7597,7 @@ instruct weakCompareAndSwapS_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr, iReg
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgh(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, noreg, noreg,
|
||||
MacroAssembler::MemBarNone,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7611,7 +7611,7 @@ instruct weakCompareAndSwapS4_regP_regI_regI(iRegIdst res, rarg3RegP mem_ptr, iR
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgh(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, $tmp1$$Register, $tmp2$$Register,
|
||||
MacroAssembler::MemBarNone,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7625,7 +7625,7 @@ instruct weakCompareAndSwapS_acq_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr,
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgh(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, noreg, noreg,
|
||||
support_IRIW_for_not_multiple_copy_atomic_cpu ? MacroAssembler::MemBarAcq : MacroAssembler::MemBarFenceAfter,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7639,7 +7639,7 @@ instruct weakCompareAndSwapS4_acq_regP_regI_regI(iRegIdst res, rarg3RegP mem_ptr
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgh(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, $tmp1$$Register, $tmp2$$Register,
|
||||
support_IRIW_for_not_multiple_copy_atomic_cpu ? MacroAssembler::MemBarAcq : MacroAssembler::MemBarFenceAfter,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7653,7 +7653,7 @@ instruct weakCompareAndSwapI_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr, iReg
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgw(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7669,7 +7669,7 @@ instruct weakCompareAndSwapI_acq_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr,
|
||||
// value is never passed to caller.
|
||||
__ cmpxchgw(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
support_IRIW_for_not_multiple_copy_atomic_cpu ? MacroAssembler::MemBarAcq : MacroAssembler::MemBarFenceAfter,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7683,7 +7683,7 @@ instruct weakCompareAndSwapN_regP_regN_regN(iRegIdst res, iRegPdst mem_ptr, iReg
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgw(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7699,7 +7699,7 @@ instruct weakCompareAndSwapN_acq_regP_regN_regN(iRegIdst res, iRegPdst mem_ptr,
|
||||
// value is never passed to caller.
|
||||
__ cmpxchgw(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
support_IRIW_for_not_multiple_copy_atomic_cpu ? MacroAssembler::MemBarAcq : MacroAssembler::MemBarFenceAfter,
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, true, /*weak*/ true);
|
||||
MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, nullptr, true, /*weak*/ true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7776,7 +7776,7 @@ instruct compareAndExchangeB_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr, iReg
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgb(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register, noreg, noreg,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, true);
|
||||
noreg, nullptr, true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7790,7 +7790,7 @@ instruct compareAndExchangeB4_regP_regI_regI(iRegIdst res, rarg3RegP mem_ptr, iR
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgb(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register, $tmp1$$Register, R0,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, true);
|
||||
noreg, nullptr, true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7804,7 +7804,7 @@ instruct compareAndExchangeB_acq_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr,
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgb(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register, noreg, noreg,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, true);
|
||||
noreg, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
@ -7824,7 +7824,7 @@ instruct compareAndExchangeB4_acq_regP_regI_regI(iRegIdst res, rarg3RegP mem_ptr
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgb(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register, $tmp1$$Register, R0,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, true);
|
||||
noreg, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
@ -7844,7 +7844,7 @@ instruct compareAndExchangeS_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr, iReg
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgh(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register, noreg, noreg,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, true);
|
||||
noreg, nullptr, true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7858,7 +7858,7 @@ instruct compareAndExchangeS4_regP_regI_regI(iRegIdst res, rarg3RegP mem_ptr, iR
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgh(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register, $tmp1$$Register, R0,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, true);
|
||||
noreg, nullptr, true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7872,7 +7872,7 @@ instruct compareAndExchangeS_acq_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr,
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgh(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register, noreg, noreg,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, true);
|
||||
noreg, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
@ -7892,7 +7892,7 @@ instruct compareAndExchangeS4_acq_regP_regI_regI(iRegIdst res, rarg3RegP mem_ptr
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgh(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register, $tmp1$$Register, R0,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, true);
|
||||
noreg, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
@ -7912,7 +7912,7 @@ instruct compareAndExchangeI_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr, iReg
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgw(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, true);
|
||||
noreg, nullptr, true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7926,7 +7926,7 @@ instruct compareAndExchangeI_acq_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr,
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgw(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, true);
|
||||
noreg, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
@ -7946,7 +7946,7 @@ instruct compareAndExchangeN_regP_regN_regN(iRegNdst res, iRegPdst mem_ptr, iReg
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgw(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, true);
|
||||
noreg, nullptr, true);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
@ -7960,7 +7960,7 @@ instruct compareAndExchangeN_acq_regP_regN_regN(iRegNdst res, iRegPdst mem_ptr,
|
||||
// CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'.
|
||||
__ cmpxchgw(CCR0, $res$$Register, $src1$$Register, $src2$$Register, $mem_ptr$$Register,
|
||||
MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
|
||||
noreg, true);
|
||||
noreg, nullptr, true);
|
||||
if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ isync();
|
||||
} else {
|
||||
|
@ -195,7 +195,7 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
#ifndef PRODUCT
|
||||
if (DebugVtables) {
|
||||
Label ok;
|
||||
__ cmpd(CCR0, R19_method, 0);
|
||||
__ cmpdi(CCR0, R19_method, 0);
|
||||
__ bne(CCR0, ok);
|
||||
__ stop("method is null");
|
||||
__ bind(ok);
|
||||
|
Loading…
x
Reference in New Issue
Block a user