< prev index next > src/hotspot/cpu/riscv/macroAssembler_riscv.cpp
Print this page
while ((offset() + extra_offset) % modulus != 0) { nop(); }
return (int)(offset() - before);
}
void MacroAssembler::call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions) {
! call_VM_base(oop_result, noreg, noreg, entry_point, number_of_arguments, check_exceptions);
}
// Implementation of call_VM versions
void MacroAssembler::call_VM(Register oop_result,
while ((offset() + extra_offset) % modulus != 0) { nop(); }
return (int)(offset() - before);
}
void MacroAssembler::call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions) {
! call_VM_base(oop_result, noreg, noreg, nullptr, entry_point, number_of_arguments, check_exceptions);
}
// Implementation of call_VM versions
void MacroAssembler::call_VM(Register oop_result,
void MacroAssembler::call_VM(Register oop_result,
Register last_java_sp,
address entry_point,
int number_of_arguments,
bool check_exceptions) {
! call_VM_base(oop_result, xthread, last_java_sp, entry_point, number_of_arguments, check_exceptions);
}
void MacroAssembler::call_VM(Register oop_result,
Register last_java_sp,
address entry_point,
void MacroAssembler::call_VM(Register oop_result,
Register last_java_sp,
address entry_point,
int number_of_arguments,
bool check_exceptions) {
! call_VM_base(oop_result, xthread, last_java_sp, nullptr, entry_point, number_of_arguments, check_exceptions);
}
void MacroAssembler::call_VM(Register oop_result,
Register last_java_sp,
address entry_point,
// Always clear the pc because it could have been set by make_walkable()
sd(zr, Address(xthread, JavaThread::last_Java_pc_offset()));
}
- static bool is_preemptable(address entry_point) {
- return entry_point == CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorenter);
- }
-
void MacroAssembler::call_VM_base(Register oop_result,
Register java_thread,
Register last_java_sp,
address entry_point,
int number_of_arguments,
bool check_exceptions) {
// determine java_thread register
if (!java_thread->is_valid()) {
java_thread = xthread;
}
// determine last_java_sp register
if (!last_java_sp->is_valid()) {
last_java_sp = esp;
}
// Always clear the pc because it could have been set by make_walkable()
sd(zr, Address(xthread, JavaThread::last_Java_pc_offset()));
}
void MacroAssembler::call_VM_base(Register oop_result,
Register java_thread,
Register last_java_sp,
+ Label* return_pc,
address entry_point,
int number_of_arguments,
bool check_exceptions) {
// determine java_thread register
if (!java_thread->is_valid()) {
java_thread = xthread;
}
+
// determine last_java_sp register
if (!last_java_sp->is_valid()) {
last_java_sp = esp;
}
// set last Java frame before call
assert(last_java_sp != fp, "can't use fp");
Label l;
! if (is_preemptable(entry_point)) {
- // skip setting last_pc since we already set it to desired value.
- set_last_Java_frame(last_java_sp, fp, noreg);
- } else {
- set_last_Java_frame(last_java_sp, fp, l, t0);
- }
// do the call, remove parameters
MacroAssembler::call_VM_leaf_base(entry_point, number_of_arguments, &l);
// reset last Java frame
// set last Java frame before call
assert(last_java_sp != fp, "can't use fp");
Label l;
! set_last_Java_frame(last_java_sp, fp, return_pc != nullptr ? *return_pc : l, t0);
// do the call, remove parameters
MacroAssembler::call_VM_leaf_base(entry_point, number_of_arguments, &l);
// reset last Java frame
< prev index next >