8333154: RISC-V: Add support for primitive array C1 clone intrinsic
Reviewed-by: fyang
This commit is contained in:
parent
a4c7be862c
commit
75220da26f
@ -341,7 +341,9 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
|
||||
__ call_VM_leaf(entry, args_num);
|
||||
}
|
||||
|
||||
__ bind(*stub->continuation());
|
||||
if (stub != nullptr) {
|
||||
__ bind(*stub->continuation());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -1023,7 +1023,8 @@ void LIR_Assembler::emit_alloc_array(LIR_OpAllocArray* op) {
|
||||
arrayOopDesc::base_offset_in_bytes(op->type()),
|
||||
array_element_size(op->type()),
|
||||
op->klass()->as_register(),
|
||||
*op->stub()->entry());
|
||||
*op->stub()->entry(),
|
||||
op->zero_array());
|
||||
}
|
||||
__ bind(*op->stub()->continuation());
|
||||
}
|
||||
|
@ -733,7 +733,13 @@ void LIRGenerator::do_ArrayCopy(Intrinsic* x) {
|
||||
assert(x->number_of_arguments() == 5, "wrong type");
|
||||
|
||||
// Make all state_for calls early since they can emit code
|
||||
CodeEmitInfo* info = state_for(x, x->state());
|
||||
CodeEmitInfo* info = nullptr;
|
||||
if (x->state_before() != nullptr && x->state_before()->force_reexecute()) {
|
||||
info = state_for(x, x->state_before());
|
||||
info->set_force_reexecute();
|
||||
} else {
|
||||
info = state_for(x, x->state());
|
||||
}
|
||||
|
||||
LIRItem src(x->argument_at(0), this);
|
||||
LIRItem src_pos(x->argument_at(1), this);
|
||||
@ -766,6 +772,9 @@ void LIRGenerator::do_ArrayCopy(Intrinsic* x) {
|
||||
int flags;
|
||||
ciArrayKlass* expected_type = nullptr;
|
||||
arraycopy_helper(x, &flags, &expected_type);
|
||||
if (x->check_flag(Instruction::OmitChecksFlag)) {
|
||||
flags = 0;
|
||||
}
|
||||
|
||||
__ arraycopy(src.result(), src_pos.result(), dst.result(), dst_pos.result(), length.result(), tmp,
|
||||
expected_type, flags, info); // does add_safepoint
|
||||
@ -844,7 +853,13 @@ void LIRGenerator::do_NewInstance(NewInstance* x) {
|
||||
}
|
||||
|
||||
void LIRGenerator::do_NewTypeArray(NewTypeArray* x) {
|
||||
CodeEmitInfo* info = state_for(x, x->state());
|
||||
CodeEmitInfo* info = nullptr;
|
||||
if (x->state_before() != nullptr && x->state_before()->force_reexecute()) {
|
||||
info = state_for(x, x->state_before());
|
||||
info->set_force_reexecute();
|
||||
} else {
|
||||
info = state_for(x, x->state());
|
||||
}
|
||||
|
||||
LIRItem length(x->length(), this);
|
||||
length.load_item_force(FrameMap::r9_opr);
|
||||
@ -861,7 +876,7 @@ void LIRGenerator::do_NewTypeArray(NewTypeArray* x) {
|
||||
__ metadata2reg(ciTypeArrayKlass::make(elem_type)->constant_encoding(), klass_reg);
|
||||
|
||||
CodeStub* slow_path = new NewTypeArrayStub(klass_reg, len, reg, info);
|
||||
__ allocate_array(reg, len, tmp1, tmp2, tmp3, tmp4, elem_type, klass_reg, slow_path);
|
||||
__ allocate_array(reg, len, tmp1, tmp2, tmp3, tmp4, elem_type, klass_reg, slow_path, x->zero_array());
|
||||
|
||||
LIR_Opr result = rlock_result(x);
|
||||
__ move(reg, result);
|
||||
|
@ -282,7 +282,7 @@ void C1_MacroAssembler::initialize_object(Register obj, Register klass, Register
|
||||
verify_oop(obj);
|
||||
}
|
||||
|
||||
void C1_MacroAssembler::allocate_array(Register obj, Register len, Register tmp1, Register tmp2, int base_offset_in_bytes, int f, Register klass, Label& slow_case) {
|
||||
void C1_MacroAssembler::allocate_array(Register obj, Register len, Register tmp1, Register tmp2, int base_offset_in_bytes, int f, Register klass, Label& slow_case, bool zero_array) {
|
||||
assert_different_registers(obj, len, tmp1, tmp2, klass);
|
||||
|
||||
// determine alignment mask
|
||||
@ -308,7 +308,9 @@ void C1_MacroAssembler::allocate_array(Register obj, Register len, Register tmp1
|
||||
|
||||
// clear rest of allocated space
|
||||
const Register len_zero = len;
|
||||
initialize_body(obj, arr_size, base_offset, len_zero);
|
||||
if (zero_array) {
|
||||
initialize_body(obj, arr_size, base_offset, len_zero);
|
||||
}
|
||||
|
||||
membar(MacroAssembler::StoreStore);
|
||||
|
||||
|
@ -101,7 +101,8 @@ using MacroAssembler::null_check;
|
||||
// base_offset_in_bytes: offset of first array element, in bytes
|
||||
// f : element scale factor
|
||||
// slow_case : exit to slow case implementation if fast allocation fails
|
||||
void allocate_array(Register obj, Register len, Register tmp1, Register tmp2, int base_offset_in_bytes, int f, Register klass, Label& slow_case);
|
||||
// zero_array : zero the allocated array or not
|
||||
void allocate_array(Register obj, Register len, Register tmp1, Register tmp2, int base_offset_in_bytes, int f, Register klass, Label& slow_case, bool zero_array);
|
||||
|
||||
int rsp_offset() const { return _rsp_offset; }
|
||||
|
||||
|
@ -235,7 +235,7 @@ bool Compiler::is_intrinsic_supported(vmIntrinsics::ID id) {
|
||||
case vmIntrinsics::_counterTime:
|
||||
#endif
|
||||
case vmIntrinsics::_getObjectSize:
|
||||
#if defined(X86) || defined(AARCH64) || defined(S390)
|
||||
#if defined(X86) || defined(AARCH64) || defined(S390) || defined(RISCV)
|
||||
case vmIntrinsics::_clone:
|
||||
#endif
|
||||
break;
|
||||
|
@ -351,7 +351,7 @@ LIR_OpArrayCopy::LIR_OpArrayCopy(LIR_Opr src, LIR_Opr src_pos, LIR_Opr dst, LIR_
|
||||
, _tmp(tmp)
|
||||
, _expected_type(expected_type)
|
||||
, _flags(flags) {
|
||||
#if defined(X86) || defined(AARCH64) || defined(S390)
|
||||
#if defined(X86) || defined(AARCH64) || defined(S390) || defined(RISCV)
|
||||
if (expected_type != nullptr && flags == 0) {
|
||||
_stub = nullptr;
|
||||
} else {
|
||||
|
Loading…
x
Reference in New Issue
Block a user