src/hotspot/cpu/s390/c1_Runtime1_s390.cpp
author eosterlund
Mon, 19 Mar 2018 07:38:18 +0100
changeset 49455 848864ed9b17
parent 49347 edb65305d3ac
child 49752 93d84f667d12
permissions -rw-r--r--
8199604: Rename CardTableModRefBS to CardTableBarrierSet Reviewed-by: stefank, pliden
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"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    27
#include "c1/c1_Defs.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    28
#include "c1/c1_MacroAssembler.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    29
#include "c1/c1_Runtime1.hpp"
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 49010
diff changeset
    30
#include "ci/ciUtilities.hpp"
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 49010
diff changeset
    31
#include "gc/shared/cardTable.hpp"
49455
848864ed9b17 8199604: Rename CardTableModRefBS to CardTableBarrierSet
eosterlund
parents: 49347
diff changeset
    32
#include "gc/shared/cardTableBarrierSet.hpp"
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    33
#include "interpreter/interpreter.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    34
#include "nativeInst_s390.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    35
#include "oops/compiledICHolder.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    36
#include "oops/oop.inline.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    37
#include "prims/jvmtiExport.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    38
#include "register_s390.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    39
#include "runtime/sharedRuntime.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    40
#include "runtime/signature.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    41
#include "runtime/vframeArray.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    42
#include "utilities/macros.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    43
#include "vmreg_s390.inline.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    44
#include "registerSaver_s390.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    45
#if INCLUDE_ALL_GCS
49347
edb65305d3ac 8195148: Collapse G1SATBCardTableModRefBS and G1SATBCardTableLoggingModRefBS into a single G1BarrierSet
eosterlund
parents: 49164
diff changeset
    46
#include "gc/g1/g1BarrierSet.hpp"
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 49010
diff changeset
    47
#include "gc/g1/g1CardTable.hpp"
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    48
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    49
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    50
// Implementation of StubAssembler
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    51
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    52
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
    53
  set_num_rt_args(0); // Nothing on stack.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    54
  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
    55
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    56
  // We cannot trust that code generated by the C++ compiler saves R14
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    57
  // to z_abi_160.return_pc, because sometimes it spills R14 using stmg at
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    58
  // z_abi_160.gpr14 (e.g. InterpreterRuntime::_new()).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    59
  // 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
    60
  // it into the frame anchor.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    61
  address pc = get_PC(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    62
  int call_offset = (int)(pc - addr_at(0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    63
  set_last_Java_frame(Z_SP, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    65
  // ARG1 must hold thread address.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    66
  z_lgr(Z_ARG1, Z_thread);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    67
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    68
  address return_pc = NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    69
  align_call_far_patchable(this->pc());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    70
  return_pc = call_c_opt(entry_point);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    71
  assert(return_pc != NULL, "const section overflow");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    72
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    73
  reset_last_Java_frame();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    74
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    75
  // Check for pending exceptions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    76
  {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    77
    load_and_test_long(Z_R0_scratch, Address(Z_thread, Thread::pending_exception_offset()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    78
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    79
    // This used to conditionally jump to forward_exception however it is
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    80
    // possible if we relocate that the branch will not reach. So we must jump
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    81
    // around so we can always reach.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    82
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    83
    Label ok;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    84
    z_bre(ok); // Bcondequal is the same as bcondZero.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    85
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    86
    // exception pending => forward to exception handler
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    87
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    88
    // Make sure that the vm_results are cleared.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    89
    if (oop_result1->is_valid()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    90
      clear_mem(Address(Z_thread, JavaThread::vm_result_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 (metadata_result->is_valid()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    93
      clear_mem(Address(Z_thread, JavaThread::vm_result_2_offset()), sizeof(jlong));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    94
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    95
    if (frame_size() == no_frame_size) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    96
      // Pop the stub frame.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    97
      pop_frame();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    98
      restore_return_pc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    99
      load_const_optimized(Z_R1, StubRoutines::forward_exception_entry());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   100
      z_br(Z_R1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   101
    } else if (_stub_id == Runtime1::forward_exception_id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   102
      should_not_reach_here();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   103
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   104
      load_const_optimized(Z_R1, Runtime1::entry_for (Runtime1::forward_exception_id));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   105
      z_br(Z_R1);
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
    bind(ok);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   109
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   110
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   111
  // Get oop results if there are any and reset the values in the thread.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   112
  if (oop_result1->is_valid()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   113
    get_vm_result(oop_result1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   114
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   115
  if (metadata_result->is_valid()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   116
    get_vm_result_2(metadata_result);
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
  return call_offset;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   120
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   121
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   122
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   123
int StubAssembler::call_RT(Register oop_result1, Register metadata_result, address entry, Register arg1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   124
  // Z_ARG1 is reserved for the thread.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   125
  lgr_if_needed(Z_ARG2, arg1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   126
  return call_RT(oop_result1, metadata_result, entry, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   127
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   128
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   129
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   130
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
   131
  // Z_ARG1 is reserved for the thread.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   132
  lgr_if_needed(Z_ARG2, arg1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   133
  assert(arg2 != Z_ARG2, "smashed argument");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   134
  lgr_if_needed(Z_ARG3, arg2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   135
  return call_RT(oop_result1, metadata_result, entry, 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   136
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   137
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   138
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   139
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
   140
  // Z_ARG1 is reserved for the thread.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   141
  lgr_if_needed(Z_ARG2, arg1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   142
  assert(arg2 != Z_ARG2, "smashed argument");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   143
  lgr_if_needed(Z_ARG3, arg2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   144
  assert(arg3 != Z_ARG3, "smashed argument");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   145
  lgr_if_needed(Z_ARG4, arg3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   146
  return call_RT(oop_result1, metadata_result, entry, 3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   147
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   148
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   149
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   150
// Implementation of Runtime1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   151
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   152
#define __ sasm->
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   153
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   154
#ifndef PRODUCT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   155
#undef  __
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   156
#define __ (Verbose ? (sasm->block_comment(FILE_AND_LINE),sasm):sasm)->
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   157
#endif // !PRODUCT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   158
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   159
#define BLOCK_COMMENT(str) if (PrintAssembly) __ block_comment(str)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   160
#define BIND(label)        bind(label); BLOCK_COMMENT(#label ":")
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   161
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   162
static OopMap* generate_oop_map(StubAssembler* sasm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   163
  RegisterSaver::RegisterSet reg_set = RegisterSaver::all_registers;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   164
  int frame_size_in_slots =
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   165
    RegisterSaver::live_reg_frame_size(reg_set) / VMRegImpl::stack_slot_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   166
  sasm->set_frame_size(frame_size_in_slots / VMRegImpl::slots_per_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   167
  return RegisterSaver::generate_oop_map(sasm, reg_set);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   168
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   169
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   170
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
   171
  __ block_comment("save_live_registers");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   172
  RegisterSaver::RegisterSet reg_set =
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   173
    save_fpu_registers ? RegisterSaver::all_registers : RegisterSaver::all_integer_registers;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   174
  int frame_size_in_slots =
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   175
    RegisterSaver::live_reg_frame_size(reg_set) / VMRegImpl::stack_slot_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   176
  sasm->set_frame_size(frame_size_in_slots / VMRegImpl::slots_per_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   177
  return RegisterSaver::save_live_registers(sasm, reg_set, return_pc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   178
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   179
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   180
static OopMap* save_live_registers_except_r2(StubAssembler* sasm, bool save_fpu_registers = true) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   181
  if (!save_fpu_registers) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   182
    __ unimplemented(FILE_AND_LINE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   183
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   184
  __ block_comment("save_live_registers");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   185
  RegisterSaver::RegisterSet reg_set = RegisterSaver::all_registers_except_r2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   186
  int frame_size_in_slots =
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   187
      RegisterSaver::live_reg_frame_size(reg_set) / VMRegImpl::stack_slot_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   188
  sasm->set_frame_size(frame_size_in_slots / VMRegImpl::slots_per_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   189
  return RegisterSaver::save_live_registers(sasm, reg_set);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   190
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   191
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   192
static OopMap* save_volatile_registers(StubAssembler* sasm, Register return_pc = Z_R14) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   193
  __ block_comment("save_volatile_registers");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   194
  RegisterSaver::RegisterSet reg_set = RegisterSaver::all_volatile_registers;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   195
  int frame_size_in_slots =
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   196
    RegisterSaver::live_reg_frame_size(reg_set) / VMRegImpl::stack_slot_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   197
  sasm->set_frame_size(frame_size_in_slots / VMRegImpl::slots_per_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   198
  return RegisterSaver::save_live_registers(sasm, reg_set, return_pc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   199
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   200
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   201
static void restore_live_registers(StubAssembler* sasm, bool restore_fpu_registers = true) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   202
  __ block_comment("restore_live_registers");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   203
  RegisterSaver::RegisterSet reg_set =
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   204
    restore_fpu_registers ? RegisterSaver::all_registers : RegisterSaver::all_integer_registers;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   205
  RegisterSaver::restore_live_registers(sasm, reg_set);
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
static void restore_live_registers_except_r2(StubAssembler* sasm, bool restore_fpu_registers = true) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   209
  if (!restore_fpu_registers) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   210
    __ unimplemented(FILE_AND_LINE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   211
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   212
  __ block_comment("restore_live_registers_except_r2");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   213
  RegisterSaver::restore_live_registers(sasm, RegisterSaver::all_registers_except_r2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   214
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   215
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   216
static void restore_volatile_registers(StubAssembler* sasm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   217
  __ block_comment("restore_volatile_registers");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   218
  RegisterSaver::RegisterSet reg_set = RegisterSaver::all_volatile_registers;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   219
  RegisterSaver::restore_live_registers(sasm, reg_set);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   220
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   221
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   222
void Runtime1::initialize_pd() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   223
  // Nothing to do.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   224
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   225
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   226
OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address target, bool has_argument) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   227
  // Make a frame and preserve the caller's caller-save registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   228
  OopMap* oop_map = save_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   229
  int call_offset;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   230
  if (!has_argument) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   231
    call_offset = __ call_RT(noreg, noreg, target);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   232
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   233
    call_offset = __ call_RT(noreg, noreg, target, Z_R1_scratch, Z_R0_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   234
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   235
  OopMapSet* oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   236
  oop_maps->add_gc_map(call_offset, oop_map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   237
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   238
  __ should_not_reach_here();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   239
  return oop_maps;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   240
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   241
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   242
void Runtime1::generate_unwind_exception(StubAssembler *sasm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   243
  // Incoming parameters: Z_EXC_OOP and Z_EXC_PC.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   244
  // Keep copies in callee-saved registers during runtime call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   245
  const Register exception_oop_callee_saved = Z_R11;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   246
  const Register exception_pc_callee_saved = Z_R12;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   247
  // Other registers used in this stub.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   248
  const Register handler_addr = Z_R4;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   249
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   250
  // Verify that only exception_oop, is valid at this time.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   251
  __ invalidate_registers(Z_EXC_OOP, Z_EXC_PC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   252
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   253
  // Check that fields in JavaThread for exception oop and issuing pc are set.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   254
  __ 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
   255
  __ 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
   256
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   257
  // Save exception_oop and pc in callee-saved register to preserve it
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   258
  // during runtime calls.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   259
  __ verify_not_null_oop(Z_EXC_OOP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   260
  __ lgr_if_needed(exception_oop_callee_saved, Z_EXC_OOP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   261
  __ lgr_if_needed(exception_pc_callee_saved, Z_EXC_PC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   262
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   263
  __ push_frame_abi160(0); // Runtime code needs the z_abi_160.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   264
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   265
  // Search the exception handler address of the caller (using the return address).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   266
  __ 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
   267
  // Z_RET(Z_R2): exception handler address of the caller.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   268
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   269
  __ pop_frame();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   270
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   271
  __ invalidate_registers(exception_oop_callee_saved, exception_pc_callee_saved, Z_RET);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   272
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   273
  // Move result of call into correct register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   274
  __ lgr_if_needed(handler_addr, Z_RET);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   275
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   276
  // 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
   277
  __ lgr_if_needed(Z_EXC_OOP, exception_oop_callee_saved);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   278
  __ lgr_if_needed(Z_EXC_PC, exception_pc_callee_saved);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   279
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   280
  // Verify that there is really a valid exception in Z_EXC_OOP.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   281
  __ verify_not_null_oop(Z_EXC_OOP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   282
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   283
  __ z_br(handler_addr); // Jump to exception handler.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   284
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   285
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   286
OopMapSet* Runtime1::generate_patching(StubAssembler* sasm, address target) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   287
  // Make a frame and preserve the caller's caller-save registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   288
  OopMap* oop_map = save_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   289
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   290
  // Call the runtime patching routine, returns non-zero if nmethod got deopted.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   291
  int call_offset = __ call_RT(noreg, noreg, target);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   292
  OopMapSet* oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   293
  oop_maps->add_gc_map(call_offset, oop_map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   294
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   295
  // Re-execute the patched instruction or, if the nmethod was
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   296
  // deoptmized, return to the deoptimization handler entry that will
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   297
  // cause re-execution of the current bytecode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   298
  DeoptimizationBlob* deopt_blob = SharedRuntime::deopt_blob();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   299
  assert(deopt_blob != NULL, "deoptimization blob must have been created");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   300
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   301
  __ z_ltr(Z_RET, Z_RET); // return value == 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   302
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   303
  restore_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   304
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   305
  __ z_bcr(Assembler::bcondZero, Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   306
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   307
  // Return to the deoptimization handler entry for unpacking and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   308
  // rexecute if we simply returned then we'd deopt as if any call we
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   309
  // patched had just returned.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   310
  AddressLiteral dest(deopt_blob->unpack_with_reexecution());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   311
  __ load_const_optimized(Z_R1_scratch, dest);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   312
  __ z_br(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   313
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   314
  return oop_maps;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   315
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   316
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   317
OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   318
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   319
  // for better readability
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   320
  const bool must_gc_arguments = true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   321
  const bool dont_gc_arguments = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   322
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   323
  // Default value; overwritten for some optimized stubs that are
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   324
  // called from methods that do not use the fpu.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   325
  bool save_fpu_registers = true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   326
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   327
  // Stub code and info for the different stubs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   328
  OopMapSet* oop_maps = NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   329
  switch (id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   330
    case forward_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   331
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   332
        oop_maps = generate_handle_exception(id, sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   333
        // will not return
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   334
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   335
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   336
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   337
    case new_instance_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   338
    case fast_new_instance_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   339
    case fast_new_instance_init_check_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   340
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   341
        Register klass    = Z_R11; // Incoming
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   342
        Register obj      = Z_R2;  // Result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   343
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   344
        if (id == new_instance_id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   345
          __ set_info("new_instance", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   346
        } else if (id == fast_new_instance_id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   347
          __ set_info("fast new_instance", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   348
        } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   349
          assert(id == fast_new_instance_init_check_id, "bad StubID");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   350
          __ set_info("fast new_instance init check", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   351
        }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   352
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   353
        OopMap* map = save_live_registers_except_r2(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   354
        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
   355
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   356
        oop_maps->add_gc_map(call_offset, map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   357
        restore_live_registers_except_r2(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   358
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   359
        __ verify_oop(obj);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   360
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   361
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   362
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   363
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   364
    case counter_overflow_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   365
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   366
        // Arguments :
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   367
        //   bci    : stack param 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   368
        //   method : stack param 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   369
        //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   370
        Register bci = Z_ARG2, method = Z_ARG3;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   371
        // frame size in bytes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   372
        OopMap* map = save_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   373
        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
   374
        __ 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
   375
        __ 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
   376
        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
   377
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   378
        oop_maps->add_gc_map(call_offset, map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   379
        restore_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   380
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   381
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   382
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   383
    case new_type_array_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   384
    case new_object_array_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   385
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   386
        Register length   = Z_R13; // Incoming
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   387
        Register klass    = Z_R11; // Incoming
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   388
        Register obj      = Z_R2;  // Result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   389
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   390
        if (id == new_type_array_id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   391
          __ set_info("new_type_array", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   392
        } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   393
          __ set_info("new_object_array", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   394
        }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   395
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   396
#ifdef ASSERT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   397
        // Assert object type is really an array of the proper kind.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   398
        {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   399
          NearLabel ok;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   400
          Register t0 = obj;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   401
          __ mem2reg_opt(t0, Address(klass, Klass::layout_helper_offset()), false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   402
          __ z_sra(t0, Klass::_lh_array_tag_shift);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   403
          int tag = ((id == new_type_array_id)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   404
                     ? Klass::_lh_array_tag_type_value
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   405
                     : Klass::_lh_array_tag_obj_value);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   406
          __ compare32_and_branch(t0, tag, Assembler::bcondEqual, ok);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   407
          __ stop("assert(is an array klass)");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   408
          __ should_not_reach_here();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   409
          __ bind(ok);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   410
        }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   411
#endif // ASSERT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   412
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   413
        OopMap* map = save_live_registers_except_r2(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   414
        int call_offset;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   415
        if (id == new_type_array_id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   416
          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
   417
        } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   418
          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
   419
        }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   420
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   421
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   422
        oop_maps->add_gc_map(call_offset, map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   423
        restore_live_registers_except_r2(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   424
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   425
        __ verify_oop(obj);
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 new_multi_array_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   431
      { __ set_info("new_multi_array", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   432
        // Z_R3,: klass
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   433
        // Z_R4,: rank
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   434
        // Z_R5: address of 1st dimension
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   435
        OopMap* map = save_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   436
        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
   437
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   438
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   439
        oop_maps->add_gc_map(call_offset, map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   440
        restore_live_registers_except_r2(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   441
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   442
        // Z_R2,: new multi array
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   443
        __ verify_oop(Z_R2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   444
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   445
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   446
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   447
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   448
    case register_finalizer_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   449
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   450
        __ set_info("register_finalizer", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   451
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   452
        // Load the klass and check the has finalizer flag.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   453
        Register klass = Z_ARG2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   454
        __ load_klass(klass, Z_ARG1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   455
        __ testbit(Address(klass, Klass::access_flags_offset()), exact_log2(JVM_ACC_HAS_FINALIZER));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   456
        __ z_bcr(Assembler::bcondAllZero, Z_R14); // Return if bit is not set.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   457
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   458
        OopMap* oop_map = save_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   459
        int call_offset = __ call_RT(noreg, noreg,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   460
                                     CAST_FROM_FN_PTR(address, SharedRuntime::register_finalizer), Z_ARG1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   461
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   462
        oop_maps->add_gc_map(call_offset, oop_map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   463
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   464
        // Now restore all the live registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   465
        restore_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   466
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   467
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   468
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   469
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   470
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   471
    case throw_range_check_failed_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   472
      { __ set_info("range_check_failed", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   473
        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
   474
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   475
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   476
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   477
    case throw_index_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   478
      { __ set_info("index_range_check_failed", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   479
        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
   480
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   481
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   482
    case throw_div0_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   483
      { __ set_info("throw_div0_exception", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   484
        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
   485
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   486
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   487
    case throw_null_pointer_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   488
      { __ set_info("throw_null_pointer_exception", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   489
        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
   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 handle_exception_nofpu_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   493
    case handle_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   494
      { __ set_info("handle_exception", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   495
        oop_maps = generate_handle_exception(id, sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   496
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   497
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   498
    case handle_exception_from_callee_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   499
      { __ set_info("handle_exception_from_callee", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   500
        oop_maps = generate_handle_exception(id, sasm);
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 unwind_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   504
      { __ set_info("unwind_exception", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   505
        // Note: no stubframe since we are about to leave the current
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   506
        // activation and we are calling a leaf VM function only.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   507
        generate_unwind_exception(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   508
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   509
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   510
    case throw_array_store_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   511
      { __ set_info("throw_array_store_exception", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   512
        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
   513
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   514
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   515
    case throw_class_cast_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   516
    { // Z_R1_scratch: object
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   517
      __ set_info("throw_class_cast_exception", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   518
      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
   519
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   520
    break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   521
    case throw_incompatible_class_change_error_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   522
      { __ set_info("throw_incompatible_class_cast_exception", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   523
        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
   524
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   525
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   526
    case slow_subtype_check_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   527
    {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   528
      // Arguments :
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   529
      //   sub  : stack param 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   530
      //   super: stack param 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   531
      //   raddr: Z_R14, blown by call
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   532
      //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   533
      // Result : condition code 0 for match (bcondEqual will be true),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   534
      //          condition code 2 for miss  (bcondNotEqual will be true)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   535
      NearLabel miss;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   536
      const Register Rsubklass   = Z_ARG2; // sub
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   537
      const Register Rsuperklass = Z_ARG3; // super
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   538
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   539
      // No args, but tmp registers that are killed.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   540
      const Register Rlength     = Z_ARG4; // cache array length
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   541
      const Register Rarray_ptr  = Z_ARG5; // Current value from cache array.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   542
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   543
      if (UseCompressedOops) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   544
        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
   545
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   546
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   547
      const int frame_size = 4*BytesPerWord + frame::z_abi_160_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   548
      // Save return pc. This is not necessary, but could be helpful
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   549
      // in the case of crashes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   550
      __ save_return_pc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   551
      __ push_frame(frame_size);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   552
      // Save registers before changing them.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   553
      int i = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   554
      __ z_stg(Rsubklass,   (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   555
      __ z_stg(Rsuperklass, (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   556
      __ z_stg(Rlength,     (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   557
      __ z_stg(Rarray_ptr,  (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   558
      assert(i*BytesPerWord + frame::z_abi_160_size == frame_size, "check");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   559
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   560
      // Get sub and super from stack.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   561
      __ 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
   562
      __ 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
   563
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   564
      __ check_klass_subtype_slow_path(Rsubklass, Rsuperklass, Rarray_ptr, Rlength, NULL, &miss);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   565
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   566
      // Match falls through here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   567
      i = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   568
      __ z_lg(Rsubklass,   (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   569
      __ z_lg(Rsuperklass, (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   570
      __ z_lg(Rlength,     (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   571
      __ z_lg(Rarray_ptr,  (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   572
      assert(i*BytesPerWord + frame::z_abi_160_size == frame_size, "check");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   573
      __ pop_frame();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   574
      // Return pc is still in R_14.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   575
      __ 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
   576
      __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   577
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   578
      __ BIND(miss);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   579
      i = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   580
      __ z_lg(Rsubklass,   (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   581
      __ z_lg(Rsuperklass, (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   582
      __ z_lg(Rlength,     (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   583
      __ z_lg(Rarray_ptr,  (i++)*BytesPerWord + frame::z_abi_160_size, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   584
      assert(i*BytesPerWord + frame::z_abi_160_size == frame_size, "check");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   585
      __ pop_frame();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   586
      // return pc is still in R_14
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   587
      __ load_const_optimized(Z_R0_scratch, 1); // One indicates a miss.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   588
      __ 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
   589
      __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   590
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   591
    break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   592
    case monitorenter_nofpu_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   593
    case monitorenter_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   594
      { // Z_R1_scratch : object
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   595
        // Z_R13       : lock address (see LIRGenerator::syncTempOpr())
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   596
        __ set_info("monitorenter", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   597
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   598
        int save_fpu_registers = (id == monitorenter_id);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   599
        // Make a frame and preserve the caller's caller-save registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   600
        OopMap* oop_map = save_live_registers(sasm, save_fpu_registers);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   601
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   602
        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
   603
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   604
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   605
        oop_maps->add_gc_map(call_offset, oop_map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   606
        restore_live_registers(sasm, save_fpu_registers);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   607
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   608
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   609
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   610
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   611
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   612
    case monitorexit_nofpu_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   613
    case monitorexit_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   614
      { // Z_R1_scratch : lock address
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   615
        // Note: really a leaf routine but must setup last java sp
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   616
        //   => Use call_RT for now (speed can be improved by
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   617
        //      doing last java sp setup manually).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   618
        __ set_info("monitorexit", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   619
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   620
        int save_fpu_registers = (id == monitorexit_id);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   621
        // Make a frame and preserve the caller's caller-save registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   622
        OopMap* oop_map = save_live_registers(sasm, save_fpu_registers);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   623
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   624
        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
   625
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   626
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   627
        oop_maps->add_gc_map(call_offset, oop_map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   628
        restore_live_registers(sasm, save_fpu_registers);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   629
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   630
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   631
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   632
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   633
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   634
    case deoptimize_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   635
      { // Args: Z_R1_scratch: trap request
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   636
        __ set_info("deoptimize", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   637
        Register trap_request = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   638
        OopMap* oop_map = save_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   639
        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
   640
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   641
        oop_maps->add_gc_map(call_offset, oop_map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   642
        restore_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   643
        DeoptimizationBlob* deopt_blob = SharedRuntime::deopt_blob();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   644
        assert(deopt_blob != NULL, "deoptimization blob must have been created");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   645
        AddressLiteral dest(deopt_blob->unpack_with_reexecution());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   646
        __ load_const_optimized(Z_R1_scratch, dest);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   647
        __ z_br(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   648
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   649
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   650
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   651
    case access_field_patching_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   652
      { __ set_info("access_field_patching", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   653
        oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, access_field_patching));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   654
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   655
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   656
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   657
    case load_klass_patching_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   658
      { __ set_info("load_klass_patching", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   659
        // We should set up register map.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   660
        oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_klass_patching));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   661
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   662
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   663
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   664
    case load_mirror_patching_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   665
      { __ set_info("load_mirror_patching", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   666
        oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_mirror_patching));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   667
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   668
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   669
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   670
    case load_appendix_patching_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   671
      { __ set_info("load_appendix_patching", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   672
        oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_appendix_patching));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   673
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   674
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   675
#if 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   676
    case dtrace_object_alloc_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   677
      { // rax,: object
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   678
        StubFrame f(sasm, "dtrace_object_alloc", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   679
        // We can't gc here so skip the oopmap but make sure that all
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   680
        // the live registers get saved.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   681
        save_live_registers(sasm, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   682
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   683
        __ NOT_LP64(push(rax)) LP64_ONLY(mov(c_rarg0, rax));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   684
        __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   685
        NOT_LP64(__ pop(rax));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   686
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   687
        restore_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   688
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   689
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   690
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   691
    case fpu2long_stub_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   692
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   693
        // 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
   694
        // preserve rsi,ecx
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   695
        __ push(rsi);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   696
        __ push(rcx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   697
        LP64_ONLY(__ push(rdx);)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   698
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   699
        // check for NaN
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   700
        Label return0, do_return, return_min_jlong, do_convert;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   701
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   702
        Address value_high_word(rsp, wordSize + 4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   703
        Address value_low_word(rsp, wordSize);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   704
        Address result_high_word(rsp, 3*wordSize + 4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   705
        Address result_low_word(rsp, 3*wordSize);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   706
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   707
        __ subptr(rsp, 32);                    // more than enough on 32bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   708
        __ fst_d(value_low_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   709
        __ movl(rax, value_high_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   710
        __ andl(rax, 0x7ff00000);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   711
        __ cmpl(rax, 0x7ff00000);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   712
        __ jcc(Assembler::notEqual, do_convert);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   713
        __ movl(rax, value_high_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   714
        __ andl(rax, 0xfffff);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   715
        __ orl(rax, value_low_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   716
        __ jcc(Assembler::notZero, return0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   717
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   718
        __ bind(do_convert);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   719
        __ fnstcw(Address(rsp, 0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   720
        __ movzwl(rax, Address(rsp, 0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   721
        __ orl(rax, 0xc00);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   722
        __ movw(Address(rsp, 2), rax);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   723
        __ fldcw(Address(rsp, 2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   724
        __ fwait();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   725
        __ fistp_d(result_low_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   726
        __ fldcw(Address(rsp, 0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   727
        __ fwait();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   728
        // This gets the entire long in rax on 64bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   729
        __ movptr(rax, result_low_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   730
        // testing of high bits
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   731
        __ movl(rdx, result_high_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   732
        __ mov(rcx, rax);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   733
        // What the heck is the point of the next instruction???
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   734
        __ xorl(rcx, 0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   735
        __ movl(rsi, 0x80000000);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   736
        __ xorl(rsi, rdx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   737
        __ orl(rcx, rsi);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   738
        __ jcc(Assembler::notEqual, do_return);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   739
        __ fldz();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   740
        __ fcomp_d(value_low_word);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   741
        __ fnstsw_ax();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   742
        __ testl(rax, 0x4100);  // ZF & CF == 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   743
        __ jcc(Assembler::equal, return_min_jlong);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   744
        // return max_jlong
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   745
        __ mov64(rax, CONST64(0x7fffffffffffffff));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   746
        __ jmp(do_return);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   747
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   748
        __ bind(return_min_jlong);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   749
        __ mov64(rax, UCONST64(0x8000000000000000));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   750
        __ jmp(do_return);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   751
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   752
        __ bind(return0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   753
        __ fpop();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   754
        __ xorptr(rax, rax);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   755
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   756
        __ bind(do_return);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   757
        __ addptr(rsp, 32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   758
        LP64_ONLY(__ pop(rdx);)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   759
        __ pop(rcx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   760
        __ pop(rsi);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   761
        __ ret(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   762
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   763
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   764
#endif // TODO
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   765
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   766
#if INCLUDE_ALL_GCS
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   767
    case g1_pre_barrier_slow_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   768
      { // Z_R1_scratch: previous value of memory
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   769
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   770
        BarrierSet* bs = Universe::heap()->barrier_set();
49347
edb65305d3ac 8195148: Collapse G1SATBCardTableModRefBS and G1SATBCardTableLoggingModRefBS into a single G1BarrierSet
eosterlund
parents: 49164
diff changeset
   771
        if (bs->kind() != BarrierSet::G1BarrierSet) {
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   772
          __ should_not_reach_here(FILE_AND_LINE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   773
          break;
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
        __ set_info("g1_pre_barrier_slow_id", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   777
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   778
        Register pre_val = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   779
        Register tmp  = Z_R6; // Must be non-volatile because it is used to save pre_val.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   780
        Register tmp2 = Z_R7;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   781
43449
21041ea7c0fe 8140588: Internal Error: gc/g1/ptrQueue.hpp:126 assert(_index == _sz) failed: invariant: queues are empty when activated
aharlap
parents: 42065
diff changeset
   782
        Label refill, restart, marking_not_active;
21041ea7c0fe 8140588: Internal Error: gc/g1/ptrQueue.hpp:126 assert(_index == _sz) failed: invariant: queues are empty when activated
aharlap
parents: 42065
diff changeset
   783
        int satb_q_active_byte_offset =
21041ea7c0fe 8140588: Internal Error: gc/g1/ptrQueue.hpp:126 assert(_index == _sz) failed: invariant: queues are empty when activated
aharlap
parents: 42065
diff changeset
   784
          in_bytes(JavaThread::satb_mark_queue_offset() +
21041ea7c0fe 8140588: Internal Error: gc/g1/ptrQueue.hpp:126 assert(_index == _sz) failed: invariant: queues are empty when activated
aharlap
parents: 42065
diff changeset
   785
                   SATBMarkQueue::byte_offset_of_active());
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   786
        int satb_q_index_byte_offset =
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   787
          in_bytes(JavaThread::satb_mark_queue_offset() +
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   788
                   SATBMarkQueue::byte_offset_of_index());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   789
        int satb_q_buf_byte_offset =
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   790
          in_bytes(JavaThread::satb_mark_queue_offset() +
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   791
                   SATBMarkQueue::byte_offset_of_buf());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   792
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   793
        // Save tmp registers (see assertion in G1PreBarrierStub::emit_code()).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   794
        __ z_stg(tmp,  0*BytesPerWord + FrameMap::first_available_sp_in_frame, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   795
        __ z_stg(tmp2, 1*BytesPerWord + FrameMap::first_available_sp_in_frame, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   796
43449
21041ea7c0fe 8140588: Internal Error: gc/g1/ptrQueue.hpp:126 assert(_index == _sz) failed: invariant: queues are empty when activated
aharlap
parents: 42065
diff changeset
   797
        // Is marking still active?
21041ea7c0fe 8140588: Internal Error: gc/g1/ptrQueue.hpp:126 assert(_index == _sz) failed: invariant: queues are empty when activated
aharlap
parents: 42065
diff changeset
   798
        if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {
21041ea7c0fe 8140588: Internal Error: gc/g1/ptrQueue.hpp:126 assert(_index == _sz) failed: invariant: queues are empty when activated
aharlap
parents: 42065
diff changeset
   799
          __ load_and_test_int(tmp, Address(Z_thread, satb_q_active_byte_offset));
21041ea7c0fe 8140588: Internal Error: gc/g1/ptrQueue.hpp:126 assert(_index == _sz) failed: invariant: queues are empty when activated
aharlap
parents: 42065
diff changeset
   800
        } else {
21041ea7c0fe 8140588: Internal Error: gc/g1/ptrQueue.hpp:126 assert(_index == _sz) failed: invariant: queues are empty when activated
aharlap
parents: 42065
diff changeset
   801
          assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption");
21041ea7c0fe 8140588: Internal Error: gc/g1/ptrQueue.hpp:126 assert(_index == _sz) failed: invariant: queues are empty when activated
aharlap
parents: 42065
diff changeset
   802
          __ load_and_test_byte(tmp, Address(Z_thread, satb_q_active_byte_offset));
21041ea7c0fe 8140588: Internal Error: gc/g1/ptrQueue.hpp:126 assert(_index == _sz) failed: invariant: queues are empty when activated
aharlap
parents: 42065
diff changeset
   803
        }
21041ea7c0fe 8140588: Internal Error: gc/g1/ptrQueue.hpp:126 assert(_index == _sz) failed: invariant: queues are empty when activated
aharlap
parents: 42065
diff changeset
   804
        __ z_bre(marking_not_active); // Activity indicator is zero, so there is no marking going on currently.
21041ea7c0fe 8140588: Internal Error: gc/g1/ptrQueue.hpp:126 assert(_index == _sz) failed: invariant: queues are empty when activated
aharlap
parents: 42065
diff changeset
   805
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   806
        __ bind(restart);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   807
        // Load the index into the SATB buffer. SATBMarkQueue::_index is a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   808
        // size_t so ld_ptr is appropriate.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   809
        __ z_ltg(tmp, satb_q_index_byte_offset, Z_R0, Z_thread);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   810
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   811
        // index == 0?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   812
        __ z_brz(refill);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   813
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   814
        __ z_lg(tmp2, satb_q_buf_byte_offset, Z_thread);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   815
        __ add2reg(tmp, -oopSize);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   816
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   817
        __ z_stg(pre_val, 0, tmp, tmp2); // [_buf + index] := <address_of_card>
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   818
        __ z_stg(tmp, satb_q_index_byte_offset, Z_thread);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   819
43449
21041ea7c0fe 8140588: Internal Error: gc/g1/ptrQueue.hpp:126 assert(_index == _sz) failed: invariant: queues are empty when activated
aharlap
parents: 42065
diff changeset
   820
        __ bind(marking_not_active);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   821
        // Restore tmp registers (see assertion in G1PreBarrierStub::emit_code()).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   822
        __ z_lg(tmp,  0*BytesPerWord + FrameMap::first_available_sp_in_frame, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   823
        __ z_lg(tmp2, 1*BytesPerWord + FrameMap::first_available_sp_in_frame, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   824
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   825
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   826
        __ bind(refill);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   827
        save_volatile_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   828
        __ z_lgr(tmp, pre_val); // save pre_val
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   829
        __ call_VM_leaf(CAST_FROM_FN_PTR(address, SATBMarkQueueSet::handle_zero_index_for_thread),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   830
                        Z_thread);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   831
        __ z_lgr(pre_val, tmp); // restore pre_val
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   832
        restore_volatile_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   833
        __ z_bru(restart);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   834
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   835
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   836
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   837
    case g1_post_barrier_slow_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   838
      { // Z_R1_scratch: oop address, address of updated memory slot
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   839
        BarrierSet* bs = Universe::heap()->barrier_set();
49347
edb65305d3ac 8195148: Collapse G1SATBCardTableModRefBS and G1SATBCardTableLoggingModRefBS into a single G1BarrierSet
eosterlund
parents: 49164
diff changeset
   840
        if (bs->kind() != BarrierSet::G1BarrierSet) {
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   841
          __ should_not_reach_here(FILE_AND_LINE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   842
          break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   843
        }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   844
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   845
        __ set_info("g1_post_barrier_slow_id", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   846
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   847
        Register addr_oop  = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   848
        Register addr_card = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   849
        Register r1        = Z_R6; // Must be saved/restored.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   850
        Register r2        = Z_R7; // Must be saved/restored.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   851
        Register cardtable = r1;   // Must be non-volatile, because it is used to save addr_card.
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 49010
diff changeset
   852
        jbyte* byte_map_base = ci_card_table_address();
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   853
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   854
        // Save registers used below (see assertion in G1PreBarrierStub::emit_code()).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   855
        __ z_stg(r1, 0*BytesPerWord + FrameMap::first_available_sp_in_frame, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   856
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   857
        Label not_already_dirty, restart, refill, young_card;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   858
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   859
        // Calculate address of card corresponding to the updated oop slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   860
        AddressLiteral rs(byte_map_base);
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 49010
diff changeset
   861
        __ z_srlg(addr_card, addr_oop, CardTable::card_shift);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   862
        addr_oop = noreg; // dead now
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   863
        __ load_const_optimized(cardtable, rs); // cardtable := <card table base>
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   864
        __ z_agr(addr_card, cardtable); // addr_card := addr_oop>>card_shift + cardtable
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   865
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 49010
diff changeset
   866
        __ z_cli(0, addr_card, (int)G1CardTable::g1_young_card_val());
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   867
        __ z_bre(young_card);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   868
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   869
        __ z_sync(); // Required to support concurrent cleaning.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   870
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 49010
diff changeset
   871
        __ z_cli(0, addr_card, (int)CardTable::dirty_card_val());
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   872
        __ z_brne(not_already_dirty);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   873
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   874
        __ bind(young_card);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   875
        // We didn't take the branch, so we're already dirty: restore
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   876
        // used registers and return.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   877
        __ z_lg(r1, 0*BytesPerWord + FrameMap::first_available_sp_in_frame, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   878
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   879
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   880
        // Not dirty.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   881
        __ bind(not_already_dirty);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   882
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   883
        // First, dirty it: [addr_card] := 0
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 49010
diff changeset
   884
        __ z_mvi(0, addr_card, CardTable::dirty_card_val());
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   885
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   886
        Register idx = cardtable; // Must be non-volatile, because it is used to save addr_card.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   887
        Register buf = r2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   888
        cardtable = noreg; // now dead
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   889
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   890
        // Save registers used below (see assertion in G1PreBarrierStub::emit_code()).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   891
        __ z_stg(r2, 1*BytesPerWord + FrameMap::first_available_sp_in_frame, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   892
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   893
        ByteSize dirty_card_q_index_byte_offset =
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   894
          JavaThread::dirty_card_queue_offset() + DirtyCardQueue::byte_offset_of_index();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   895
        ByteSize dirty_card_q_buf_byte_offset =
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   896
          JavaThread::dirty_card_queue_offset() + DirtyCardQueue::byte_offset_of_buf();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   897
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   898
        __ bind(restart);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   899
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   900
        // Get the index into the update buffer. DirtyCardQueue::_index is
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   901
        // a size_t so z_ltg is appropriate here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   902
        __ z_ltg(idx, Address(Z_thread, dirty_card_q_index_byte_offset));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   903
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   904
        // index == 0?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   905
        __ z_brz(refill);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   906
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   907
        __ z_lg(buf, Address(Z_thread, dirty_card_q_buf_byte_offset));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   908
        __ add2reg(idx, -oopSize);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   909
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   910
        __ z_stg(addr_card, 0, idx, buf); // [_buf + index] := <address_of_card>
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   911
        __ z_stg(idx, Address(Z_thread, dirty_card_q_index_byte_offset));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   912
        // Restore killed registers and return.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   913
        __ z_lg(r1, 0*BytesPerWord + FrameMap::first_available_sp_in_frame, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   914
        __ z_lg(r2, 1*BytesPerWord + FrameMap::first_available_sp_in_frame, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   915
        __ z_br(Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   916
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   917
        __ bind(refill);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   918
        save_volatile_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   919
        __ z_lgr(idx, addr_card); // Save addr_card, tmp3 must be non-volatile.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   920
        __ call_VM_leaf(CAST_FROM_FN_PTR(address, DirtyCardQueueSet::handle_zero_index_for_thread),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   921
                                         Z_thread);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   922
        __ z_lgr(addr_card, idx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   923
        restore_volatile_registers(sasm); // Restore addr_card.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   924
        __ z_bru(restart);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   925
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   926
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   927
#endif // INCLUDE_ALL_GCS
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   928
    case predicate_failed_trap_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   929
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   930
        __ set_info("predicate_failed_trap", dont_gc_arguments);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   931
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   932
        OopMap* map = save_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   933
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   934
        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
   935
        oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   936
        oop_maps->add_gc_map(call_offset, map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   937
        restore_live_registers(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   938
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   939
        DeoptimizationBlob* deopt_blob = SharedRuntime::deopt_blob();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   940
        assert(deopt_blob != NULL, "deoptimization blob must have been created");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   941
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   942
        __ load_const_optimized(Z_R1_scratch, deopt_blob->unpack_with_reexecution());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   943
        __ z_br(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   944
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   945
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   946
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   947
    default:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   948
      {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   949
        __ should_not_reach_here(FILE_AND_LINE, id);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   950
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   951
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   952
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   953
  return oop_maps;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   954
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   955
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   956
OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler *sasm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   957
  __ block_comment("generate_handle_exception");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   958
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   959
  // incoming parameters: Z_EXC_OOP, Z_EXC_PC
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   960
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   961
  // Save registers if required.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   962
  OopMapSet* oop_maps = new OopMapSet();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   963
  OopMap* oop_map = NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   964
  Register reg_fp = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   965
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   966
  switch (id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   967
    case forward_exception_id: {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   968
      // We're handling an exception in the context of a compiled frame.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   969
      // The registers have been saved in the standard places. Perform
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   970
      // an exception lookup in the caller and dispatch to the handler
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   971
      // if found. Otherwise unwind and dispatch to the callers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   972
      // exception handler.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   973
      oop_map = generate_oop_map(sasm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   974
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   975
      // Load and clear pending exception oop into.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   976
      __ z_lg(Z_EXC_OOP, Address(Z_thread, Thread::pending_exception_offset()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   977
      __ clear_mem(Address(Z_thread, Thread::pending_exception_offset()), 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   978
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   979
      // Different stubs forward their exceptions; they should all have similar frame layouts
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   980
      // (a) to find their return address (b) for a correct oop_map generated above.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   981
      assert(RegisterSaver::live_reg_frame_size(RegisterSaver::all_registers) ==
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   982
             RegisterSaver::live_reg_frame_size(RegisterSaver::all_registers_except_r2), "requirement");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   983
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   984
      // Load issuing PC (the return address for this stub).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   985
      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
   986
      __ 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
   987
      DEBUG_ONLY(__ z_lay(reg_fp, Address(Z_SP, frame_size_in_bytes));)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   988
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   989
      // Make sure that the vm_results are cleared (may be unnecessary).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   990
      __ clear_mem(Address(Z_thread, JavaThread::vm_result_offset()),   sizeof(oop));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   991
      __ clear_mem(Address(Z_thread, JavaThread::vm_result_2_offset()), sizeof(Metadata*));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   992
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   993
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   994
    case handle_exception_nofpu_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   995
    case handle_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   996
      // At this point all registers MAY be live.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   997
      DEBUG_ONLY(__ z_lgr(reg_fp, Z_SP);)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   998
      oop_map = save_live_registers(sasm, id != handle_exception_nofpu_id, Z_EXC_PC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   999
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1000
    case handle_exception_from_callee_id: {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1001
      // 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
  1002
      DEBUG_ONLY(__ z_lgr(reg_fp, Z_SP);)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1003
      __ save_return_pc(Z_EXC_PC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1004
      const int frame_size_in_bytes = __ push_frame_abi160(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1005
      oop_map = new OopMap(frame_size_in_bytes / VMRegImpl::stack_slot_size, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1006
      sasm->set_frame_size(frame_size_in_bytes / BytesPerWord);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1007
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1008
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1009
    default:  ShouldNotReachHere();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1010
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1011
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1012
  // 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
  1013
  __ invalidate_registers(Z_EXC_OOP, Z_EXC_PC, reg_fp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1014
  // Verify that Z_EXC_OOP, contains a valid exception.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1015
  __ verify_not_null_oop(Z_EXC_OOP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1016
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1017
  // Check that fields in JavaThread for exception oop and issuing pc
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1018
  // are empty before writing to them.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1019
  __ 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
  1020
  __ 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
  1021
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1022
  // Save exception oop and issuing pc into JavaThread.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1023
  // (Exception handler will load it from here.)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1024
  __ z_stg(Z_EXC_OOP, Address(Z_thread, JavaThread::exception_oop_offset()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1025
  __ z_stg(Z_EXC_PC, Address(Z_thread, JavaThread::exception_pc_offset()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1026
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1027
#ifdef ASSERT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1028
  { NearLabel ok;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1029
    __ z_cg(Z_EXC_PC, Address(reg_fp, _z_abi16(return_pc)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1030
    __ branch_optimized(Assembler::bcondEqual, ok);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1031
    __ stop("use throwing pc as return address (has bci & oop map)");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1032
    __ bind(ok);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1033
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1034
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1035
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1036
  // Compute the exception handler.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1037
  // The exception oop and the throwing pc are read from the fields in JavaThread.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1038
  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
  1039
  oop_maps->add_gc_map(call_offset, oop_map);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1040
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1041
  // Z_RET(Z_R2): handler address
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1042
  //   will be the deopt blob if nmethod was deoptimized while we looked up
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1043
  //   handler regardless of whether handler existed in the nmethod.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1044
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1045
  // 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
  1046
  __ invalidate_registers(Z_R2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1047
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1048
  switch(id) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1049
    case forward_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1050
    case handle_exception_nofpu_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1051
    case handle_exception_id:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1052
      // Restore the registers that were saved at the beginning.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1053
      __ z_lgr(Z_R1_scratch, Z_R2);   // Restoring live registers kills Z_R2.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1054
      restore_live_registers(sasm, id != handle_exception_nofpu_id);  // Pops as well the frame.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1055
      __ z_br(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1056
      break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1057
    case handle_exception_from_callee_id: {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1058
      __ pop_frame();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1059
      __ z_br(Z_R2); // Jump to exception handler.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1060
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1061
    break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1062
    default:  ShouldNotReachHere();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1063
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1064
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1065
  return oop_maps;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1066
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1067
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1068
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1069
#undef __
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1070
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1071
const char *Runtime1::pd_name_for_address(address entry) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1072
  return "<unknown function>";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1073
}