src/hotspot/share/gc/shared/c1/barrierSetC1.cpp
changeset 51996 84743156e780
parent 51983 2a12a3865916
child 53529 37c8fcc76699
equal deleted inserted replaced
51995:f7babf9d1592 51996:84743156e780
   133   return atomic_add_at_resolved(access, value);
   133   return atomic_add_at_resolved(access, value);
   134 }
   134 }
   135 
   135 
   136 void BarrierSetC1::store_at_resolved(LIRAccess& access, LIR_Opr value) {
   136 void BarrierSetC1::store_at_resolved(LIRAccess& access, LIR_Opr value) {
   137   DecoratorSet decorators = access.decorators();
   137   DecoratorSet decorators = access.decorators();
   138   bool is_volatile = (((decorators & MO_SEQ_CST) != 0) || AlwaysAtomicAccesses) && os::is_MP();
   138   bool is_volatile = (((decorators & MO_SEQ_CST) != 0) || AlwaysAtomicAccesses);
   139   bool needs_patching = (decorators & C1_NEEDS_PATCHING) != 0;
   139   bool needs_patching = (decorators & C1_NEEDS_PATCHING) != 0;
   140   bool mask_boolean = (decorators & C1_MASK_BOOLEAN) != 0;
   140   bool mask_boolean = (decorators & C1_MASK_BOOLEAN) != 0;
   141   LIRGenerator* gen = access.gen();
   141   LIRGenerator* gen = access.gen();
   142 
   142 
   143   if (mask_boolean) {
   143   if (mask_boolean) {
   144     value = gen->mask_boolean(access.base().opr(), value, access.access_emit_info());
   144     value = gen->mask_boolean(access.base().opr(), value, access.access_emit_info());
   145   }
   145   }
   146 
   146 
   147   if (is_volatile && os::is_MP()) {
   147   if (is_volatile) {
   148     __ membar_release();
   148     __ membar_release();
   149   }
   149   }
   150 
   150 
   151   LIR_PatchCode patch_code = needs_patching ? lir_patch_normal : lir_patch_none;
   151   LIR_PatchCode patch_code = needs_patching ? lir_patch_normal : lir_patch_none;
   152   if (is_volatile && !needs_patching) {
   152   if (is_volatile && !needs_patching) {
   161 }
   161 }
   162 
   162 
   163 void BarrierSetC1::load_at_resolved(LIRAccess& access, LIR_Opr result) {
   163 void BarrierSetC1::load_at_resolved(LIRAccess& access, LIR_Opr result) {
   164   LIRGenerator *gen = access.gen();
   164   LIRGenerator *gen = access.gen();
   165   DecoratorSet decorators = access.decorators();
   165   DecoratorSet decorators = access.decorators();
   166   bool is_volatile = (((decorators & MO_SEQ_CST) != 0) || AlwaysAtomicAccesses) && os::is_MP();
   166   bool is_volatile = (((decorators & MO_SEQ_CST) != 0) || AlwaysAtomicAccesses);
   167   bool needs_patching = (decorators & C1_NEEDS_PATCHING) != 0;
   167   bool needs_patching = (decorators & C1_NEEDS_PATCHING) != 0;
   168   bool mask_boolean = (decorators & C1_MASK_BOOLEAN) != 0;
   168   bool mask_boolean = (decorators & C1_MASK_BOOLEAN) != 0;
   169   bool in_native = (decorators & IN_NATIVE) != 0;
   169   bool in_native = (decorators & IN_NATIVE) != 0;
   170 
   170 
   171   if (support_IRIW_for_not_multiple_copy_atomic_cpu && is_volatile) {
   171   if (support_IRIW_for_not_multiple_copy_atomic_cpu && is_volatile) {
   179     gen->volatile_field_load(access.resolved_addr()->as_address_ptr(), result, access.access_emit_info());
   179     gen->volatile_field_load(access.resolved_addr()->as_address_ptr(), result, access.access_emit_info());
   180   } else {
   180   } else {
   181     __ load(access.resolved_addr()->as_address_ptr(), result, access.access_emit_info(), patch_code);
   181     __ load(access.resolved_addr()->as_address_ptr(), result, access.access_emit_info(), patch_code);
   182   }
   182   }
   183 
   183 
   184   if (is_volatile && os::is_MP()) {
   184   if (is_volatile) {
   185     __ membar_acquire();
   185     __ membar_acquire();
   186   }
   186   }
   187 
   187 
   188   /* Normalize boolean value returned by unsafe operation, i.e., value  != 0 ? value = true : value false. */
   188   /* Normalize boolean value returned by unsafe operation, i.e., value  != 0 ? value = true : value false. */
   189   if (mask_boolean) {
   189   if (mask_boolean) {