2704 |
2704 |
2705 // Clear "last Java frame" SP and PC. |
2705 // Clear "last Java frame" SP and PC. |
2706 __ verify_thread(); // G2_thread must be correct |
2706 __ verify_thread(); // G2_thread must be correct |
2707 __ reset_last_Java_frame(); |
2707 __ reset_last_Java_frame(); |
2708 |
2708 |
2709 // Unpack oop result |
2709 // Unbox oop result, e.g. JNIHandles::resolve value in I0. |
2710 if (ret_type == T_OBJECT || ret_type == T_ARRAY) { |
2710 if (ret_type == T_OBJECT || ret_type == T_ARRAY) { |
2711 Label L; |
2711 Label done, not_weak; |
2712 __ addcc(G0, I0, G0); |
2712 __ br_null(I0, false, Assembler::pn, done); // Use NULL as-is. |
2713 __ brx(Assembler::notZero, true, Assembler::pt, L); |
2713 __ delayed()->andcc(I0, JNIHandles::weak_tag_mask, G0); // Test for jweak |
2714 __ delayed()->ld_ptr(I0, 0, I0); |
2714 __ brx(Assembler::zero, true, Assembler::pt, not_weak); |
2715 __ mov(G0, I0); |
2715 __ delayed()->ld_ptr(I0, 0, I0); // Maybe resolve (untagged) jobject. |
2716 __ bind(L); |
2716 // Resolve jweak. |
2717 __ verify_oop(I0); |
2717 __ ld_ptr(I0, -JNIHandles::weak_tag_value, I0); |
|
2718 #if INCLUDE_ALL_GCS |
|
2719 if (UseG1GC) { |
|
2720 // Copy to O0 because macro doesn't allow pre_val in input reg. |
|
2721 __ mov(I0, O0); |
|
2722 __ g1_write_barrier_pre(noreg /* obj */, |
|
2723 noreg /* index */, |
|
2724 0 /* offset */, |
|
2725 O0 /* pre_val */, |
|
2726 G3_scratch /* tmp */, |
|
2727 true /* preserve_o_regs */); |
|
2728 } |
|
2729 #endif // INCLUDE_ALL_GCS |
|
2730 __ bind(not_weak); |
|
2731 __ verify_oop(I0); |
|
2732 __ bind(done); |
2718 } |
2733 } |
2719 |
2734 |
2720 if (!is_critical_native) { |
2735 if (!is_critical_native) { |
2721 // reset handle block |
2736 // reset handle block |
2722 __ ld_ptr(G2_thread, in_bytes(JavaThread::active_handles_offset()), L5); |
2737 __ ld_ptr(G2_thread, in_bytes(JavaThread::active_handles_offset()), L5); |