1.1 --- a/src/cpu/x86/vm/macroAssembler_x86.cpp Thu Nov 05 11:42:42 2015 +0100 1.2 +++ b/src/cpu/x86/vm/macroAssembler_x86.cpp Tue May 07 20:38:26 2019 +0000 1.3 @@ -4119,6 +4119,42 @@ 1.4 } 1.5 } 1.6 1.7 +void MacroAssembler::resolve_jobject(Register value, 1.8 + Register thread, 1.9 + Register tmp) { 1.10 + assert_different_registers(value, thread, tmp); 1.11 + Label done, not_weak; 1.12 + testptr(value, value); 1.13 + jcc(Assembler::zero, done); // Use NULL as-is. 1.14 + testptr(value, JNIHandles::weak_tag_mask); // Test for jweak tag. 1.15 + jcc(Assembler::zero, not_weak); 1.16 + // Resolve jweak. 1.17 + movptr(value, Address(value, -JNIHandles::weak_tag_value)); 1.18 + verify_oop(value); 1.19 +#if INCLUDE_ALL_GCS 1.20 + if (UseG1GC) { 1.21 + g1_write_barrier_pre(noreg /* obj */, 1.22 + value /* pre_val */, 1.23 + thread /* thread */, 1.24 + tmp /* tmp */, 1.25 + true /* tosca_live */, 1.26 + true /* expand_call */); 1.27 + } 1.28 +#endif // INCLUDE_ALL_GCS 1.29 + jmp(done); 1.30 + bind(not_weak); 1.31 + // Resolve (untagged) jobject. 1.32 + movptr(value, Address(value, 0)); 1.33 + verify_oop(value); 1.34 + bind(done); 1.35 +} 1.36 + 1.37 +void MacroAssembler::clear_jweak_tag(Register possibly_jweak) { 1.38 + const int32_t inverted_jweak_mask = ~static_cast<int32_t>(JNIHandles::weak_tag_mask); 1.39 + STATIC_ASSERT(inverted_jweak_mask == -2); // otherwise check this code 1.40 + // The inverted mask is sign-extended 1.41 + andptr(possibly_jweak, inverted_jweak_mask); 1.42 +} 1.43 1.44 ////////////////////////////////////////////////////////////////////////////////// 1.45 #if INCLUDE_ALL_GCS