2038 if (ret_type != T_FLOAT && ret_type != T_DOUBLE && ret_type != T_VOID) {
2039 restore_native_result(masm, ret_type, stack_slots);
2040 }
2041
2042 __ bind(done);
2043 }
2044
2045 Label dtrace_method_exit, dtrace_method_exit_done;
2046 {
2047 unsigned long offset;
2048 __ adrp(rscratch1, ExternalAddress((address)&DTraceMethodProbes), offset);
2049 __ ldrb(rscratch1, Address(rscratch1, offset));
2050 __ cbnzw(rscratch1, dtrace_method_exit);
2051 __ bind(dtrace_method_exit_done);
2052 }
2053
2054 __ reset_last_Java_frame(false);
2055
2056 // Unbox oop result, e.g. JNIHandles::resolve result.
2057 if (ret_type == T_OBJECT || ret_type == T_ARRAY) {
2058 Label done, not_weak;
2059 __ cbz(r0, done); // Use NULL as-is.
2060 STATIC_ASSERT(JNIHandles::weak_tag_mask == 1u);
2061 __ tbz(r0, 0, not_weak); // Test for jweak tag.
2062 // Resolve jweak.
2063 __ ldr(r0, Address(r0, -JNIHandles::weak_tag_value));
2064 __ verify_oop(r0);
2065 #if INCLUDE_ALL_GCS
2066 if (UseG1GC) {
2067 __ g1_write_barrier_pre(noreg /* obj */,
2068 r0 /* pre_val */,
2069 rthread /* thread */,
2070 rscratch2 /* tmp */,
2071 true /* tosca_live */,
2072 true /* expand_call */);
2073 }
2074 #endif // INCLUDE_ALL_GCS
2075 __ b(done);
2076 __ bind(not_weak);
2077 // Resolve (untagged) jobject.
2078 __ ldr(r0, Address(r0, 0));
2079 __ verify_oop(r0);
2080 __ bind(done);
2081 }
2082
2083 if (CheckJNICalls) {
2084 // clear_pending_jni_exception_check
2085 __ str(zr, Address(rthread, JavaThread::pending_jni_exception_check_fn_offset()));
2086 }
2087
2088 if (!is_critical_native) {
2089 // reset handle block
2090 __ ldr(r2, Address(rthread, JavaThread::active_handles_offset()));
2091 __ str(zr, Address(r2, JNIHandleBlock::top_offset_in_bytes()));
2092 }
2093
2094 __ leave();
2095
2096 if (!is_critical_native) {
2097 // Any exception pending?
2098 __ ldr(rscratch1, Address(rthread, in_bytes(Thread::pending_exception_offset())));
2099 __ cbnz(rscratch1, exception_pending);
2100 }
|
2038 if (ret_type != T_FLOAT && ret_type != T_DOUBLE && ret_type != T_VOID) {
2039 restore_native_result(masm, ret_type, stack_slots);
2040 }
2041
2042 __ bind(done);
2043 }
2044
2045 Label dtrace_method_exit, dtrace_method_exit_done;
2046 {
2047 unsigned long offset;
2048 __ adrp(rscratch1, ExternalAddress((address)&DTraceMethodProbes), offset);
2049 __ ldrb(rscratch1, Address(rscratch1, offset));
2050 __ cbnzw(rscratch1, dtrace_method_exit);
2051 __ bind(dtrace_method_exit_done);
2052 }
2053
2054 __ reset_last_Java_frame(false);
2055
2056 // Unbox oop result, e.g. JNIHandles::resolve result.
2057 if (ret_type == T_OBJECT || ret_type == T_ARRAY) {
2058 __ resolve_jobject(r0, rthread, rscratch2);
2059 }
2060
2061 if (CheckJNICalls) {
2062 // clear_pending_jni_exception_check
2063 __ str(zr, Address(rthread, JavaThread::pending_jni_exception_check_fn_offset()));
2064 }
2065
2066 if (!is_critical_native) {
2067 // reset handle block
2068 __ ldr(r2, Address(rthread, JavaThread::active_handles_offset()));
2069 __ str(zr, Address(r2, JNIHandleBlock::top_offset_in_bytes()));
2070 }
2071
2072 __ leave();
2073
2074 if (!is_critical_native) {
2075 // Any exception pending?
2076 __ ldr(rscratch1, Address(rthread, in_bytes(Thread::pending_exception_offset())));
2077 __ cbnz(rscratch1, exception_pending);
2078 }
|