< prev index next >
src/cpu/aarch64/vm/templateInterpreterGenerator_aarch64.cpp
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
--- 1,7 ----
/*
! * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
*** 1397,1432 ****
// If result is an oop unbox and store it in frame where gc will see it
// and result handler will pick it up
{
! Label no_oop, not_weak, store_result;
__ adr(t, ExternalAddress(AbstractInterpreter::result_handler(T_OBJECT)));
__ cmp(t, result_handler);
__ br(Assembler::NE, no_oop);
! // Unbox oop result, e.g. JNIHandles::resolve result.
__ pop(ltos);
! __ cbz(r0, store_result); // Use NULL as-is.
! STATIC_ASSERT(JNIHandles::weak_tag_mask == 1u);
! __ tbz(r0, 0, not_weak); // Test for jweak tag.
! // Resolve jweak.
! __ ldr(r0, Address(r0, -JNIHandles::weak_tag_value));
! #if INCLUDE_ALL_GCS
! if (UseG1GC) {
! __ enter(); // Barrier may call runtime.
! __ g1_write_barrier_pre(noreg /* obj */,
! r0 /* pre_val */,
! rthread /* thread */,
! t /* tmp */,
! true /* tosca_live */,
! true /* expand_call */);
! __ leave();
! }
! #endif // INCLUDE_ALL_GCS
! __ b(store_result);
! __ bind(not_weak);
! // Resolve (untagged) jobject.
__ ldr(r0, Address(r0, 0));
__ bind(store_result);
__ str(r0, Address(rfp, frame::interpreter_frame_oop_temp_offset*wordSize));
// keep stack depth as expected by pushing oop which will eventually be discarded
__ push(ltos);
--- 1397,1413 ----
// If result is an oop unbox and store it in frame where gc will see it
// and result handler will pick it up
{
! Label no_oop, store_result;
__ adr(t, ExternalAddress(AbstractInterpreter::result_handler(T_OBJECT)));
__ cmp(t, result_handler);
__ br(Assembler::NE, no_oop);
! // retrieve result
__ pop(ltos);
! __ cbz(r0, store_result);
__ ldr(r0, Address(r0, 0));
__ bind(store_result);
__ str(r0, Address(rfp, frame::interpreter_frame_oop_temp_offset*wordSize));
// keep stack depth as expected by pushing oop which will eventually be discarded
__ push(ltos);
< prev index next >