8343541: C1: Plain memory accesses are emitted with membars with +AlwaysAtomicAccesses
Reviewed-by: shade, vlivanov
This commit is contained in:
parent
3a4a9b7af7
commit
afee7405bd
@ -140,7 +140,8 @@ LIR_Opr BarrierSetC1::atomic_add_at(LIRAccess& access, LIRItem& value) {
|
|||||||
|
|
||||||
void BarrierSetC1::store_at_resolved(LIRAccess& access, LIR_Opr value) {
|
void BarrierSetC1::store_at_resolved(LIRAccess& access, LIR_Opr value) {
|
||||||
DecoratorSet decorators = access.decorators();
|
DecoratorSet decorators = access.decorators();
|
||||||
bool is_volatile = (((decorators & MO_SEQ_CST) != 0) || AlwaysAtomicAccesses);
|
bool is_volatile = (decorators & MO_SEQ_CST) != 0;
|
||||||
|
bool is_atomic = is_volatile || AlwaysAtomicAccesses;
|
||||||
bool needs_patching = (decorators & C1_NEEDS_PATCHING) != 0;
|
bool needs_patching = (decorators & C1_NEEDS_PATCHING) != 0;
|
||||||
bool mask_boolean = (decorators & C1_MASK_BOOLEAN) != 0;
|
bool mask_boolean = (decorators & C1_MASK_BOOLEAN) != 0;
|
||||||
LIRGenerator* gen = access.gen();
|
LIRGenerator* gen = access.gen();
|
||||||
@ -154,7 +155,7 @@ void BarrierSetC1::store_at_resolved(LIRAccess& access, LIR_Opr value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
LIR_PatchCode patch_code = needs_patching ? lir_patch_normal : lir_patch_none;
|
LIR_PatchCode patch_code = needs_patching ? lir_patch_normal : lir_patch_none;
|
||||||
if (is_volatile && !needs_patching) {
|
if (is_atomic && !needs_patching) {
|
||||||
gen->volatile_field_store(value, access.resolved_addr()->as_address_ptr(), access.access_emit_info());
|
gen->volatile_field_store(value, access.resolved_addr()->as_address_ptr(), access.access_emit_info());
|
||||||
} else {
|
} else {
|
||||||
__ store(value, access.resolved_addr()->as_address_ptr(), access.access_emit_info(), patch_code);
|
__ store(value, access.resolved_addr()->as_address_ptr(), access.access_emit_info(), patch_code);
|
||||||
@ -168,7 +169,8 @@ void BarrierSetC1::store_at_resolved(LIRAccess& access, LIR_Opr value) {
|
|||||||
void BarrierSetC1::load_at_resolved(LIRAccess& access, LIR_Opr result) {
|
void BarrierSetC1::load_at_resolved(LIRAccess& access, LIR_Opr result) {
|
||||||
LIRGenerator *gen = access.gen();
|
LIRGenerator *gen = access.gen();
|
||||||
DecoratorSet decorators = access.decorators();
|
DecoratorSet decorators = access.decorators();
|
||||||
bool is_volatile = (((decorators & MO_SEQ_CST) != 0) || AlwaysAtomicAccesses);
|
bool is_volatile = (decorators & MO_SEQ_CST) != 0;
|
||||||
|
bool is_atomic = is_volatile || AlwaysAtomicAccesses;
|
||||||
bool needs_patching = (decorators & C1_NEEDS_PATCHING) != 0;
|
bool needs_patching = (decorators & C1_NEEDS_PATCHING) != 0;
|
||||||
bool mask_boolean = (decorators & C1_MASK_BOOLEAN) != 0;
|
bool mask_boolean = (decorators & C1_MASK_BOOLEAN) != 0;
|
||||||
bool in_native = (decorators & IN_NATIVE) != 0;
|
bool in_native = (decorators & IN_NATIVE) != 0;
|
||||||
@ -180,7 +182,7 @@ void BarrierSetC1::load_at_resolved(LIRAccess& access, LIR_Opr result) {
|
|||||||
LIR_PatchCode patch_code = needs_patching ? lir_patch_normal : lir_patch_none;
|
LIR_PatchCode patch_code = needs_patching ? lir_patch_normal : lir_patch_none;
|
||||||
if (in_native) {
|
if (in_native) {
|
||||||
__ move_wide(access.resolved_addr()->as_address_ptr(), result);
|
__ move_wide(access.resolved_addr()->as_address_ptr(), result);
|
||||||
} else if (is_volatile && !needs_patching) {
|
} else if (is_atomic && !needs_patching) {
|
||||||
gen->volatile_field_load(access.resolved_addr()->as_address_ptr(), result, access.access_emit_info());
|
gen->volatile_field_load(access.resolved_addr()->as_address_ptr(), result, access.access_emit_info());
|
||||||
} else {
|
} else {
|
||||||
__ load(access.resolved_addr()->as_address_ptr(), result, access.access_emit_info(), patch_code);
|
__ load(access.resolved_addr()->as_address_ptr(), result, access.access_emit_info(), patch_code);
|
||||||
|
Loading…
Reference in New Issue
Block a user