--- a/src/hotspot/cpu/s390/macroAssembler_s390.cpp Mon Nov 06 10:24:42 2017 -0800
+++ b/src/hotspot/cpu/s390/macroAssembler_s390.cpp Tue Nov 28 01:08:26 2017 +0300
@@ -2806,8 +2806,8 @@
RegisterOrConstant itable_index,
Register method_result,
Register temp1_reg,
- Register temp2_reg,
- Label& no_such_interface) {
+ Label& no_such_interface,
+ bool return_method) {
const Register vtable_len = temp1_reg; // Used to compute itable_entry_addr.
const Register itable_entry_addr = Z_R1_scratch;
@@ -2842,38 +2842,36 @@
z_brne(search);
// Entry found and itable_entry_addr points to it, get offset of vtable for interface.
-
- const int vtable_offset_offset = (itableOffsetEntry::offset_offset_in_bytes() -
- itableOffsetEntry::interface_offset_in_bytes()) -
- itable_offset_search_inc;
-
- // Compute itableMethodEntry and get method and entry point
- // we use addressing with index and displacement, since the formula
- // for computing the entry's offset has a fixed and a dynamic part,
- // the latter depending on the matched interface entry and on the case,
- // that the itable index has been passed as a register, not a constant value.
- int method_offset = itableMethodEntry::method_offset_in_bytes();
- // Fixed part (displacement), common operand.
- Register itable_offset; // Dynamic part (index register).
-
- if (itable_index.is_register()) {
- // Compute the method's offset in that register, for the formula, see the
- // else-clause below.
- itable_offset = itable_index.as_register();
-
- z_sllg(itable_offset, itable_offset, exact_log2(itableMethodEntry::size() * wordSize));
- z_agf(itable_offset, vtable_offset_offset, itable_entry_addr);
- } else {
- itable_offset = Z_R1_scratch;
- // Displacement increases.
- method_offset += itableMethodEntry::size() * wordSize * itable_index.as_constant();
-
- // Load index from itable.
- z_llgf(itable_offset, vtable_offset_offset, itable_entry_addr);
- }
-
- // Finally load the method's oop.
- z_lg(method_result, method_offset, itable_offset, recv_klass);
+ if (return_method) {
+ const int vtable_offset_offset = (itableOffsetEntry::offset_offset_in_bytes() -
+ itableOffsetEntry::interface_offset_in_bytes()) -
+ itable_offset_search_inc;
+
+ // Compute itableMethodEntry and get method and entry point
+ // we use addressing with index and displacement, since the formula
+ // for computing the entry's offset has a fixed and a dynamic part,
+ // the latter depending on the matched interface entry and on the case,
+ // that the itable index has been passed as a register, not a constant value.
+ int method_offset = itableMethodEntry::method_offset_in_bytes();
+ // Fixed part (displacement), common operand.
+ Register itable_offset = method_result; // Dynamic part (index register).
+
+ if (itable_index.is_register()) {
+ // Compute the method's offset in that register, for the formula, see the
+ // else-clause below.
+ z_sllg(itable_offset, itable_index.as_register(), exact_log2(itableMethodEntry::size() * wordSize));
+ z_agf(itable_offset, vtable_offset_offset, itable_entry_addr);
+ } else {
+ // Displacement increases.
+ method_offset += itableMethodEntry::size() * wordSize * itable_index.as_constant();
+
+ // Load index from itable.
+ z_llgf(itable_offset, vtable_offset_offset, itable_entry_addr);
+ }
+
+ // Finally load the method's oop.
+ z_lg(method_result, method_offset, itable_offset, recv_klass);
+ }
BLOCK_COMMENT("} lookup_interface_method");
}