< prev index next >
src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp
Print this page
rev 48402 : 8193260: AArch64: JVMCI: Implement trampoline calls
Reviewed-by: adinn
*** 59,69 ****
juint encoding() const {
return uint_at(0);
}
! bool is_blr() const { return (encoding() & 0xfffffc1f) == 0xd63f0000; }
bool is_adr_aligned() const { return (encoding() & 0xff000000) == 0x10000000; } // adr Xn, <label>, where label is aligned to 4 bytes (address of instruction).
inline bool is_nop();
inline bool is_illegal();
inline bool is_return();
--- 59,69 ----
juint encoding() const {
return uint_at(0);
}
! bool is_blr() const { return (encoding() & 0xff9ffc1f) == 0xd61f0000; } // blr(register) or br(register)
bool is_adr_aligned() const { return (encoding() & 0xff000000) == 0x10000000; } // adr Xn, <label>, where label is aligned to 4 bytes (address of instruction).
inline bool is_nop();
inline bool is_illegal();
inline bool is_return();
*** 141,163 ****
inline NativeInstruction* nativeInstruction_at(uint32_t *address) {
return (NativeInstruction*)address;
}
inline NativeCall* nativeCall_at(address address);
! // The NativeCall is an abstraction for accessing/manipulating native call imm32/rel32off
! // instructions (used to manipulate inline caches, primitive & dll calls, etc.).
class NativeCall: public NativeInstruction {
public:
enum Aarch64_specific_constants {
instruction_size = 4,
instruction_offset = 0,
displacement_offset = 0,
return_address_offset = 4
};
- enum { cache_line_size = BytesPerWord }; // conservative estimate!
address instruction_address() const { return addr_at(instruction_offset); }
address next_instruction_address() const { return addr_at(return_address_offset); }
int displacement() const { return (int_at(displacement_offset) << 6) >> 4; }
address displacement_address() const { return addr_at(displacement_offset); }
address return_address() const { return addr_at(return_address_offset); }
--- 141,163 ----
inline NativeInstruction* nativeInstruction_at(uint32_t *address) {
return (NativeInstruction*)address;
}
inline NativeCall* nativeCall_at(address address);
! // The NativeCall is an abstraction for accessing/manipulating native
! // call instructions (used to manipulate inline caches, primitive &
! // DSO calls, etc.).
class NativeCall: public NativeInstruction {
public:
enum Aarch64_specific_constants {
instruction_size = 4,
instruction_offset = 0,
displacement_offset = 0,
return_address_offset = 4
};
address instruction_address() const { return addr_at(instruction_offset); }
address next_instruction_address() const { return addr_at(return_address_offset); }
int displacement() const { return (int_at(displacement_offset) << 6) >> 4; }
address displacement_address() const { return addr_at(displacement_offset); }
address return_address() const { return addr_at(return_address_offset); }
*** 204,213 ****
--- 204,214 ----
// The parameter assert_lock disables the assertion during code generation.
void set_destination_mt_safe(address dest, bool assert_lock = true);
address get_trampoline();
+ address trampoline_jump(CodeBuffer &cbuf, address dest);
};
inline NativeCall* nativeCall_at(address address) {
NativeCall* call = (NativeCall*)(address - NativeCall::instruction_offset);
#ifdef ASSERT
< prev index next >