equal
deleted
inserted
replaced
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) { |