< prev index next > src/hotspot/cpu/ppc/stubGenerator_ppc.cpp
Print this page
/*
* Copyright (c) 1997, 2026, Oracle and/or its affiliates. All rights reserved.
! * Copyright (c) 2012, 2025 SAP SE. 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
* published by the Free Software Foundation.
/*
* Copyright (c) 1997, 2026, Oracle and/or its affiliates. All rights reserved.
! * Copyright (c) 2012, 2026 SAP SE. 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
* published by the Free Software Foundation.
// default:
__ stw(R3_RET, 0, r_arg_result_addr);
__ blr(); // return to caller
// case T_OBJECT:
- // case T_LONG:
__ bind(ret_is_object);
__ bind(ret_is_long);
__ std(R3_RET, 0, r_arg_result_addr);
__ blr(); // return to caller
// case T_FLOAT:
// default:
__ stw(R3_RET, 0, r_arg_result_addr);
__ blr(); // return to caller
// case T_OBJECT:
__ bind(ret_is_object);
+ if (InlineTypeReturnedAsFields) {
+ // Check for scalarized return value
+ __ cmpdi(CR0, R3_RET, 0);
+ __ beq(CR0, ret_is_long);
+ // Load pack handler address
+ __ untested("call stub InlineTypeReturnedAsFields"); // TODO: check return registers usage
+ __ andi(R12_scratch2, R3_RET, -2);
+ __ ld(R12_scratch2, InlineKlass::adr_members_offset(), R12_scratch2);
+ __ ld(R12_scratch2, InlineKlass::pack_handler_jobject_offset(), R12_scratch2);
+ __ mtctr(R12_scratch2);
+ __ bctr(); // tail call
+ } // else fall through
+
+ // case T_LONG:
__ bind(ret_is_long);
__ std(R3_RET, 0, r_arg_result_addr);
__ blr(); // return to caller
// case T_FLOAT:
__ load_const_optimized(temp, objArray_lh, R0);
__ cmpw(CR0, lh, temp);
__ beq(CR0, L_objArray);
__ cmpd(CR5, src_klass, dst_klass); // if (src->klass() != dst->klass()) return -1;
! __ cmpwi(CR6, lh, Klass::_lh_neutral_value); // if (!src->is_Array()) return -1;
! __ crnand(CR5, Assembler::equal, CR6, Assembler::less);
! __ beq(CR5, L_failed);
// At this point, it is known to be a typeArray (array_tag 0x3).
#ifdef ASSERT
{ Label L;
jint lh_prim_tag_in_place = (Klass::_lh_array_tag_type_value << Klass::_lh_array_tag_shift);
__ load_const_optimized(temp, objArray_lh, R0);
__ cmpw(CR0, lh, temp);
__ beq(CR0, L_objArray);
__ cmpd(CR5, src_klass, dst_klass); // if (src->klass() != dst->klass()) return -1;
! __ bne(CR5, L_failed);
! // Check for flat inline type array -> return -1
! __ test_flat_array_oop(src, temp, L_failed);
+
+ // Check for null-free (non-flat) inline type array -> handle as object array
+ __ test_null_free_array_oop(src, temp, L_objArray);
+
+ __ cmpwi(CR6, lh, Klass::_lh_neutral_value); // if (!src->is_Array()) return -1;
+ __ bge(CR6, L_failed);
// At this point, it is known to be a typeArray (array_tag 0x3).
#ifdef ASSERT
{ Label L;
jint lh_prim_tag_in_place = (Klass::_lh_array_tag_type_value << Klass::_lh_array_tag_shift);
if (kind == Continuation::thaw_top) {
__ clobber_nonvolatile_registers(); // Except R16_thread and R29_TOC
}
if (return_barrier) {
+ assert(!InlineTypeReturnedAsFields, "unsupported");
__ mr(nvtmp, R3_RET); __ fmr(nvftmp, F1_RET); // preserve possible return value from a method returning to the return barrier
DEBUG_ONLY(__ ld_ptr(tmp1, _abi0(callers_sp), R1_SP);)
__ ld_ptr(R1_SP, JavaThread::cont_entry_offset(), R16_thread);
#ifdef ASSERT
__ ld_ptr(tmp2, _abi0(callers_sp), R1_SP);
__ li(R4_ARG2, kind);
__ call_VM_leaf(Continuation::thaw_entry(), R16_thread, R4_ARG2);
__ mr(R1_SP, R3_RET); // R3_RET contains the SP of the thawed top frame
if (return_barrier) {
+ assert(!InlineTypeReturnedAsFields, "unsupported");
// we're now in the caller of the frame that returned to the barrier
__ mr(R3_RET, nvtmp); __ fmr(F1_RET, nvftmp); // restore return value (no safepoint in the call to thaw, so even an oop return value should be OK)
} else {
// we're now on the yield frame (which is in an address above us b/c rsp has been pushed down)
__ li(R3_RET, 0); // return 0 (success) from doYield
< prev index next >