31 #include "gc/shared/barrierSetAssembler.hpp" |
31 #include "gc/shared/barrierSetAssembler.hpp" |
32 #include "gc/shared/collectedHeap.inline.hpp" |
32 #include "gc/shared/collectedHeap.inline.hpp" |
33 #include "interpreter/interpreter.hpp" |
33 #include "interpreter/interpreter.hpp" |
34 #include "memory/resourceArea.hpp" |
34 #include "memory/resourceArea.hpp" |
35 #include "memory/universe.hpp" |
35 #include "memory/universe.hpp" |
36 #include "oops/access.hpp" |
36 #include "oops/accessDecorators.hpp" |
37 #include "oops/klass.inline.hpp" |
37 #include "oops/klass.inline.hpp" |
38 #include "prims/methodHandles.hpp" |
38 #include "prims/methodHandles.hpp" |
39 #include "runtime/biasedLocking.hpp" |
39 #include "runtime/biasedLocking.hpp" |
40 #include "runtime/flags/flagSetting.hpp" |
40 #include "runtime/flags/flagSetting.hpp" |
41 #include "runtime/interfaceSupport.inline.hpp" |
41 #include "runtime/interfaceSupport.inline.hpp" |
5257 value, Address(value, -JNIHandles::weak_tag_value), tmp, thread); |
5257 value, Address(value, -JNIHandles::weak_tag_value), tmp, thread); |
5258 verify_oop(value); |
5258 verify_oop(value); |
5259 jmp(done); |
5259 jmp(done); |
5260 bind(not_weak); |
5260 bind(not_weak); |
5261 // Resolve (untagged) jobject. |
5261 // Resolve (untagged) jobject. |
5262 access_load_at(T_OBJECT, IN_ROOT | IN_CONCURRENT_ROOT, |
5262 access_load_at(T_OBJECT, IN_CONCURRENT_ROOT, |
5263 value, Address(value, 0), tmp, thread); |
5263 value, Address(value, 0), tmp, thread); |
5264 verify_oop(value); |
5264 verify_oop(value); |
5265 bind(done); |
5265 bind(done); |
5266 } |
5266 } |
5267 |
5267 |
6279 assert_different_registers(result, tmp); |
6279 assert_different_registers(result, tmp); |
6280 |
6280 |
6281 // Only 64 bit platforms support GCs that require a tmp register |
6281 // Only 64 bit platforms support GCs that require a tmp register |
6282 // Only IN_HEAP loads require a thread_tmp register |
6282 // Only IN_HEAP loads require a thread_tmp register |
6283 // OopHandle::resolve is an indirection like jobject. |
6283 // OopHandle::resolve is an indirection like jobject. |
6284 access_load_at(T_OBJECT, IN_ROOT | IN_CONCURRENT_ROOT, |
6284 access_load_at(T_OBJECT, IN_CONCURRENT_ROOT, |
6285 result, Address(result, 0), tmp, /*tmp_thread*/noreg); |
6285 result, Address(result, 0), tmp, /*tmp_thread*/noreg); |
6286 } |
6286 } |
6287 |
6287 |
6288 void MacroAssembler::load_mirror(Register mirror, Register method, Register tmp) { |
6288 void MacroAssembler::load_mirror(Register mirror, Register method, Register tmp) { |
6289 // get mirror |
6289 // get mirror |
6321 } |
6321 } |
6322 |
6322 |
6323 void MacroAssembler::access_load_at(BasicType type, DecoratorSet decorators, Register dst, Address src, |
6323 void MacroAssembler::access_load_at(BasicType type, DecoratorSet decorators, Register dst, Address src, |
6324 Register tmp1, Register thread_tmp) { |
6324 Register tmp1, Register thread_tmp) { |
6325 BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler(); |
6325 BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler(); |
|
6326 decorators = AccessInternal::decorator_fixup(decorators); |
6326 bool as_raw = (decorators & AS_RAW) != 0; |
6327 bool as_raw = (decorators & AS_RAW) != 0; |
6327 if (as_raw) { |
6328 if (as_raw) { |
6328 bs->BarrierSetAssembler::load_at(this, decorators, type, dst, src, tmp1, thread_tmp); |
6329 bs->BarrierSetAssembler::load_at(this, decorators, type, dst, src, tmp1, thread_tmp); |
6329 } else { |
6330 } else { |
6330 bs->load_at(this, decorators, type, dst, src, tmp1, thread_tmp); |
6331 bs->load_at(this, decorators, type, dst, src, tmp1, thread_tmp); |
6332 } |
6333 } |
6333 |
6334 |
6334 void MacroAssembler::access_store_at(BasicType type, DecoratorSet decorators, Address dst, Register src, |
6335 void MacroAssembler::access_store_at(BasicType type, DecoratorSet decorators, Address dst, Register src, |
6335 Register tmp1, Register tmp2) { |
6336 Register tmp1, Register tmp2) { |
6336 BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler(); |
6337 BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler(); |
|
6338 decorators = AccessInternal::decorator_fixup(decorators); |
6337 bool as_raw = (decorators & AS_RAW) != 0; |
6339 bool as_raw = (decorators & AS_RAW) != 0; |
6338 if (as_raw) { |
6340 if (as_raw) { |
6339 bs->BarrierSetAssembler::store_at(this, decorators, type, dst, src, tmp1, tmp2); |
6341 bs->BarrierSetAssembler::store_at(this, decorators, type, dst, src, tmp1, tmp2); |
6340 } else { |
6342 } else { |
6341 bs->store_at(this, decorators, type, dst, src, tmp1, tmp2); |
6343 bs->store_at(this, decorators, type, dst, src, tmp1, tmp2); |