--- openjdk/hotspot/src/cpu/aarch32/vm/macroAssembler_aarch32.cpp 2016-10-03 17:06:18.000000000 +0300
+++ openjdk/hotspot/src/cpu/aarch32/vm/macroAssembler_aarch32.cpp 2016-10-03 17:06:18.000000000 +0300
@@ -863,11 +863,7 @@
RegisterOrConstant vtable_index,
Register method_result) {
const int base = InstanceKlass::vtable_start_offset() * wordSize;
- //assert(vtableEntry::size() * wordSize == 8,
- // "adjust the scaling in the code below");
- // FIXME What scaling needs changing as indexes address by one word
int vtable_offset_in_bytes = base + vtableEntry::method_offset_in_bytes();
-
if (vtable_index.is_register()) {
lea(method_result, Address(recv_klass,
vtable_index.as_register(),
@@ -875,7 +871,12 @@
ldr(method_result, Address(method_result, vtable_offset_in_bytes));
} else {
vtable_offset_in_bytes += vtable_index.as_constant() * wordSize;
- ldr(method_result, Address(recv_klass, vtable_offset_in_bytes));
+ if(is_valid_for_offset_imm(vtable_offset_in_bytes, 12)) {
+ ldr(method_result, Address(recv_klass, vtable_offset_in_bytes));
+ } else {
+ mov(method_result, vtable_offset_in_bytes);
+ ldr(method_result, Address(recv_klass, method_result));
+ }
}
}