From a34091f4eb256eeeab363c1c735bb22851013989 Mon Sep 17 00:00:00 2001 From: Jack Lu Date: Tue, 11 Sep 2018 12:49:04 -0400 Subject: [PATCH] Update ldc to load Constant_Dynamic primitives as I_32 type ldc loads data into a UDATA slot on the stack and primitive values only uses 32bit on a 64bit system, this change will ensure that 32 bit values will always be written to the lower 32 bit of the slot (For BE and LE systems) [ci skip] Signed-off-by: Jack Lu --- runtime/vm/BytecodeInterpreter.hpp | 32 ++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/runtime/vm/BytecodeInterpreter.hpp b/runtime/vm/BytecodeInterpreter.hpp index d86e7d9ef3a..49bff99851e 100644 --- a/runtime/vm/BytecodeInterpreter.hpp +++ b/runtime/vm/BytecodeInterpreter.hpp @@ -6116,34 +6116,46 @@ done:; resolved: _pc += (1 + parmSize); _sp -= 1; - if (J9DescriptionCpTypeClass == romCPEntry->cpType) { - value = J9VM_J9CLASS_TO_HEAPCLASS((J9Class*)value); - } else if (J9DescriptionCpTypeConstantDynamic == (romCPEntry->cpType & J9DescriptionCpTypeMask)) { + + if ((J9DescriptionCpTypeConstantDynamic == (romCPEntry->cpType & J9DescriptionCpTypeMask)) + && (0 != (romCPEntry->cpType >> J9DescriptionReturnTypeShift)) + ) { /* Constant Dynamic ROM CP entry uses J9DescriptionReturnType* flag to indicate * different primitive return type that require unboxing before returning the value */ + I_32 unboxedValue = 0; switch (romCPEntry->cpType >> J9DescriptionReturnTypeShift) { case J9DescriptionReturnTypeBoolean: - value = (j9object_t)(UDATA)J9VMJAVALANGBOOLEAN_VALUE(_currentThread, value); + unboxedValue = (I_32)J9VMJAVALANGBOOLEAN_VALUE(_currentThread, value); break; case J9DescriptionReturnTypeByte: - value = (j9object_t)(UDATA)J9VMJAVALANGBYTE_VALUE(_currentThread, value); + unboxedValue = (I_32)(I_8)J9VMJAVALANGBYTE_VALUE(_currentThread, value); break; case J9DescriptionReturnTypeChar: - value = (j9object_t)(UDATA)J9VMJAVALANGCHARACTER_VALUE(_currentThread, value); + unboxedValue = (I_32)(U_16)J9VMJAVALANGCHARACTER_VALUE(_currentThread, value); break; case J9DescriptionReturnTypeShort: - value = (j9object_t)(UDATA)J9VMJAVALANGSHORT_VALUE(_currentThread, value); + unboxedValue = (I_32)(I_16)J9VMJAVALANGSHORT_VALUE(_currentThread, value); break; case J9DescriptionReturnTypeFloat: - value = (j9object_t)(UDATA)J9VMJAVALANGFLOAT_VALUE(_currentThread, value); + unboxedValue = (I_32)J9VMJAVALANGFLOAT_VALUE(_currentThread, value); break; case J9DescriptionReturnTypeInt: - value = (j9object_t)(UDATA)J9VMJAVALANGINTEGER_VALUE(_currentThread, value); + unboxedValue = (I_32)J9VMJAVALANGINTEGER_VALUE(_currentThread, value); + break; + default: + /* double and long value cannot be loaded by ldc as they require 2 slots */ + Assert_VM_unreachable(); break; } + *(I_32 *)_sp = unboxedValue; + } else { + if (J9DescriptionCpTypeClass == romCPEntry->cpType) { + value = J9VM_J9CLASS_TO_HEAPCLASS((J9Class*)value); + } + + *_sp = (UDATA)value; } - *_sp = (UDATA)value; done: return rc; }