< prev index next > src/hotspot/cpu/ppc/c1_Runtime1_ppc.cpp
Print this page
restore_live_registers(sasm, result, noreg);
__ blr();
return oop_maps;
}
! static OopMapSet* stub_call_with_stack_parms(StubAssembler* sasm, Register result, address target,
! int stack_parms, bool do_return = true) {
// Make a frame and preserve the caller's caller-save registers.
const int parm_size_in_bytes = align_up(stack_parms << LogBytesPerWord, frame::alignment_in_bytes);
const int padding = parm_size_in_bytes - (stack_parms << LogBytesPerWord);
OopMap* oop_map = save_live_registers(sasm, true, noreg, parm_size_in_bytes);
restore_live_registers(sasm, result, noreg);
__ blr();
return oop_maps;
}
! static OopMapSet* stub_call_with_stack_parms(StubAssembler* sasm, Register oop_result, address target,
! int stack_parms, bool do_return = true, Register result2 = noreg) {
// Make a frame and preserve the caller's caller-save registers.
const int parm_size_in_bytes = align_up(stack_parms << LogBytesPerWord, frame::alignment_in_bytes);
const int padding = parm_size_in_bytes - (stack_parms << LogBytesPerWord);
OopMap* oop_map = save_live_registers(sasm, true, noreg, parm_size_in_bytes);
case 2:
__ ld(R5_ARG3, frame_size_in_bytes + padding + 8, R1_SP);
case 1:
__ ld(R4_ARG2, frame_size_in_bytes + padding + 0, R1_SP);
case 0:
! call_offset = __ call_RT(result, noreg, target);
break;
default: Unimplemented(); break;
}
OopMapSet* oop_maps = new OopMapSet();
oop_maps->add_gc_map(call_offset, oop_map);
! restore_live_registers(sasm, result, noreg);
if (do_return) __ blr();
return oop_maps;
}
case 2:
__ ld(R5_ARG3, frame_size_in_bytes + padding + 8, R1_SP);
case 1:
__ ld(R4_ARG2, frame_size_in_bytes + padding + 0, R1_SP);
case 0:
! call_offset = __ call_RT(oop_result, noreg, target);
break;
default: Unimplemented(); break;
}
OopMapSet* oop_maps = new OopMapSet();
oop_maps->add_gc_map(call_offset, oop_map);
! restore_live_registers(sasm, oop_result, result2);
if (do_return) __ blr();
return oop_maps;
}
oop_maps = stub_call_with_stack_parms(sasm, noreg, CAST_FROM_FN_PTR(address, counter_overflow), 2);
break;
case StubId::c1_new_type_array_id:
case StubId::c1_new_object_array_id:
{
if (id == StubId::c1_new_type_array_id) {
__ set_info("new_type_array", dont_gc_arguments);
! } else {
__ set_info("new_object_array", dont_gc_arguments);
}
#ifdef ASSERT
// Assert object type is really an array of the proper kind.
! {
! int tag = (id == StubId::c1_new_type_array_id) ? Klass::_lh_array_tag_type_value : Klass::_lh_array_tag_obj_value;
! Label ok;
! __ lwz(R0, in_bytes(Klass::layout_helper_offset()), R4_ARG2);
! __ srawi(R0, R0, Klass::_lh_array_tag_shift);
! __ cmpwi(CR0, R0, tag);
! __ beq(CR0, ok);
! __ stop("assert(is an array klass)");
! __ should_not_reach_here();
! __ bind(ok);
}
#endif // ASSERT
// We don't support eden allocation.
if (id == StubId::c1_new_type_array_id) {
oop_maps = generate_stub_call(sasm, R3_RET, CAST_FROM_FN_PTR(address, new_type_array), R4_ARG2, R5_ARG3);
! } else {
oop_maps = generate_stub_call(sasm, R3_RET, CAST_FROM_FN_PTR(address, new_object_array), R4_ARG2, R5_ARG3);
}
}
break;
case StubId::c1_new_multi_array_id:
oop_maps = stub_call_with_stack_parms(sasm, noreg, CAST_FROM_FN_PTR(address, counter_overflow), 2);
break;
case StubId::c1_new_type_array_id:
case StubId::c1_new_object_array_id:
+ case StubId::c1_new_null_free_array_id:
{
if (id == StubId::c1_new_type_array_id) {
__ set_info("new_type_array", dont_gc_arguments);
! } else if (id == StubId::c1_new_object_array_id) {
__ set_info("new_object_array", dont_gc_arguments);
+ } else {
+ __ set_info("new_null_free_array", dont_gc_arguments);
}
#ifdef ASSERT
// Assert object type is really an array of the proper kind.
! __ lwz(R0, in_bytes(Klass::layout_helper_offset()), R4_ARG2);
! __ srawi(R0, R0, Klass::_lh_array_tag_shift);
! switch (id) {
! case StubId::c1_new_type_array_id:
! __ cmpwi(CR0, R0, Klass::_lh_array_tag_type_value);
! __ asm_assert_eq("assert(is a type array klass)");
! break;
! case StubId::c1_new_object_array_id:
! __ cmpwi(CR0, R0, Klass::_lh_array_tag_ref_value); // new "[Ljava/lang/Object;"
! __ cmpwi(CR1, R0, Klass::_lh_array_tag_flat_value); // new "[LVT;"
+ __ cror(CR0, Assembler::equal, CR1, Assembler::equal);
+ __ asm_assert_eq("assert(is an object or inline type array klass)");
+ break;
+ case StubId::c1_new_null_free_array_id:
+ __ cmpwi(CR0, R0, Klass::_lh_array_tag_flat_value); // the array can be a flat array.
+ __ cmpwi(CR1, R0, Klass::_lh_array_tag_ref_value); // the array cannot be a flat array (due to the InlineArrayElementMaxFlatSize, etc.)
+ __ cror(CR0, Assembler::equal, CR1, Assembler::equal);
+ __ asm_assert_eq("assert(is an object or inline type array klass)");
+ break;
+ default: ShouldNotReachHere();
}
#endif // ASSERT
// We don't support eden allocation.
if (id == StubId::c1_new_type_array_id) {
oop_maps = generate_stub_call(sasm, R3_RET, CAST_FROM_FN_PTR(address, new_type_array), R4_ARG2, R5_ARG3);
! } else if (id == StubId::c1_new_object_array_id) {
oop_maps = generate_stub_call(sasm, R3_RET, CAST_FROM_FN_PTR(address, new_object_array), R4_ARG2, R5_ARG3);
+ } else {
+ assert(id == StubId::c1_new_null_free_array_id, "must be");
+ oop_maps = generate_stub_call(sasm, R3_RET, CAST_FROM_FN_PTR(address, new_null_free_array), R4_ARG2, R5_ARG3);
}
}
break;
case StubId::c1_new_multi_array_id:
__ set_info("new_multi_array", dont_gc_arguments);
oop_maps = generate_stub_call(sasm, R3_RET, CAST_FROM_FN_PTR(address, new_multi_array), R4_ARG2, R5_ARG3, R6_ARG4);
}
break;
+ case StubId::c1_buffer_inline_args_id:
+ case StubId::c1_buffer_inline_args_no_receiver_id:
+ {
+ address entry = (id == StubId::c1_buffer_inline_args_id) ?
+ CAST_FROM_FN_PTR(address, buffer_inline_args) :
+ CAST_FROM_FN_PTR(address, buffer_inline_args_no_receiver);
+
+ __ unimplemented("c1_buffer_inline_args"); // TODO: handle arguments and return value
+ OopMap* oop_map = save_live_registers(sasm);
+ int call_offset = __ call_RT(noreg, noreg, entry, R3_ARG1);
+
+ oop_maps = new OopMapSet();
+ oop_maps->add_gc_map(call_offset, oop_map);
+ restore_live_registers(sasm, R3_RET, noreg);
+ __ blr();
+ }
+ break;
+
+ case StubId::c1_load_flat_array_id:
+ oop_maps = stub_call_with_stack_parms(sasm, R3_RET, CAST_FROM_FN_PTR(address, load_flat_array), 2);
+ break;
+
+ case StubId::c1_store_flat_array_id:
+ oop_maps = stub_call_with_stack_parms(sasm, noreg, CAST_FROM_FN_PTR(address, store_flat_array), 3);
+ break;
+
+ case StubId::c1_substitutability_check_id:
+ oop_maps = stub_call_with_stack_parms(sasm, noreg, CAST_FROM_FN_PTR(address, substitutability_check), 2, true, R3_RET);
+ break;
+
case StubId::c1_register_finalizer_id:
{
__ set_info("register_finalizer", dont_gc_arguments);
// This code is called via rt_call. Hence, caller-save registers have been saved.
Register t = R11_scratch1;
}
break;
case StubId::c1_throw_incompatible_class_change_error_id:
{
! __ set_info("throw_incompatible_class_cast_exception", dont_gc_arguments);
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_incompatible_class_change_error), false);
}
break;
case StubId::c1_slow_subtype_check_id:
{ // Support for uint StubRoutine::partial_subtype_check( Klass sub, Klass super );
const Register sub_klass = R5,
super_klass = R4,
temp1_reg = R6;
}
break;
case StubId::c1_throw_incompatible_class_change_error_id:
{
! __ set_info("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 StubId::c1_throw_illegal_monitor_state_exception_id:
+ {
+ __ set_info("c1_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 StubId::c1_throw_identity_exception_id:
+ {
+ __ set_info("throw_identity_exception", dont_gc_arguments);
+ oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_identity_exception), true);
+ }
+ break;
+
case StubId::c1_slow_subtype_check_id:
{ // Support for uint StubRoutine::partial_subtype_check( Klass sub, Klass super );
const Register sub_klass = R5,
super_klass = R4,
temp1_reg = R6;
< prev index next >