8293840: RISC-V: Remove cbuf parameter from far_call/far_jump/trampoline_call
Reviewed-by: fyang
This commit is contained in:
parent
39cd1635bf
commit
5feca688df
@ -290,7 +290,7 @@ void SimpleExceptionStub::emit_code(LIR_Assembler* ce) {
|
|||||||
if (_obj->is_cpu_register()) {
|
if (_obj->is_cpu_register()) {
|
||||||
__ mv(t0, _obj->as_register());
|
__ mv(t0, _obj->as_register());
|
||||||
}
|
}
|
||||||
__ far_call(RuntimeAddress(Runtime1::entry_for(_stub)), NULL, t1);
|
__ far_call(RuntimeAddress(Runtime1::entry_for(_stub)), t1);
|
||||||
ce->add_call_info_here(_info);
|
ce->add_call_info_here(_info);
|
||||||
debug_only(__ should_not_reach_here());
|
debug_only(__ should_not_reach_here());
|
||||||
}
|
}
|
||||||
|
@ -2435,7 +2435,7 @@ ATOMIC_XCHGU(xchgalwu, xchgalw)
|
|||||||
|
|
||||||
#undef ATOMIC_XCHGU
|
#undef ATOMIC_XCHGU
|
||||||
|
|
||||||
void MacroAssembler::far_jump(Address entry, CodeBuffer *cbuf, Register tmp) {
|
void MacroAssembler::far_jump(Address entry, Register tmp) {
|
||||||
assert(ReservedCodeCacheSize < 4*G, "branch out of range");
|
assert(ReservedCodeCacheSize < 4*G, "branch out of range");
|
||||||
assert(CodeCache::find_blob(entry.target()) != NULL,
|
assert(CodeCache::find_blob(entry.target()) != NULL,
|
||||||
"destination of far call not found in code cache");
|
"destination of far call not found in code cache");
|
||||||
@ -2444,15 +2444,13 @@ void MacroAssembler::far_jump(Address entry, CodeBuffer *cbuf, Register tmp) {
|
|||||||
// We can use auipc + jalr here because we know that the total size of
|
// We can use auipc + jalr here because we know that the total size of
|
||||||
// the code cache cannot exceed 2Gb.
|
// the code cache cannot exceed 2Gb.
|
||||||
la_patchable(tmp, entry, offset);
|
la_patchable(tmp, entry, offset);
|
||||||
if (cbuf != NULL) { cbuf->set_insts_mark(); }
|
|
||||||
jalr(x0, tmp, offset);
|
jalr(x0, tmp, offset);
|
||||||
} else {
|
} else {
|
||||||
if (cbuf != NULL) { cbuf->set_insts_mark(); }
|
|
||||||
j(entry);
|
j(entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::far_call(Address entry, CodeBuffer *cbuf, Register tmp) {
|
void MacroAssembler::far_call(Address entry, Register tmp) {
|
||||||
assert(ReservedCodeCacheSize < 4*G, "branch out of range");
|
assert(ReservedCodeCacheSize < 4*G, "branch out of range");
|
||||||
assert(CodeCache::find_blob(entry.target()) != NULL,
|
assert(CodeCache::find_blob(entry.target()) != NULL,
|
||||||
"destination of far call not found in code cache");
|
"destination of far call not found in code cache");
|
||||||
@ -2461,10 +2459,8 @@ void MacroAssembler::far_call(Address entry, CodeBuffer *cbuf, Register tmp) {
|
|||||||
// We can use auipc + jalr here because we know that the total size of
|
// We can use auipc + jalr here because we know that the total size of
|
||||||
// the code cache cannot exceed 2Gb.
|
// the code cache cannot exceed 2Gb.
|
||||||
la_patchable(tmp, entry, offset);
|
la_patchable(tmp, entry, offset);
|
||||||
if (cbuf != NULL) { cbuf->set_insts_mark(); }
|
|
||||||
jalr(x1, tmp, offset); // link
|
jalr(x1, tmp, offset); // link
|
||||||
} else {
|
} else {
|
||||||
if (cbuf != NULL) { cbuf->set_insts_mark(); }
|
|
||||||
jal(entry); // link
|
jal(entry); // link
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2809,7 +2805,7 @@ void MacroAssembler::set_narrow_klass(Register dst, Klass* k) {
|
|||||||
|
|
||||||
// Maybe emit a call via a trampoline. If the code cache is small
|
// Maybe emit a call via a trampoline. If the code cache is small
|
||||||
// trampolines won't be emitted.
|
// trampolines won't be emitted.
|
||||||
address MacroAssembler::trampoline_call(Address entry, CodeBuffer* cbuf) {
|
address MacroAssembler::trampoline_call(Address entry) {
|
||||||
assert(JavaThread::current()->is_Compiler_thread(), "just checking");
|
assert(JavaThread::current()->is_Compiler_thread(), "just checking");
|
||||||
assert(entry.rspec().type() == relocInfo::runtime_call_type ||
|
assert(entry.rspec().type() == relocInfo::runtime_call_type ||
|
||||||
entry.rspec().type() == relocInfo::opt_virtual_call_type ||
|
entry.rspec().type() == relocInfo::opt_virtual_call_type ||
|
||||||
@ -2836,16 +2832,16 @@ address MacroAssembler::trampoline_call(Address entry, CodeBuffer* cbuf) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cbuf != NULL) { cbuf->set_insts_mark(); }
|
address call_pc = pc();
|
||||||
relocate(entry.rspec());
|
relocate(entry.rspec());
|
||||||
if (!far_branches()) {
|
if (!far_branches()) {
|
||||||
jal(entry.target());
|
jal(entry.target());
|
||||||
} else {
|
} else {
|
||||||
jal(pc());
|
jal(pc());
|
||||||
}
|
}
|
||||||
// just need to return a non-null address
|
|
||||||
postcond(pc() != badAddress);
|
postcond(pc() != badAddress);
|
||||||
return pc();
|
return call_pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
address MacroAssembler::ic_call(address entry, jint method_index) {
|
address MacroAssembler::ic_call(address entry, jint method_index) {
|
||||||
|
@ -598,8 +598,8 @@ public:
|
|||||||
|
|
||||||
// Jumps that can reach anywhere in the code cache.
|
// Jumps that can reach anywhere in the code cache.
|
||||||
// Trashes tmp.
|
// Trashes tmp.
|
||||||
void far_call(Address entry, CodeBuffer *cbuf = NULL, Register tmp = t0);
|
void far_call(Address entry, Register tmp = t0);
|
||||||
void far_jump(Address entry, CodeBuffer *cbuf = NULL, Register tmp = t0);
|
void far_jump(Address entry, Register tmp = t0);
|
||||||
|
|
||||||
static int far_branch_size() {
|
static int far_branch_size() {
|
||||||
if (far_branches()) {
|
if (far_branches()) {
|
||||||
@ -635,7 +635,8 @@ public:
|
|||||||
void get_polling_page(Register dest, relocInfo::relocType rtype);
|
void get_polling_page(Register dest, relocInfo::relocType rtype);
|
||||||
address read_polling_page(Register r, int32_t offset, relocInfo::relocType rtype);
|
address read_polling_page(Register r, int32_t offset, relocInfo::relocType rtype);
|
||||||
|
|
||||||
address trampoline_call(Address entry, CodeBuffer* cbuf = NULL);
|
// Return: the call PC or NULL if CodeCache is full.
|
||||||
|
address trampoline_call(Address entry);
|
||||||
address ic_call(address entry, jint method_index = 0);
|
address ic_call(address entry, jint method_index = 0);
|
||||||
|
|
||||||
// Support for memory inc/dec
|
// Support for memory inc/dec
|
||||||
|
@ -2269,7 +2269,7 @@ encode %{
|
|||||||
assert_cond(addr != NULL);
|
assert_cond(addr != NULL);
|
||||||
if (!_method) {
|
if (!_method) {
|
||||||
// A call to a runtime wrapper, e.g. new, new_typeArray_Java, uncommon_trap.
|
// A call to a runtime wrapper, e.g. new, new_typeArray_Java, uncommon_trap.
|
||||||
call = __ trampoline_call(Address(addr, relocInfo::runtime_call_type), &cbuf);
|
call = __ trampoline_call(Address(addr, relocInfo::runtime_call_type));
|
||||||
if (call == NULL) {
|
if (call == NULL) {
|
||||||
ciEnv::current()->record_failure("CodeCache is full");
|
ciEnv::current()->record_failure("CodeCache is full");
|
||||||
return;
|
return;
|
||||||
@ -2278,7 +2278,7 @@ encode %{
|
|||||||
int method_index = resolved_method_index(cbuf);
|
int method_index = resolved_method_index(cbuf);
|
||||||
RelocationHolder rspec = _optimized_virtual ? opt_virtual_call_Relocation::spec(method_index)
|
RelocationHolder rspec = _optimized_virtual ? opt_virtual_call_Relocation::spec(method_index)
|
||||||
: static_call_Relocation::spec(method_index);
|
: static_call_Relocation::spec(method_index);
|
||||||
call = __ trampoline_call(Address(addr, rspec), &cbuf);
|
call = __ trampoline_call(Address(addr, rspec));
|
||||||
if (call == NULL) {
|
if (call == NULL) {
|
||||||
ciEnv::current()->record_failure("CodeCache is full");
|
ciEnv::current()->record_failure("CodeCache is full");
|
||||||
return;
|
return;
|
||||||
@ -2287,10 +2287,10 @@ encode %{
|
|||||||
if (CodeBuffer::supports_shared_stubs() && _method->can_be_statically_bound()) {
|
if (CodeBuffer::supports_shared_stubs() && _method->can_be_statically_bound()) {
|
||||||
// Calls of the same statically bound method can share
|
// Calls of the same statically bound method can share
|
||||||
// a stub to the interpreter.
|
// a stub to the interpreter.
|
||||||
cbuf.shared_stub_to_interp_for(_method, cbuf.insts()->mark_off());
|
cbuf.shared_stub_to_interp_for(_method, call - cbuf.insts_begin());
|
||||||
} else {
|
} else {
|
||||||
// Emit stub for static call
|
// Emit stub for static call
|
||||||
address stub = CompiledStaticCall::emit_to_interp_stub(cbuf);
|
address stub = CompiledStaticCall::emit_to_interp_stub(cbuf, call);
|
||||||
if (stub == NULL) {
|
if (stub == NULL) {
|
||||||
ciEnv::current()->record_failure("CodeCache is full");
|
ciEnv::current()->record_failure("CodeCache is full");
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user