src/hotspot/cpu/s390/c1_Runtime1_s390.cpp
author coleenp
Mon, 04 Jun 2018 10:18:43 -0400
changeset 50380 bec342339138
parent 49906 4bb58f644e4e
child 54786 ebf733a324d4
permissions -rw-r--r--
8204195: Clean up macroAssembler.inline.hpp and other inline.hpp files included in .hpp files Summary: Moved macroAssembler.inline.hpp out of header file and distributed to .cpp files that included them: ie. c1_MacroAssembler.hpp and interp_masm.hpp. Also freeList.inline.hpp and allocation.inline.hpp. Reviewed-by: jiangli, kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     1
/*
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 49010
diff changeset
     2
 * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     3
 * Copyright (c) 2016 SAP SE. All rights reserved.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     5
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     8
 * published by the Free Software Foundation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     9
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    14
 * accompanied this code).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    15
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    19
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    22
 * questions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    23
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    24
 */
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    25
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    26
#include "precompiled.hpp"
50380
bec342339138 8204195: Clean up macroAssembler.inline.hpp and other inline.hpp files included in .hpp files
coleenp
parents: 49906
diff changeset
    27
#include "asm/macroAssembler.inline.hpp"
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    28
#include "c1/c1_Defs.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    29
#include "c1/c1_MacroAssembler.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    30
#include "c1/c1_Runtime1.hpp"
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 49010
diff changeset
    31
#include "ci/ciUtilities.hpp"
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 49010
diff changeset
    32
#include "gc/shared/cardTable.hpp"
49455
848864ed9b17 8199604: Rename CardTableModRefBS to CardTableBarrierSet
eosterlund
parents: 49347
diff changeset
    33
#include "gc/shared/cardTableBarrierSet.hpp"
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    34
#include "interpreter/interpreter.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    35
#include "nativeInst_s390.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    36
#include "oops/compiledICHolder.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    37
#include "oops/oop.inline.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    38
#include "prims/jvmtiExport.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    39
#include "register_s390.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    40
#include "runtime/sharedRuntime.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    41
#include "runtime/signature.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    42
#include "runtime/vframeArray.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    43
#include "utilities/macros.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    44
#include "vmreg_s390.inline.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    45
#include "registerSaver_s390.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    46
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    47
// Implementation of StubAssembler
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    48
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    49
int StubAssembler::call_RT(Register oop_result1, Register metadata_result, address entry_point, int number_of_arguments) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    50
  set_num_rt_args(0); // Nothing on stack.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    51
  assert(!(oop_result1->is_valid() || metadata_result->is_valid()) || oop_result1 != metadata_result, "registers must be different");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    52
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    53
  // We cannot trust that code generated by the C++ compiler saves R14
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    54
  // to z_abi_160.return_pc, because sometimes it spills R14 using stmg at
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    55
  // z_abi_160.gpr14 (e.g. InterpreterRuntime::_new()).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    56
  // Therefore we load the PC into Z_R1_scratch and let set_last_Java_frame() save
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    57
  // it into the frame anchor.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    58
  address pc = get_PC(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    59
  int call_offset = (int)(pc - addr_at(0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    60
  set_last_Java_frame(Z_SP, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    61
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    62
  // ARG1 must hold thread address.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    63
  z_lgr(Z_ARG1, Z_thread);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    65
  address return_pc = NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    66
  align_call_far_patchable(this->pc());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    67
  return_pc = call_c_opt(entry_point);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    68
  assert(return_pc != NULL, "const section overflow");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    69
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    70
  reset_last_Java_frame();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    71
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    72
  // Check for pending exceptions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    73
  {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    74
    load_and_test_long(Z_R0_scratch, Address(Z_thread, Thread::pending_exception_offset()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    75
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    76
    // This used to conditionally jump to forward_exception however it is
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    77
    // possible if we relocate that the branch will not reach. So we must jump
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    78
    // around so we can always reach.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    79
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    80
    Label ok;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    81
    z_bre(ok); // Bcondequal is the same as bcondZero.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    82
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    83
    // exception pending => forward to exception handler
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    84
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    85
    // Make sure that the vm_results are cleared.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    86
    if (oop_result1->is_valid()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    87
      clear_mem(Address(Z_thread, JavaThread::vm_result_offset()), sizeof(jlong));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    88
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    89
    if (metadata_result->is_valid()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    90
      clear_mem(Address(Z_thread, JavaThread::vm_result_2_offset()), sizeof(jlong));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    91
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    92
    if (frame_size() == no_frame_size) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    93
      // Pop the stub frame.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    94
      pop_frame();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    95
      restore_return_pc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    96
      load_const_optimized(Z_R1, StubRoutines::forward_exception_entry());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    97
      z_br(Z_R1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    98
    } else if (_stub_id == Runtime1::forward_exception_id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    99
      should_not_reach_here();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   100
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   101
      load_const_optimized(Z_R1, Runtime1::entry_for (Runtime1::forward_exception_id));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   102
      z_br(Z_R1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   103
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   104
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   105
    bind(ok);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   106
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   107
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   108
  // Get oop results if there are any and reset the values in the thread.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   109
  if (oop_result1->is_valid()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   110
    get_vm_result(oop_result1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   111
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   112
  if (metadata_result->is_valid()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   113
    get_vm_result_2(metadata_result);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   114
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   115
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   116
  return call_offset;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   117
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   118
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   119
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   120
int StubAssembler::call_RT(Register oop_result1, Register metadata_result, address entry, Register arg1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   121
  // Z_ARG1 is reserved for the thread.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   122
  lgr_if_needed(Z_ARG2, arg1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   123
  return call_RT(oop_result1, metadata_result, entry, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   124
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   125
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   126
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   127
int StubAssembler::call_RT(Register oop_result1, Register metadata_result, address entry, Register arg1, Register arg2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   128
  // Z_ARG1 is reserved for the thread.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   129
  lgr_if_needed(Z_ARG2, arg1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   130
  assert(arg2 != Z_ARG2, "smashed argument");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   131
  lgr_if_needed(Z_ARG3, arg2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   132
  return call_RT(oop_result1, metadata_result, entry, 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   133
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   134
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   135
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   136
int StubAssembler::call_RT(Register oop_result1, Register metadata_result, address entry, Register arg1, Register arg2, Register arg3) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   137
  // Z_ARG1 is reserved for the thread.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   138
  lgr_if_needed(Z_ARG2, arg1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   139
  assert(arg2 != Z_ARG2, "smashed argument");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   140
  lgr_if_needed(Z_ARG3, arg2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   141
  assert(arg3 != Z_ARG3, "smashed argument");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   142
  lgr_if_needed(Z_ARG4, arg3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   143
  return call_RT(oop_result1, metadata_result, entry, 3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   144
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   145
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   146
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   147
// Implementation of Runtime1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   148
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   149
#define __ sasm->
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   150
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   151
#ifndef PRODUCT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   152
#undef  __
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   153
#define __ (Verbose ? (sasm->block_comment(FILE_AND_LINE),sasm):sasm)->
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   154
#endif // !PRODUCT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   155
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   156
#define BLOCK_COMMENT(str) if (PrintAssembly) __ block_comment(str)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   157
#define BIND(label)        bind(label); BLOCK_COMMENT(#label ":")
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   158
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   159
static OopMap* generate_oop_map(StubAssembler* sasm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   160
  RegisterSaver::RegisterSet reg_set = RegisterSaver::all_registers;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   161
  int frame_size_in_slots =
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   162
    RegisterSaver::live_reg_frame_size(reg_set) / VMRegImpl::stack_slot_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   163
  sasm->set_frame_size(frame_size_in_slots / VMRegImpl::slots_per_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   164
  return RegisterSaver::generate_oop_map(sasm, reg_set);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   165
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   166
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   167
static OopMap* save_live_registers(StubAssembler* sasm, bool save_fpu_registers = true, Register return_pc = Z_R14) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   168
  __ block_comment("save_live_registers");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   169
  RegisterSaver::RegisterSet reg_set =
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   170
    save_fpu_registers ? RegisterSaver::all_registers : RegisterSaver::all_integer_registers;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   171
  int frame_size_in_slots =
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   172
    RegisterSaver::live_reg_frame_size(reg_set) / VMRegImpl::stack_slot_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   173
  sasm->set_frame_size(frame_size_in_slots / VMRegImpl::slots_per_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   174
  return RegisterSaver::save_live_registers(sasm, reg_set, return_pc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   175
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   176
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   177
static OopMap* save_live_registers_except_r2(StubAssembler* sasm, bool save_fpu_registers = true) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   178
  if (!save_fpu_registers) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   179
    __ unimplemented(FILE_AND_LINE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   180
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   181
  __ block_comment("save_live_registers");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   182
  RegisterSaver::RegisterSet reg_set = RegisterSaver::all_registers_except_r2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   183
  int frame_size_in_slots =
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   184
      RegisterSaver::live_reg_frame_size(reg_set) / VMRegImpl::stack_slot_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   185
  sasm->set_frame_size(frame_size_in_slots / VMRegImpl::slots_per_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   186
  return RegisterSaver::save_live_registers(sasm, reg_set);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   187
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   188
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   189
static void restore_live_registers(StubAssembler* sasm, bool restore_fpu_registers = true) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   190
  __ block_comment("restore_live_registers");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   191
  RegisterSaver::RegisterSet reg_set =
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   192
    restore_fpu_registers ? RegisterSaver::all_registers : RegisterSaver::all_integer_registers;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   193
  RegisterSaver::restore_live_registers(sasm, reg_set);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   194
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   195
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   196
static void restore_live_registers_except_r2(StubAssembler* sasm, bool restore_fpu_registers = true) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   197
  if (!restore_fpu_registers) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   198
    __ unimplemented(FILE_AND_LINE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   199
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   200
  __ block_comment("restore_live_registers_except_r2");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   201
  RegisterSaver::restore_live_registers(sasm, RegisterSaver::all_registers_except_r2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   202
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   203
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   204
void Runtime1::initialize_pd() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   205
  // Nothing to do.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   206
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   207
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   208
OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address target, bool has_argument) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   209
  // Make a frame and preserve the caller's caller-save registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   210
  OopMap* oop_map = save_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   211
  int call_offset;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   212
  if (!has_argument) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   213
    call_offset = __ call_RT(noreg, noreg, target);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   214
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   215
    call_offset = __ call_RT(noreg, noreg, target, Z_R1_scratch, Z_R0_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   216
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   217
  OopMapSet* oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   218
  oop_maps->add_gc_map(call_offset, oop_map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   219
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   220
  __ should_not_reach_here();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   221
  return oop_maps;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   222
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   223
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   224
void Runtime1::generate_unwind_exception(StubAssembler *sasm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   225
  // Incoming parameters: Z_EXC_OOP and Z_EXC_PC.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   226
  // Keep copies in callee-saved registers during runtime call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   227
  const Register exception_oop_callee_saved = Z_R11;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   228
  const Register exception_pc_callee_saved = Z_R12;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   229
  // Other registers used in this stub.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   230
  const Register handler_addr = Z_R4;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   231
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   232
  // Verify that only exception_oop, is valid at this time.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   233
  __ invalidate_registers(Z_EXC_OOP, Z_EXC_PC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   234
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   235
  // Check that fields in JavaThread for exception oop and issuing pc are set.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   236
  __ asm_assert_mem8_is_zero(in_bytes(JavaThread::exception_oop_offset()), Z_thread, "exception oop already set : " FILE_AND_LINE, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   237
  __ asm_assert_mem8_is_zero(in_bytes(JavaThread::exception_pc_offset()), Z_thread, "exception pc already set : " FILE_AND_LINE, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   238
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   239
  // Save exception_oop and pc in callee-saved register to preserve it
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   240
  // during runtime calls.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   241
  __ verify_not_null_oop(Z_EXC_OOP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   242
  __ lgr_if_needed(exception_oop_callee_saved, Z_EXC_OOP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   243
  __ lgr_if_needed(exception_pc_callee_saved, Z_EXC_PC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   244
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   245
  __ push_frame_abi160(0); // Runtime code needs the z_abi_160.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   246
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   247
  // Search the exception handler address of the caller (using the return address).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   248
  __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::exception_handler_for_return_address), Z_thread, Z_EXC_PC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   249
  // Z_RET(Z_R2): exception handler address of the caller.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   250
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   251
  __ pop_frame();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   252
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   253
  __ invalidate_registers(exception_oop_callee_saved, exception_pc_callee_saved, Z_RET);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   254
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   255
  // Move result of call into correct register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   256
  __ lgr_if_needed(handler_addr, Z_RET);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   257
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   258
  // Restore exception oop and pc to Z_EXC_OOP and Z_EXC_PC (required convention of exception handler).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   259
  __ lgr_if_needed(Z_EXC_OOP, exception_oop_callee_saved);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   260
  __ lgr_if_needed(Z_EXC_PC, exception_pc_callee_saved);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   261
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   262
  // Verify that there is really a valid exception in Z_EXC_OOP.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   263
  __ verify_not_null_oop(Z_EXC_OOP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   264
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   265
  __ z_br(handler_addr); // Jump to exception handler.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   266
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   267
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   268
OopMapSet* Runtime1::generate_patching(StubAssembler* sasm, address target) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   269
  // Make a frame and preserve the caller's caller-save registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   270
  OopMap* oop_map = save_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   271
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   272
  // Call the runtime patching routine, returns non-zero if nmethod got deopted.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   273
  int call_offset = __ call_RT(noreg, noreg, target);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   274
  OopMapSet* oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   275
  oop_maps->add_gc_map(call_offset, oop_map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   276
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   277
  // Re-execute the patched instruction or, if the nmethod was
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   278
  // deoptmized, return to the deoptimization handler entry that will
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   279
  // cause re-execution of the current bytecode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   280
  DeoptimizationBlob* deopt_blob = SharedRuntime::deopt_blob();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   281
  assert(deopt_blob != NULL, "deoptimization blob must have been created");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   282
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   283
  __ z_ltr(Z_RET, Z_RET); // return value == 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   284
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   285
  restore_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   286
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   287
  __ z_bcr(Assembler::bcondZero, Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   288
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   289
  // Return to the deoptimization handler entry for unpacking and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   290
  // rexecute if we simply returned then we'd deopt as if any call we
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   291
  // patched had just returned.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   292
  AddressLiteral dest(deopt_blob->unpack_with_reexecution());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   293
  __ load_const_optimized(Z_R1_scratch, dest);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   294
  __ z_br(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   295
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   296
  return oop_maps;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   297
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   298
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   299
OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   300
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   301
  // for better readability
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   302
  const bool must_gc_arguments = true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   303
  const bool dont_gc_arguments = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   304
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   305
  // Default value; overwritten for some optimized stubs that are
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   306
  // called from methods that do not use the fpu.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   307
  bool save_fpu_registers = true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   308
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   309
  // Stub code and info for the different stubs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   310
  OopMapSet* oop_maps = NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   311
  switch (id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   312
    case forward_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   313
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   314
        oop_maps = generate_handle_exception(id, sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   315
        // will not return
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   316
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   317
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   318
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   319
    case new_instance_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   320
    case fast_new_instance_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   321
    case fast_new_instance_init_check_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   322
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   323
        Register klass    = Z_R11; // Incoming
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   324
        Register obj      = Z_R2;  // Result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   325
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   326
        if (id == new_instance_id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   327
          __ set_info("new_instance", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   328
        } else if (id == fast_new_instance_id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   329
          __ set_info("fast new_instance", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   330
        } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   331
          assert(id == fast_new_instance_init_check_id, "bad StubID");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   332
          __ set_info("fast new_instance init check", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   333
        }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   334
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   335
        OopMap* map = save_live_registers_except_r2(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   336
        int call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_instance), klass);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   337
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   338
        oop_maps->add_gc_map(call_offset, map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   339
        restore_live_registers_except_r2(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   340
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   341
        __ verify_oop(obj);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   342
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   343
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   344
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   345
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   346
    case counter_overflow_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   347
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   348
        // Arguments :
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   349
        //   bci    : stack param 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   350
        //   method : stack param 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   351
        //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   352
        Register bci = Z_ARG2, method = Z_ARG3;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   353
        // frame size in bytes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   354
        OopMap* map = save_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   355
        const int frame_size = sasm->frame_size() * VMRegImpl::slots_per_word * VMRegImpl::stack_slot_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   356
        __ z_lg(bci,    0*BytesPerWord + FrameMap::first_available_sp_in_frame + frame_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   357
        __ z_lg(method, 1*BytesPerWord + FrameMap::first_available_sp_in_frame + frame_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   358
        int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, counter_overflow), bci, method);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   359
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   360
        oop_maps->add_gc_map(call_offset, map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   361
        restore_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   362
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   363
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   364
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   365
    case new_type_array_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   366
    case new_object_array_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   367
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   368
        Register length   = Z_R13; // Incoming
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   369
        Register klass    = Z_R11; // Incoming
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   370
        Register obj      = Z_R2;  // Result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   371
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   372
        if (id == new_type_array_id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   373
          __ set_info("new_type_array", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   374
        } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   375
          __ set_info("new_object_array", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   376
        }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   377
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   378
#ifdef ASSERT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   379
        // Assert object type is really an array of the proper kind.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   380
        {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   381
          NearLabel ok;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   382
          Register t0 = obj;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   383
          __ mem2reg_opt(t0, Address(klass, Klass::layout_helper_offset()), false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   384
          __ z_sra(t0, Klass::_lh_array_tag_shift);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   385
          int tag = ((id == new_type_array_id)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   386
                     ? Klass::_lh_array_tag_type_value
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   387
                     : Klass::_lh_array_tag_obj_value);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   388
          __ compare32_and_branch(t0, tag, Assembler::bcondEqual, ok);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   389
          __ stop("assert(is an array klass)");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   390
          __ should_not_reach_here();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   391
          __ bind(ok);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   392
        }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   393
#endif // ASSERT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   394
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   395
        OopMap* map = save_live_registers_except_r2(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   396
        int call_offset;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   397
        if (id == new_type_array_id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   398
          call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_type_array), klass, length);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   399
        } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   400
          call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_object_array), klass, length);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   401
        }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   402
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   403
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   404
        oop_maps->add_gc_map(call_offset, map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   405
        restore_live_registers_except_r2(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   406
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   407
        __ verify_oop(obj);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   408
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   409
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   410
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   411
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   412
    case new_multi_array_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   413
      { __ set_info("new_multi_array", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   414
        // Z_R3,: klass
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   415
        // Z_R4,: rank
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   416
        // Z_R5: address of 1st dimension
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   417
        OopMap* map = save_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   418
        int call_offset = __ call_RT(Z_R2, noreg, CAST_FROM_FN_PTR(address, new_multi_array), Z_R3, Z_R4, Z_R5);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   419
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   420
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   421
        oop_maps->add_gc_map(call_offset, map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   422
        restore_live_registers_except_r2(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   423
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   424
        // Z_R2,: new multi array
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   425
        __ verify_oop(Z_R2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   426
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   427
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   428
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   429
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   430
    case register_finalizer_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   431
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   432
        __ set_info("register_finalizer", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   433
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   434
        // Load the klass and check the has finalizer flag.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   435
        Register klass = Z_ARG2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   436
        __ load_klass(klass, Z_ARG1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   437
        __ testbit(Address(klass, Klass::access_flags_offset()), exact_log2(JVM_ACC_HAS_FINALIZER));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   438
        __ z_bcr(Assembler::bcondAllZero, Z_R14); // Return if bit is not set.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   439
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   440
        OopMap* oop_map = save_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   441
        int call_offset = __ call_RT(noreg, noreg,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   442
                                     CAST_FROM_FN_PTR(address, SharedRuntime::register_finalizer), Z_ARG1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   443
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   444
        oop_maps->add_gc_map(call_offset, oop_map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   445
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   446
        // Now restore all the live registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   447
        restore_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   448
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   449
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   450
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   451
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   452
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   453
    case throw_range_check_failed_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   454
      { __ set_info("range_check_failed", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   455
        oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_range_check_exception), true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   456
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   457
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   458
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   459
    case throw_index_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   460
      { __ set_info("index_range_check_failed", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   461
        oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_index_exception), true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   462
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   463
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   464
    case throw_div0_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   465
      { __ set_info("throw_div0_exception", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   466
        oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_div0_exception), false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   467
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   468
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   469
    case throw_null_pointer_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   470
      { __ set_info("throw_null_pointer_exception", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   471
        oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_null_pointer_exception), false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   472
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   473
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   474
    case handle_exception_nofpu_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   475
    case handle_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   476
      { __ set_info("handle_exception", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   477
        oop_maps = generate_handle_exception(id, sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   478
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   479
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   480
    case handle_exception_from_callee_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   481
      { __ set_info("handle_exception_from_callee", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   482
        oop_maps = generate_handle_exception(id, sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   483
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   484
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   485
    case unwind_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   486
      { __ set_info("unwind_exception", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   487
        // Note: no stubframe since we are about to leave the current
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   488
        // activation and we are calling a leaf VM function only.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   489
        generate_unwind_exception(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   490
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   491
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   492
    case throw_array_store_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   493
      { __ set_info("throw_array_store_exception", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   494
        oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_array_store_exception), true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   495
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   496
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   497
    case throw_class_cast_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   498
    { // Z_R1_scratch: object
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   499
      __ set_info("throw_class_cast_exception", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   500
      oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_class_cast_exception), true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   501
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   502
    break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   503
    case throw_incompatible_class_change_error_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   504
      { __ set_info("throw_incompatible_class_cast_exception", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   505
        oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_incompatible_class_change_error), false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   506
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   507
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   508
    case slow_subtype_check_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   509
    {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   510
      // Arguments :
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   511
      //   sub  : stack param 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   512
      //   super: stack param 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   513
      //   raddr: Z_R14, blown by call
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   514
      //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   515
      // Result : condition code 0 for match (bcondEqual will be true),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   516
      //          condition code 2 for miss  (bcondNotEqual will be true)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   517
      NearLabel miss;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   518
      const Register Rsubklass   = Z_ARG2; // sub
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   519
      const Register Rsuperklass = Z_ARG3; // super
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   520
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   521
      // No args, but tmp registers that are killed.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   522
      const Register Rlength     = Z_ARG4; // cache array length
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   523
      const Register Rarray_ptr  = Z_ARG5; // Current value from cache array.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   524
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   525
      if (UseCompressedOops) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   526
        assert(Universe::heap() != NULL, "java heap must be initialized to generate partial_subtype_check stub");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   527
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   528
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   529
      const int frame_size = 4*BytesPerWord + frame::z_abi_160_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   530
      // Save return pc. This is not necessary, but could be helpful
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   531
      // in the case of crashes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   532
      __ save_return_pc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   533
      __ push_frame(frame_size);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   534
      // Save registers before changing them.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   535
      int i = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   536
      __ z_stg(Rsubklass,   (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   537
      __ z_stg(Rsuperklass, (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   538
      __ z_stg(Rlength,     (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   539
      __ z_stg(Rarray_ptr,  (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   540
      assert(i*BytesPerWord + frame::z_abi_160_size == frame_size, "check");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   541
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   542
      // Get sub and super from stack.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   543
      __ z_lg(Rsubklass,   0*BytesPerWord + FrameMap::first_available_sp_in_frame + frame_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   544
      __ z_lg(Rsuperklass, 1*BytesPerWord + FrameMap::first_available_sp_in_frame + frame_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   545
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   546
      __ check_klass_subtype_slow_path(Rsubklass, Rsuperklass, Rarray_ptr, Rlength, NULL, &miss);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   547
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   548
      // Match falls through here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   549
      i = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   550
      __ z_lg(Rsubklass,   (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   551
      __ z_lg(Rsuperklass, (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   552
      __ z_lg(Rlength,     (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   553
      __ z_lg(Rarray_ptr,  (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   554
      assert(i*BytesPerWord + frame::z_abi_160_size == frame_size, "check");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   555
      __ pop_frame();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   556
      // Return pc is still in R_14.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   557
      __ clear_reg(Z_R0_scratch);         // Zero indicates a match. Set CC 0 (bcondEqual will be true)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   558
      __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   559
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   560
      __ BIND(miss);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   561
      i = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   562
      __ z_lg(Rsubklass,   (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   563
      __ z_lg(Rsuperklass, (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   564
      __ z_lg(Rlength,     (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   565
      __ z_lg(Rarray_ptr,  (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   566
      assert(i*BytesPerWord + frame::z_abi_160_size == frame_size, "check");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   567
      __ pop_frame();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   568
      // return pc is still in R_14
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   569
      __ load_const_optimized(Z_R0_scratch, 1); // One indicates a miss.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   570
      __ z_ltgr(Z_R0_scratch, Z_R0_scratch);    // Set CC 2 (bcondNotEqual will be true).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   571
      __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   572
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   573
    break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   574
    case monitorenter_nofpu_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   575
    case monitorenter_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   576
      { // Z_R1_scratch : object
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   577
        // Z_R13       : lock address (see LIRGenerator::syncTempOpr())
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   578
        __ set_info("monitorenter", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   579
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   580
        int save_fpu_registers = (id == monitorenter_id);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   581
        // Make a frame and preserve the caller's caller-save registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   582
        OopMap* oop_map = save_live_registers(sasm, save_fpu_registers);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   583
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   584
        int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, monitorenter), Z_R1_scratch, Z_R13);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   585
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   586
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   587
        oop_maps->add_gc_map(call_offset, oop_map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   588
        restore_live_registers(sasm, save_fpu_registers);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   589
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   590
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   591
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   592
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   593
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   594
    case monitorexit_nofpu_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   595
    case monitorexit_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   596
      { // Z_R1_scratch : lock address
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   597
        // Note: really a leaf routine but must setup last java sp
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   598
        //   => Use call_RT for now (speed can be improved by
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   599
        //      doing last java sp setup manually).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   600
        __ set_info("monitorexit", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   601
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   602
        int save_fpu_registers = (id == monitorexit_id);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   603
        // Make a frame and preserve the caller's caller-save registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   604
        OopMap* oop_map = save_live_registers(sasm, save_fpu_registers);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   605
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   606
        int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, monitorexit), Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   607
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   608
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   609
        oop_maps->add_gc_map(call_offset, oop_map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   610
        restore_live_registers(sasm, save_fpu_registers);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   611
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   612
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   613
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   614
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   615
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   616
    case deoptimize_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   617
      { // Args: Z_R1_scratch: trap request
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   618
        __ set_info("deoptimize", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   619
        Register trap_request = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   620
        OopMap* oop_map = save_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   621
        int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, deoptimize), trap_request);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   622
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   623
        oop_maps->add_gc_map(call_offset, oop_map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   624
        restore_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   625
        DeoptimizationBlob* deopt_blob = SharedRuntime::deopt_blob();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   626
        assert(deopt_blob != NULL, "deoptimization blob must have been created");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   627
        AddressLiteral dest(deopt_blob->unpack_with_reexecution());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   628
        __ load_const_optimized(Z_R1_scratch, dest);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   629
        __ z_br(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   630
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   631
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   632
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   633
    case access_field_patching_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   634
      { __ set_info("access_field_patching", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   635
        oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, access_field_patching));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   636
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   637
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   638
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   639
    case load_klass_patching_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   640
      { __ set_info("load_klass_patching", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   641
        // We should set up register map.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   642
        oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_klass_patching));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   643
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   644
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   645
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   646
    case load_mirror_patching_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   647
      { __ set_info("load_mirror_patching", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   648
        oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_mirror_patching));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   649
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   650
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   651
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   652
    case load_appendix_patching_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   653
      { __ set_info("load_appendix_patching", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   654
        oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_appendix_patching));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   655
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   656
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   657
#if 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   658
    case dtrace_object_alloc_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   659
      { // rax,: object
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   660
        StubFrame f(sasm, "dtrace_object_alloc", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   661
        // We can't gc here so skip the oopmap but make sure that all
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   662
        // the live registers get saved.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   663
        save_live_registers(sasm, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   664
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   665
        __ NOT_LP64(push(rax)) LP64_ONLY(mov(c_rarg0, rax));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   666
        __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   667
        NOT_LP64(__ pop(rax));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   668
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   669
        restore_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   670
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   671
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   672
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   673
    case fpu2long_stub_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   674
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   675
        // rax, and rdx are destroyed, but should be free since the result is returned there
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   676
        // preserve rsi,ecx
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   677
        __ push(rsi);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   678
        __ push(rcx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   679
        LP64_ONLY(__ push(rdx);)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   680
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   681
        // check for NaN
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   682
        Label return0, do_return, return_min_jlong, do_convert;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   683
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   684
        Address value_high_word(rsp, wordSize + 4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   685
        Address value_low_word(rsp, wordSize);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   686
        Address result_high_word(rsp, 3*wordSize + 4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   687
        Address result_low_word(rsp, 3*wordSize);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   688
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   689
        __ subptr(rsp, 32);                    // more than enough on 32bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   690
        __ fst_d(value_low_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   691
        __ movl(rax, value_high_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   692
        __ andl(rax, 0x7ff00000);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   693
        __ cmpl(rax, 0x7ff00000);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   694
        __ jcc(Assembler::notEqual, do_convert);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   695
        __ movl(rax, value_high_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   696
        __ andl(rax, 0xfffff);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   697
        __ orl(rax, value_low_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   698
        __ jcc(Assembler::notZero, return0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   699
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   700
        __ bind(do_convert);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   701
        __ fnstcw(Address(rsp, 0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   702
        __ movzwl(rax, Address(rsp, 0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   703
        __ orl(rax, 0xc00);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   704
        __ movw(Address(rsp, 2), rax);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   705
        __ fldcw(Address(rsp, 2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   706
        __ fwait();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   707
        __ fistp_d(result_low_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   708
        __ fldcw(Address(rsp, 0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   709
        __ fwait();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   710
        // This gets the entire long in rax on 64bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   711
        __ movptr(rax, result_low_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   712
        // testing of high bits
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   713
        __ movl(rdx, result_high_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   714
        __ mov(rcx, rax);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   715
        // What the heck is the point of the next instruction???
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   716
        __ xorl(rcx, 0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   717
        __ movl(rsi, 0x80000000);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   718
        __ xorl(rsi, rdx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   719
        __ orl(rcx, rsi);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   720
        __ jcc(Assembler::notEqual, do_return);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   721
        __ fldz();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   722
        __ fcomp_d(value_low_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   723
        __ fnstsw_ax();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   724
        __ testl(rax, 0x4100);  // ZF & CF == 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   725
        __ jcc(Assembler::equal, return_min_jlong);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   726
        // return max_jlong
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   727
        __ mov64(rax, CONST64(0x7fffffffffffffff));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   728
        __ jmp(do_return);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   729
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   730
        __ bind(return_min_jlong);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   731
        __ mov64(rax, UCONST64(0x8000000000000000));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   732
        __ jmp(do_return);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   733
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   734
        __ bind(return0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   735
        __ fpop();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   736
        __ xorptr(rax, rax);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   737
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   738
        __ bind(do_return);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   739
        __ addptr(rsp, 32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   740
        LP64_ONLY(__ pop(rdx);)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   741
        __ pop(rcx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   742
        __ pop(rsi);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   743
        __ ret(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   744
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   745
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   746
#endif // TODO
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   747
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   748
    case predicate_failed_trap_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   749
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   750
        __ set_info("predicate_failed_trap", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   751
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   752
        OopMap* map = save_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   753
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   754
        int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, predicate_failed_trap));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   755
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   756
        oop_maps->add_gc_map(call_offset, map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   757
        restore_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   758
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   759
        DeoptimizationBlob* deopt_blob = SharedRuntime::deopt_blob();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   760
        assert(deopt_blob != NULL, "deoptimization blob must have been created");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   761
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   762
        __ load_const_optimized(Z_R1_scratch, deopt_blob->unpack_with_reexecution());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   763
        __ z_br(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   764
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   765
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   766
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   767
    default:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   768
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   769
        __ should_not_reach_here(FILE_AND_LINE, id);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   770
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   771
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   772
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   773
  return oop_maps;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   774
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   775
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   776
OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler *sasm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   777
  __ block_comment("generate_handle_exception");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   778
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   779
  // incoming parameters: Z_EXC_OOP, Z_EXC_PC
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   780
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   781
  // Save registers if required.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   782
  OopMapSet* oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   783
  OopMap* oop_map = NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   784
  Register reg_fp = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   785
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   786
  switch (id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   787
    case forward_exception_id: {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   788
      // We're handling an exception in the context of a compiled frame.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   789
      // The registers have been saved in the standard places. Perform
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   790
      // an exception lookup in the caller and dispatch to the handler
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   791
      // if found. Otherwise unwind and dispatch to the callers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   792
      // exception handler.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   793
      oop_map = generate_oop_map(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   794
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   795
      // Load and clear pending exception oop into.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   796
      __ z_lg(Z_EXC_OOP, Address(Z_thread, Thread::pending_exception_offset()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   797
      __ clear_mem(Address(Z_thread, Thread::pending_exception_offset()), 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   798
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   799
      // Different stubs forward their exceptions; they should all have similar frame layouts
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   800
      // (a) to find their return address (b) for a correct oop_map generated above.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   801
      assert(RegisterSaver::live_reg_frame_size(RegisterSaver::all_registers) ==
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   802
             RegisterSaver::live_reg_frame_size(RegisterSaver::all_registers_except_r2), "requirement");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   803
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   804
      // Load issuing PC (the return address for this stub).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   805
      const int frame_size_in_bytes = sasm->frame_size() * VMRegImpl::slots_per_word * VMRegImpl::stack_slot_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   806
      __ z_lg(Z_EXC_PC, Address(Z_SP, frame_size_in_bytes + _z_abi16(return_pc)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   807
      DEBUG_ONLY(__ z_lay(reg_fp, Address(Z_SP, frame_size_in_bytes));)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   808
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   809
      // Make sure that the vm_results are cleared (may be unnecessary).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   810
      __ clear_mem(Address(Z_thread, JavaThread::vm_result_offset()),   sizeof(oop));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   811
      __ clear_mem(Address(Z_thread, JavaThread::vm_result_2_offset()), sizeof(Metadata*));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   812
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   813
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   814
    case handle_exception_nofpu_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   815
    case handle_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   816
      // At this point all registers MAY be live.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   817
      DEBUG_ONLY(__ z_lgr(reg_fp, Z_SP);)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   818
      oop_map = save_live_registers(sasm, id != handle_exception_nofpu_id, Z_EXC_PC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   819
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   820
    case handle_exception_from_callee_id: {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   821
      // At this point all registers except Z_EXC_OOP and Z_EXC_PC are dead.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   822
      DEBUG_ONLY(__ z_lgr(reg_fp, Z_SP);)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   823
      __ save_return_pc(Z_EXC_PC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   824
      const int frame_size_in_bytes = __ push_frame_abi160(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   825
      oop_map = new OopMap(frame_size_in_bytes / VMRegImpl::stack_slot_size, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   826
      sasm->set_frame_size(frame_size_in_bytes / BytesPerWord);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   827
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   828
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   829
    default:  ShouldNotReachHere();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   830
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   831
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   832
  // Verify that only Z_EXC_OOP, and Z_EXC_PC are valid at this time.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   833
  __ invalidate_registers(Z_EXC_OOP, Z_EXC_PC, reg_fp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   834
  // Verify that Z_EXC_OOP, contains a valid exception.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   835
  __ verify_not_null_oop(Z_EXC_OOP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   836
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   837
  // Check that fields in JavaThread for exception oop and issuing pc
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   838
  // are empty before writing to them.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   839
  __ asm_assert_mem8_is_zero(in_bytes(JavaThread::exception_oop_offset()), Z_thread, "exception oop already set : " FILE_AND_LINE, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   840
  __ asm_assert_mem8_is_zero(in_bytes(JavaThread::exception_pc_offset()), Z_thread, "exception pc already set : " FILE_AND_LINE, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   841
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   842
  // Save exception oop and issuing pc into JavaThread.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   843
  // (Exception handler will load it from here.)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   844
  __ z_stg(Z_EXC_OOP, Address(Z_thread, JavaThread::exception_oop_offset()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   845
  __ z_stg(Z_EXC_PC, Address(Z_thread, JavaThread::exception_pc_offset()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   846
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   847
#ifdef ASSERT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   848
  { NearLabel ok;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   849
    __ z_cg(Z_EXC_PC, Address(reg_fp, _z_abi16(return_pc)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   850
    __ branch_optimized(Assembler::bcondEqual, ok);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   851
    __ stop("use throwing pc as return address (has bci & oop map)");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   852
    __ bind(ok);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   853
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   854
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   855
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   856
  // Compute the exception handler.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   857
  // The exception oop and the throwing pc are read from the fields in JavaThread.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   858
  int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, exception_handler_for_pc));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   859
  oop_maps->add_gc_map(call_offset, oop_map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   860
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   861
  // Z_RET(Z_R2): handler address
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   862
  //   will be the deopt blob if nmethod was deoptimized while we looked up
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   863
  //   handler regardless of whether handler existed in the nmethod.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   864
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   865
  // Only Z_R2, is valid at this time, all other registers have been destroyed by the runtime call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   866
  __ invalidate_registers(Z_R2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   867
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   868
  switch(id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   869
    case forward_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   870
    case handle_exception_nofpu_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   871
    case handle_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   872
      // Restore the registers that were saved at the beginning.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   873
      __ z_lgr(Z_R1_scratch, Z_R2);   // Restoring live registers kills Z_R2.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   874
      restore_live_registers(sasm, id != handle_exception_nofpu_id);  // Pops as well the frame.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   875
      __ z_br(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   876
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   877
    case handle_exception_from_callee_id: {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   878
      __ pop_frame();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   879
      __ z_br(Z_R2); // Jump to exception handler.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   880
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   881
    break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   882
    default:  ShouldNotReachHere();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   883
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   884
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   885
  return oop_maps;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   886
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   887
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   888
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   889
#undef __
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   890
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   891
const char *Runtime1::pd_name_for_address(address entry) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   892
  return "<unknown function>";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   893
}