< prev index next >
src/cpu/ppc/vm/macroAssembler_ppc.cpp
Print this page
rev 7507 : 8066964: ppc64: argument and return type profiling, fix problem with popframe
*** 805,814 ****
--- 805,815 ----
lfd(F31, offset, src);
}
// For verify_oops.
void MacroAssembler::save_volatile_gprs(Register dst, int offset) {
+ std(R2, offset, dst); offset += 8;
std(R3, offset, dst); offset += 8;
std(R4, offset, dst); offset += 8;
std(R5, offset, dst); offset += 8;
std(R6, offset, dst); offset += 8;
std(R7, offset, dst); offset += 8;
*** 819,828 ****
--- 820,830 ----
std(R12, offset, dst);
}
// For verify_oops.
void MacroAssembler::restore_volatile_gprs(Register src, int offset) {
+ ld(R2, offset, src); offset += 8;
ld(R3, offset, src); offset += 8;
ld(R4, offset, src); offset += 8;
ld(R5, offset, src); offset += 8;
ld(R6, offset, src); offset += 8;
ld(R7, offset, src); offset += 8;
*** 1185,1194 ****
--- 1187,1206 ----
assert(arg_2 != R4_ARG2, "smashed argument");
mr_if_needed(R5_ARG3, arg_2);
call_VM(oop_result, entry_point, check_exceptions);
}
+ void MacroAssembler::call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, Register arg_3,
+ bool check_exceptions) {
+ // R3_ARG1 is reserved for the thread
+ mr_if_needed(R4_ARG2, arg_1);
+ assert(arg_2 != R4_ARG2, "smashed argument");
+ mr_if_needed(R5_ARG3, arg_2);
+ mr_if_needed(R6_ARG4, arg_3);
+ call_VM(oop_result, entry_point, check_exceptions);
+ }
+
void MacroAssembler::call_VM_leaf(address entry_point) {
call_VM_leaf_base(entry_point);
}
void MacroAssembler::call_VM_leaf(address entry_point, Register arg_1) {
*** 3057,3095 ****
// READ: oop. KILL: R0. Volatile floats perhaps.
void MacroAssembler::verify_oop(Register oop, const char* msg) {
if (!VerifyOops) {
return;
}
! // Will be preserved.
! Register tmp = R11;
! assert(oop != tmp, "precondition");
! unsigned int nbytes_save = 10*8; // 10 volatile gprs
address/* FunctionDescriptor** */fd = StubRoutines::verify_oop_subroutine_entry_address();
! // save tmp
! mr(R0, tmp);
! // kill tmp
! save_LR_CR(tmp);
push_frame_reg_args(nbytes_save, tmp);
- // restore tmp
- mr(tmp, R0);
- save_volatile_gprs(R1_SP, 112); // except R0
// load FunctionDescriptor** / entry_address *
! load_const(tmp, fd);
// load FunctionDescriptor* / entry_address
ld(tmp, 0, tmp);
! mr(R4_ARG2, oop);
! load_const(R3_ARG1, (address)msg);
! // call destination for its side effect
call_c(tmp);
! restore_volatile_gprs(R1_SP, 112); // except R0
pop_frame();
- // save tmp
- mr(R0, tmp);
- // kill tmp
restore_LR_CR(tmp);
! // restore tmp
! mr(tmp, R0);
}
const char* stop_types[] = {
"stop",
"untested",
--- 3069,3099 ----
// READ: oop. KILL: R0. Volatile floats perhaps.
void MacroAssembler::verify_oop(Register oop, const char* msg) {
if (!VerifyOops) {
return;
}
!
address/* FunctionDescriptor** */fd = StubRoutines::verify_oop_subroutine_entry_address();
! const Register tmp = R11; // Will be preserved.
! const int nbytes_save = 11*8; // Volatile gprs except R0.
! save_volatile_gprs(R1_SP, -nbytes_save); // except R0
!
! if (oop == tmp) mr(R4_ARG2, oop);
! save_LR_CR(tmp); // save in old frame
push_frame_reg_args(nbytes_save, tmp);
// load FunctionDescriptor** / entry_address *
! load_const_optimized(tmp, fd, R0);
// load FunctionDescriptor* / entry_address
ld(tmp, 0, tmp);
! if (oop != tmp) mr_if_needed(R4_ARG2, oop);
! load_const_optimized(R3_ARG1, (address)msg, R0);
! // Call destination for its side effect.
call_c(tmp);
!
pop_frame();
restore_LR_CR(tmp);
! restore_volatile_gprs(R1_SP, -nbytes_save); // except R0
}
const char* stop_types[] = {
"stop",
"untested",
< prev index next >