< prev index next >

src/cpu/s390/vm/methodHandles_s390.cpp

Print this page

        

@@ -1,8 +1,8 @@
 /*
  * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2016 SAP SE. All rights reserved.
+ * Copyright (c) 2016, 2017, SAP SE. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.

@@ -607,18 +607,18 @@
 }
 
 void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) {
   if (!TraceMethodHandles) { return; }
 
+  // If arg registers are contiguous, we can use STMG/LMG.
+  assert((Z_ARG5->encoding() - Z_ARG1->encoding() + 1) == RegisterImpl::number_of_arg_registers, "Oops");
+
   BLOCK_COMMENT("trace_method_handle {");
 
   // Save argument registers (they are used in raise exception stub).
-  __ z_stg(Z_ARG1, Address(Z_SP, 16));
-  __ z_stg(Z_ARG2, Address(Z_SP, 24));
-  __ z_stg(Z_ARG3, Address(Z_SP, 32));
-  __ z_stg(Z_ARG4, Address(Z_SP, 40));
-  __ z_stg(Z_ARG5, Address(Z_SP, 48));
+  // Argument registers have contiguous register numbers -> we can use stmg/lmg.
+  __ z_stmg(Z_ARG1, Z_ARG5, 16, Z_SP);
 
   // Setup arguments.
   __ z_lgr(Z_ARG2, Z_ARG4); // mh, see generate_method_handle_interpreter_entry()
   __ z_lgr(Z_ARG3, Z_R10);  // sender_sp
   __ z_lgr(Z_ARG4, Z_esp);

@@ -627,15 +627,13 @@
   __ save_return_pc();      // saves Z_R14
   __ push_frame_abi160(0);
   __ call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub));
   __ pop_frame();
   __ restore_return_pc();   // restores to Z_R14
-  __ z_lg(Z_ARG1, Address(Z_SP, 16));
-  __ z_lg(Z_ARG2, Address(Z_SP, 24));
-  __ z_lg(Z_ARG3, Address(Z_SP, 32));
-  __ z_lg(Z_ARG4, Address(Z_SP, 40));
-  __ z_lg(Z_ARG5, Address(Z_SP, 45));
+
+  // Restore argument registers
+  __ z_lmg(Z_ARG1, Z_ARG5, 16, Z_SP);
   __ zap_from_to(Z_SP, Z_SP, Z_R0, Z_R1, 50, -1);
   __ zap_from_to(Z_SP, Z_SP, Z_R0, Z_R1, -1, 5);
 
   BLOCK_COMMENT("} trace_method_handle");
 }
< prev index next >