--- old/src/hotspot/share/c1/c1_Runtime1.cpp 2019-01-31 04:22:53.519201893 -0800 +++ new/src/hotspot/share/c1/c1_Runtime1.cpp 2019-01-31 04:22:53.323194665 -0800 @@ -52,6 +52,8 @@ #include "oops/objArrayOop.inline.hpp" #include "oops/objArrayKlass.hpp" #include "oops/oop.inline.hpp" +#include "oops/valueArrayKlass.hpp" +#include "oops/valueArrayOop.inline.hpp" #include "runtime/atomic.hpp" #include "runtime/biasedLocking.hpp" #include "runtime/compilationPolicy.hpp" @@ -118,6 +120,7 @@ int Runtime1::_new_object_array_slowcase_cnt = 0; int Runtime1::_new_instance_slowcase_cnt = 0; int Runtime1::_new_multi_array_slowcase_cnt = 0; +int Runtime1::_load_flattened_array_slowcase_cnt = 0; int Runtime1::_monitorenter_slowcase_cnt = 0; int Runtime1::_monitorexit_slowcase_cnt = 0; int Runtime1::_patch_code_slowcase_cnt = 0; @@ -412,6 +415,27 @@ JRT_END +JRT_ENTRY(void, Runtime1::load_flattened_array(JavaThread* thread, valueArrayOopDesc* array, int index)) + NOT_PRODUCT(_new_multi_array_slowcase_cnt++;) + Klass* klass = array->klass(); + assert(klass->is_valueArray_klass(), "expected value array oop"); + assert(array->length() > 0 && index < array->length(), "already checked"); + + ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass); + ValueKlass* vklass = vaklass->element_klass(); + + // We have a non-empty flattened array, so the element type must have been initialized. + assert(vklass->is_initialized(), "must be"); + Handle holder(THREAD, vklass->klass_holder()); // keep the vklass alive + oop obj = vklass->allocate_instance(CHECK); + + void* src = array->value_at_addr(index, vaklass->layout_helper()); + vklass->value_store(src, vklass->data_for_oop(obj), + vaklass->element_byte_size(), true, false); + thread->set_vm_result(obj); +JRT_END + + JRT_ENTRY(void, Runtime1::unimplemented_entry(JavaThread* thread, StubID id)) tty->print_cr("Runtime1::entry_for(%d) returned unimplemented entry point", id); JRT_END @@ -1500,6 +1524,7 @@ tty->print_cr(" _new_object_array_slowcase_cnt: %d", _new_object_array_slowcase_cnt); tty->print_cr(" _new_instance_slowcase_cnt: %d", _new_instance_slowcase_cnt); tty->print_cr(" _new_multi_array_slowcase_cnt: %d", _new_multi_array_slowcase_cnt); + tty->print_cr(" _load_flattened_array_slowcase_cnt:%d", _load_flattened_array_slowcase_cnt); tty->print_cr(" _monitorenter_slowcase_cnt: %d", _monitorenter_slowcase_cnt); tty->print_cr(" _monitorexit_slowcase_cnt: %d", _monitorexit_slowcase_cnt); tty->print_cr(" _patch_code_slowcase_cnt: %d", _patch_code_slowcase_cnt);