--- a/hotspot/src/cpu/aarch64/vm/nativeInst_aarch64.cpp Wed Feb 10 16:31:17 2016 +0000
+++ b/hotspot/src/cpu/aarch64/vm/nativeInst_aarch64.cpp Wed Feb 10 11:23:17 2016 -1000
@@ -136,7 +136,7 @@
MacroAssembler::pd_patch_instruction(instruction_address(), (address)x);
ICache::invalidate_range(instruction_address(), instruction_size);
}
-};
+}
void NativeMovConstReg::print() {
tty->print_cr(PTR_FORMAT ": mov reg, " INTPTR_FORMAT,
@@ -208,6 +208,32 @@
//-------------------------------------------------------------------
+address NativeGeneralJump::jump_destination() const {
+ NativeMovConstReg* move = nativeMovConstReg_at(instruction_address());
+ address dest = (address) move->data();
+
+ // We use jump to self as the unresolved address which the inline
+ // cache code (and relocs) know about
+
+ // return -1 if jump to self
+ dest = (dest == (address) this) ? (address) -1 : dest;
+ return dest;
+}
+
+void NativeGeneralJump::set_jump_destination(address dest) {
+ NativeMovConstReg* move = nativeMovConstReg_at(instruction_address());
+
+ // We use jump to self as the unresolved address which the inline
+ // cache code (and relocs) know about
+ if (dest == (address) -1) {
+ dest = instruction_address();
+ }
+
+ move->set_data((uintptr_t) dest);
+};
+
+//-------------------------------------------------------------------
+
bool NativeInstruction::is_safepoint_poll() {
// a safepoint_poll is implemented in two steps as either
//
@@ -249,6 +275,22 @@
Instruction_aarch64::extract(insn, 4, 0) == 0b11111);
}
+bool NativeInstruction::is_general_jump() {
+ if (is_movz()) {
+ NativeInstruction* inst1 = nativeInstruction_at(addr_at(instruction_size * 1));
+ if (inst1->is_movk()) {
+ NativeInstruction* inst2 = nativeInstruction_at(addr_at(instruction_size * 2));
+ if (inst2->is_movk()) {
+ NativeInstruction* inst3 = nativeInstruction_at(addr_at(instruction_size * 3));
+ if (inst3->is_blr()) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
bool NativeInstruction::is_movz() {
return Instruction_aarch64::extract(int_at(0), 30, 23) == 0b10100101;
}