< prev index next >
src/hotspot/cpu/x86/c1_Runtime1_x86.cpp
Print this page
@@ -1101,32 +1101,36 @@
}
break;
case new_type_array_id:
case new_object_array_id:
+ case new_value_array_id:
{
Register length = rbx; // Incoming
Register klass = rdx; // Incoming
Register obj = rax; // Result
if (id == new_type_array_id) {
__ set_info("new_type_array", dont_gc_arguments);
- } else {
+ } else if (id == new_object_array_id) {
__ set_info("new_object_array", dont_gc_arguments);
+ } else {
+ __ set_info("new_value_array", dont_gc_arguments);
}
#ifdef ASSERT
// assert object type is really an array of the proper kind
{
Label ok;
Register t0 = obj;
__ movl(t0, Address(klass, Klass::layout_helper_offset()));
__ sarl(t0, Klass::_lh_array_tag_shift);
- int tag = ((id == new_type_array_id)
- ? Klass::_lh_array_tag_type_value
- : Klass::_lh_array_tag_obj_value);
- __ cmpl(t0, tag);
+ switch (id) {
+ case new_type_array_id: __ cmpl(t0, Klass::_lh_array_tag_type_value); break;
+ case new_object_array_id: __ cmpl(t0, Klass::_lh_array_tag_obj_value); break;
+ case new_value_array_id: __ cmpl(t0, Klass::_lh_array_tag_vt_value); break;
+ }
__ jcc(Assembler::equal, ok);
__ stop("assert(is an array klass)");
__ should_not_reach_here();
__ bind(ok);
}
@@ -1177,10 +1181,11 @@
OopMap* map = save_live_registers(sasm, 3);
int call_offset;
if (id == new_type_array_id) {
call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_type_array), klass, length);
} else {
+ // Runtime1::new_object_array handles both object and value arrays
call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_object_array), klass, length);
}
oop_maps = new OopMapSet();
oop_maps->add_gc_map(call_offset, map);
< prev index next >