src/cpu/sparc/vm/sharedRuntime_sparc.cpp

changeset 9669
32bc598624bd
parent 8997
f8a45a60bc6b
child 9703
2fdf635bcf28
equal deleted inserted replaced
9668:acb9351e3a29 9669:32bc598624bd
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);

mercurial