--- old/src/hotspot/cpu/x86/c1_Runtime1_x86.cpp 2019-03-11 14:24:50.470356202 +0100 +++ new/src/hotspot/cpu/x86/c1_Runtime1_x86.cpp 2019-03-11 14:24:50.274356205 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2019, Oracle and/or its affiliates. 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 @@ -1103,6 +1103,7 @@ case new_type_array_id: case new_object_array_id: + case new_value_array_id: { Register length = rbx; // Incoming Register klass = rdx; // Incoming @@ -1110,8 +1111,10 @@ 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 @@ -1121,12 +1124,28 @@ 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); - __ jcc(Assembler::equal, ok); - __ stop("assert(is an array klass)"); + switch (id) { + case new_type_array_id: + __ cmpl(t0, Klass::_lh_array_tag_type_value); + __ jcc(Assembler::equal, ok); + __ stop("assert(is a type array klass)"); + break; + case new_object_array_id: + case new_value_array_id: // <-- needs to be renamed to new_non_null_array_id! + // FIXME: + // The VM currently does not distinguish between anewarray of + // "[QV;" (elements are non-nullable) vs "[LV;" (elements may be null). + // Instead, both are treated essentially as "[QV;". This code needs + // to be reimplemented after proper support of "[LV;" is implemented in the VM. + // + __ cmpl(t0, Klass::_lh_array_tag_obj_value); + __ jcc(Assembler::equal, ok); + __ cmpl(t0, Klass::_lh_array_tag_vt_value); + __ jcc(Assembler::equal, ok); + __ stop("assert(is an object or value array klass)"); + break; + default: ShouldNotReachHere(); + } __ should_not_reach_here(); __ bind(ok); } @@ -1179,6 +1198,8 @@ 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. + // See comments in the ASSERT block above. call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_object_array), klass, length); } @@ -1211,6 +1232,44 @@ } break; + case load_flattened_array_id: + { + StubFrame f(sasm, "load_flattened_array", dont_gc_arguments); + OopMap* map = save_live_registers(sasm, 3); + + // Called with store_parameter and not C abi + + f.load_argument(1, rax); // rax,: array + f.load_argument(0, rbx); // rbx,: index + int call_offset = __ call_RT(rax, noreg, CAST_FROM_FN_PTR(address, load_flattened_array), rax, rbx); + + oop_maps = new OopMapSet(); + oop_maps->add_gc_map(call_offset, map); + restore_live_registers_except_rax(sasm); + + // rax,: loaded element at array[index] + __ verify_oop(rax); + } + break; + + case store_flattened_array_id: + { + StubFrame f(sasm, "store_flattened_array", dont_gc_arguments); + OopMap* map = save_live_registers(sasm, 4); + + // Called with store_parameter and not C abi + + f.load_argument(2, rax); // rax,: array + f.load_argument(1, rbx); // rbx,: index + f.load_argument(0, rcx); // rcx,: value + int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, store_flattened_array), rax, rbx, rcx); + + oop_maps = new OopMapSet(); + oop_maps->add_gc_map(call_offset, map); + restore_live_registers_except_rax(sasm); + } + break; + case register_finalizer_id: { __ set_info("register_finalizer", dont_gc_arguments); @@ -1312,11 +1371,17 @@ break; case throw_incompatible_class_change_error_id: - { StubFrame f(sasm, "throw_incompatible_class_cast_exception", dont_gc_arguments); + { StubFrame f(sasm, "throw_incompatible_class_change_error", dont_gc_arguments); oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_incompatible_class_change_error), false); } break; + case throw_illegal_monitor_state_exception_id: + { StubFrame f(sasm, "throw_illegal_monitor_state_exception", dont_gc_arguments); + oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_illegal_monitor_state_exception), false); + } + break; + case slow_subtype_check_id: { // Typical calling sequence: