23 * |
23 * |
24 */ |
24 */ |
25 |
25 |
26 #include "precompiled.hpp" |
26 #include "precompiled.hpp" |
27 #include "asm/macroAssembler.hpp" |
27 #include "asm/macroAssembler.hpp" |
|
28 #include "gc/shared/barrierSet.hpp" |
|
29 #include "gc/shared/barrierSetAssembler.hpp" |
28 #include "memory/resourceArea.hpp" |
30 #include "memory/resourceArea.hpp" |
29 #include "prims/jniFastGetField.hpp" |
31 #include "prims/jniFastGetField.hpp" |
30 #include "prims/jvm_misc.hpp" |
32 #include "prims/jvm_misc.hpp" |
31 #include "runtime/safepoint.hpp" |
33 #include "runtime/safepoint.hpp" |
32 |
34 |
80 __ eor(robj, c_rarg1, rcounter); |
82 __ eor(robj, c_rarg1, rcounter); |
81 __ eor(robj, robj, rcounter); // obj, since |
83 __ eor(robj, robj, rcounter); // obj, since |
82 // robj ^ rcounter ^ rcounter == robj |
84 // robj ^ rcounter ^ rcounter == robj |
83 // robj is address dependent on rcounter. |
85 // robj is address dependent on rcounter. |
84 |
86 |
85 // If mask changes we need to ensure that the inverse is still encodable as an immediate |
87 BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler(); |
86 STATIC_ASSERT(JNIHandles::weak_tag_mask == 1); |
88 bs->try_resolve_jobject_in_native(masm, robj, rscratch1, slow); |
87 __ andr(robj, robj, ~JNIHandles::weak_tag_mask); |
|
88 |
89 |
89 __ ldr(robj, Address(robj, 0)); // *obj |
|
90 __ lsr(roffset, c_rarg2, 2); // offset |
90 __ lsr(roffset, c_rarg2, 2); // offset |
91 |
91 |
92 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small"); |
92 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small"); |
93 speculative_load_pclist[count] = __ pc(); // Used by the segfault handler |
93 speculative_load_pclist[count] = __ pc(); // Used by the segfault handler |
94 switch (type) { |
94 switch (type) { |