< prev index next > src/hotspot/cpu/ppc/macroAssembler_ppc.hpp
Print this page
inline int offset_to_method_toc(const address addr);
// Global TOC.
void calculate_address_from_global_toc(Register dst, address addr,
bool hi16 = true, bool lo16 = true,
! bool add_relocation = true, bool emit_dummy_addr = false);
inline void calculate_address_from_global_toc_hi16only(Register dst, address addr) {
calculate_address_from_global_toc(dst, addr, true, false);
};
inline void calculate_address_from_global_toc_lo16only(Register dst, address addr) {
calculate_address_from_global_toc(dst, addr, false, true);
inline int offset_to_method_toc(const address addr);
// Global TOC.
void calculate_address_from_global_toc(Register dst, address addr,
bool hi16 = true, bool lo16 = true,
! bool add_relocation = true, bool emit_dummy_addr = false,
+ bool add_addr_to_reloc = true);
+ void calculate_address_from_global_toc(Register dst, Label& addr,
+ bool hi16 = true, bool lo16 = true,
+ bool add_relocation = true, bool emit_dummy_addr = false) {
+ calculate_address_from_global_toc(dst, target(addr), hi16, lo16, add_relocation, emit_dummy_addr, false);
+ }
inline void calculate_address_from_global_toc_hi16only(Register dst, address addr) {
calculate_address_from_global_toc(dst, addr, true, false);
};
inline void calculate_address_from_global_toc_lo16only(Register dst, address addr) {
calculate_address_from_global_toc(dst, addr, false, true);
// some ABI-related functions
// Clobbers all volatile, (non-floating-point) general-purpose registers for debugging purposes.
// This is especially useful for making calls to the JRT in places in which this hasn't been done before;
// e.g. with the introduction of LRBs (load reference barriers) for concurrent garbage collection.
! void clobber_volatile_gprs(Register excluded_register = noreg);
void clobber_carg_stack_slots(Register tmp);
void save_nonvolatile_gprs( Register dst_base, int offset);
void restore_nonvolatile_gprs(Register src_base, int offset);
// some ABI-related functions
// Clobbers all volatile, (non-floating-point) general-purpose registers for debugging purposes.
// This is especially useful for making calls to the JRT in places in which this hasn't been done before;
// e.g. with the introduction of LRBs (load reference barriers) for concurrent garbage collection.
! void clobber_volatile_gprs(Register excluded_register = noreg) NOT_DEBUG_RETURN;
+ // Load bad values into registers that are nonvolatile according to the ABI except R16_thread and R29_TOC.
+ // This is done after vthread preemption and before vthread resume.
+ void clobber_nonvolatile_registers() NOT_DEBUG_RETURN;
void clobber_carg_stack_slots(Register tmp);
void save_nonvolatile_gprs( Register dst_base, int offset);
void restore_nonvolatile_gprs(Register src_base, int offset);
// to set up last_Java_frame in stubs; use noreg otherwise
Register last_java_sp,
// the entry point
address entry_point,
// flag which indicates if exception should be checked
! bool check_exception = true
);
// Support for VM calls. This is the base routine called by the
// different versions of call_VM_leaf. The interpreter may customize
// this version by overriding it for its purposes (e.g., to
// to set up last_Java_frame in stubs; use noreg otherwise
Register last_java_sp,
// the entry point
address entry_point,
// flag which indicates if exception should be checked
! bool check_exception = true,
+ Label* last_java_pc = nullptr
);
// Support for VM calls. This is the base routine called by the
// different versions of call_VM_leaf. The interpreter may customize
// this version by overriding it for its purposes (e.g., to
public:
// Call into the VM.
// Passes the thread pointer (in R3_ARG1) as a prepended argument.
// Makes sure oop return values are visible to the GC.
! void call_VM(Register oop_result, address entry_point, bool check_exceptions = true);
void call_VM(Register oop_result, address entry_point, Register arg_1, bool check_exceptions = true);
void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, bool check_exceptions = true);
void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, Register arg3, bool check_exceptions = true);
void call_VM_leaf(address entry_point);
void call_VM_leaf(address entry_point, Register arg_1);
public:
// Call into the VM.
// Passes the thread pointer (in R3_ARG1) as a prepended argument.
// Makes sure oop return values are visible to the GC.
! void call_VM(Register oop_result, address entry_point, bool check_exceptions = true, Label* last_java_pc = nullptr);
void call_VM(Register oop_result, address entry_point, Register arg_1, bool check_exceptions = true);
void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, bool check_exceptions = true);
void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, Register arg3, bool check_exceptions = true);
void call_VM_leaf(address entry_point);
void call_VM_leaf(address entry_point, Register arg_1);
// thread-local information).
// Support for last Java frame (but use call_VM instead where possible):
// access R16_thread->last_Java_sp.
void set_last_Java_frame(Register last_java_sp, Register last_Java_pc);
! void reset_last_Java_frame(void);
! void set_top_ijava_frame_at_SP_as_last_Java_frame(Register sp, Register tmp1);
// Read vm result from thread: oop_result = R16_thread->result;
void get_vm_result (Register oop_result);
void get_vm_result_2(Register metadata_result);
// thread-local information).
// Support for last Java frame (but use call_VM instead where possible):
// access R16_thread->last_Java_sp.
void set_last_Java_frame(Register last_java_sp, Register last_Java_pc);
! void reset_last_Java_frame(bool check_last_java_sp = true);
! void set_top_ijava_frame_at_SP_as_last_Java_frame(Register sp, Register tmp1, Label* jpc = nullptr);
// Read vm result from thread: oop_result = R16_thread->result;
void get_vm_result (Register oop_result);
void get_vm_result_2(Register metadata_result);
void asm_assert_eq(const char* msg) { asm_assert(true, msg); }
void asm_assert_ne(const char* msg) { asm_assert(false, msg); }
private:
void asm_assert_mems_zero(bool check_equal, int size, int mem_offset, Register mem_base,
! const char* msg);
public:
void asm_assert_mem8_is_zero(int mem_offset, Register mem_base, const char* msg) {
asm_assert_mems_zero(true, 8, mem_offset, mem_base, msg);
void asm_assert_eq(const char* msg) { asm_assert(true, msg); }
void asm_assert_ne(const char* msg) { asm_assert(false, msg); }
private:
void asm_assert_mems_zero(bool check_equal, int size, int mem_offset, Register mem_base,
! const char* msg) NOT_DEBUG_RETURN;
public:
void asm_assert_mem8_is_zero(int mem_offset, Register mem_base, const char* msg) {
asm_assert_mems_zero(true, 8, mem_offset, mem_base, msg);
< prev index next >