< prev index next >
src/cpu/aarch64/vm/nativeInst_aarch64.hpp
Print this page
@@ -52,15 +52,26 @@
class NativeInstruction VALUE_OBJ_CLASS_SPEC {
friend class Relocation;
friend bool is_NativeCallTrampolineStub_at(address);
public:
- enum { instruction_size = 4 };
+ enum {
+ instruction_size = 4
+ };
+
+ 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();
bool is_jump();
+ bool is_general_jump();
inline bool is_jump_or_nop();
inline bool is_cond_jump();
bool is_safepoint_poll();
bool is_movz();
bool is_movk();
@@ -339,15 +350,19 @@
};
// An interface for accessing/manipulating native leal instruction of form:
// leal reg, [reg + offset]
-class NativeLoadAddress: public NativeMovRegMem {
- static const bool has_rex = true;
- static const int rex_size = 1;
- public:
+class NativeLoadAddress: public NativeInstruction {
+ enum AArch64_specific_constants {
+ instruction_size = 4,
+ instruction_offset = 0,
+ data_offset = 0,
+ next_instruction_offset = 4
+ };
+ public:
void verify();
void print ();
// unit test stuff
static void test() {}
@@ -396,10 +411,14 @@
instruction_size = 4 * 4,
instruction_offset = 0,
data_offset = 0,
next_instruction_offset = 4 * 4
};
+
+ address jump_destination() const;
+ void set_jump_destination(address dest);
+
static void insert_unconditional(address code_pos, address entry);
static void replace_mt_safe(address instr_addr, address code_buffer);
static void verify();
};
< prev index next >