--- a/hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.cpp Thu Apr 21 13:36:14 2016 -0700
+++ b/hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.cpp Fri Apr 22 10:46:08 2016 +0200
@@ -169,6 +169,7 @@
case ltos: ld(R17_tos, in_bytes(JvmtiThreadState::earlyret_value_offset()), RjvmtiState);
break;
case btos: // fall through
+ case ztos: // fall through
case ctos: // fall through
case stos: // fall through
case itos: lwz(R17_tos, in_bytes(JvmtiThreadState::earlyret_value_offset()), RjvmtiState);
@@ -294,6 +295,7 @@
switch (state) {
case atos: push_ptr(); break;
case btos:
+ case ztos:
case ctos:
case stos:
case itos: push_i(); break;
@@ -309,6 +311,7 @@
switch (state) {
case atos: pop_ptr(); break;
case btos:
+ case ztos:
case ctos:
case stos:
case itos: pop_i(); break;
@@ -749,6 +752,43 @@
stdux(Rscratch2, R1_SP, Rscratch1); // atomically set *(SP = top_frame_sp) = **SP
}
+void InterpreterMacroAssembler::narrow(Register result) {
+ Register ret_type = R11_scratch1;
+ ld(R11_scratch1, in_bytes(Method::const_offset()), R19_method);
+ lbz(ret_type, in_bytes(ConstMethod::result_type_offset()), R11_scratch1);
+
+ Label notBool, notByte, notChar, done;
+
+ // common case first
+ cmpwi(CCR0, ret_type, T_INT);
+ beq(CCR0, done);
+
+ cmpwi(CCR0, ret_type, T_BOOLEAN);
+ bne(CCR0, notBool);
+ andi(result, result, 0x1);
+ b(done);
+
+ bind(notBool);
+ cmpwi(CCR0, ret_type, T_BYTE);
+ bne(CCR0, notByte);
+ extsb(result, result);
+ b(done);
+
+ bind(notByte);
+ cmpwi(CCR0, ret_type, T_CHAR);
+ bne(CCR0, notChar);
+ andi(result, result, 0xffff);
+ b(done);
+
+ bind(notChar);
+ // cmpwi(CCR0, ret_type, T_SHORT); // all that's left
+ // bne(CCR0, done);
+ extsh(result, result);
+
+ // Nothing to do for T_INT
+ bind(done);
+}
+
// Remove activation.
//
// Unlock the receiver if this is a synchronized method.