src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 57811 947252a54b98
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     1
/*
49397
d3a8aa01f26f 8071282: remove misc dead code
rraghavan
parents: 47216
diff changeset
     2
 * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     3
 * Copyright (c) 2016 SAP SE. All rights reserved.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     5
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     8
 * published by the Free Software Foundation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     9
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    14
 * accompanied this code).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    15
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    19
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    22
 * questions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    23
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    24
 */
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    25
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    26
#include "precompiled.hpp"
50380
bec342339138 8204195: Clean up macroAssembler.inline.hpp and other inline.hpp files included in .hpp files
coleenp
parents: 49397
diff changeset
    27
#include "asm/macroAssembler.inline.hpp"
42065
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"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    30
#include "classfile/systemDictionary.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    31
#include "gc/shared/collectedHeap.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    32
#include "interpreter/interpreter.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    33
#include "oops/arrayOop.hpp"
57811
947252a54b98 8229838: Rename markOop files to markWord
stefank
parents: 57777
diff changeset
    34
#include "oops/markWord.hpp"
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    35
#include "runtime/basicLock.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    36
#include "runtime/biasedLocking.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    37
#include "runtime/os.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    38
#include "runtime/sharedRuntime.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    39
#include "runtime/stubRoutines.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    40
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    41
void C1_MacroAssembler::inline_cache_check(Register receiver, Register iCache) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    42
  Label ic_miss, ic_hit;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    43
  verify_oop(receiver);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    44
  int klass_offset = oopDesc::klass_offset_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    45
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    46
  if (!ImplicitNullChecks || MacroAssembler::needs_explicit_null_check(klass_offset)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    47
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    48
      z_cgij(receiver, 0, Assembler::bcondEqual, ic_miss);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    49
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    50
      z_ltgr(receiver, receiver);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    51
      z_bre(ic_miss);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    52
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    53
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    54
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    55
  compare_klass_ptr(iCache, klass_offset, receiver, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    56
  z_bre(ic_hit);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    57
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    58
  // If icache check fails, then jump to runtime routine.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    59
  // Note: RECEIVER must still contain the receiver!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    60
  load_const_optimized(Z_R1_scratch, AddressLiteral(SharedRuntime::get_ic_miss_stub()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    61
  z_br(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    62
  align(CodeEntryAlignment);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    63
  bind(ic_hit);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    64
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    65
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    66
void C1_MacroAssembler::explicit_null_check(Register base) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    67
  ShouldNotCallThis(); // unused
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    68
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    69
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    70
void C1_MacroAssembler::build_frame(int frame_size_in_bytes, int bang_size_in_bytes) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    71
  assert(bang_size_in_bytes >= frame_size_in_bytes, "stack bang size incorrect");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    72
  generate_stack_overflow_check(bang_size_in_bytes);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    73
  save_return_pc();
46726
7801367e3cc9 8180659: [s390] micro-optimization in resize_frame_absolute()
lucy
parents: 42065
diff changeset
    74
  push_frame(frame_size_in_bytes);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    75
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    76
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    77
void C1_MacroAssembler::verified_entry() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    78
  if (C1Breakpoint) z_illtrap(0xC1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    79
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    80
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    81
void C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr, Label& slow_case) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    82
  const int hdr_offset = oopDesc::mark_offset_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    83
  assert_different_registers(hdr, obj, disp_hdr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    84
  NearLabel done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    85
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    86
  verify_oop(obj);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    87
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    88
  // Load object header.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    89
  z_lg(hdr, Address(obj, hdr_offset));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    90
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    91
  // Save object being locked into the BasicObjectLock...
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    92
  z_stg(obj, Address(disp_hdr, BasicObjectLock::obj_offset_in_bytes()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    93
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    94
  if (UseBiasedLocking) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    95
    biased_locking_enter(obj, hdr, Z_R1_scratch, Z_R0_scratch, done, &slow_case);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    96
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    97
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    98
  // and mark it as unlocked.
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 50380
diff changeset
    99
  z_oill(hdr, markWord::unlocked_value);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   100
  // Save unlocked object header into the displaced header location on the stack.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   101
  z_stg(hdr, Address(disp_hdr, (intptr_t)0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   102
  // Test if object header is still the same (i.e. unlocked), and if so, store the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   103
  // displaced header address in the object header. If it is not the same, get the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   104
  // object header instead.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   105
  z_csg(hdr, disp_hdr, hdr_offset, obj);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   106
  // If the object header was the same, we're done.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   107
  if (PrintBiasedLockingStatistics) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   108
    Unimplemented();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   109
#if 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   110
    cond_inc32(Assembler::equal,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   111
               ExternalAddress((address)BiasedLocking::fast_path_entry_count_addr()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   112
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   113
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   114
  branch_optimized(Assembler::bcondEqual, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   115
  // If the object header was not the same, it is now in the hdr register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   116
  // => Test if it is a stack pointer into the same stack (recursive locking), i.e.:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   117
  //
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 50380
diff changeset
   118
  // 1) (hdr & markWord::lock_mask_in_place) == 0
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   119
  // 2) rsp <= hdr
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   120
  // 3) hdr <= rsp + page_size
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   121
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   122
  // These 3 tests can be done by evaluating the following expression:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   123
  //
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 50380
diff changeset
   124
  // (hdr - Z_SP) & (~(page_size-1) | markWord::lock_mask_in_place)
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   125
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   126
  // assuming both the stack pointer and page_size have their least
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   127
  // significant 2 bits cleared and page_size is a power of 2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   128
  z_sgr(hdr, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   129
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 50380
diff changeset
   130
  load_const_optimized(Z_R0_scratch, (~(os::vm_page_size()-1) | markWord::lock_mask_in_place));
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   131
  z_ngr(hdr, Z_R0_scratch); // AND sets CC (result eq/ne 0).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   132
  // For recursive locking, the result is zero. => Save it in the displaced header
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   133
  // location (NULL in the displaced hdr location indicates recursive locking).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   134
  z_stg(hdr, Address(disp_hdr, (intptr_t)0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   135
  // Otherwise we don't care about the result and handle locking via runtime call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   136
  branch_optimized(Assembler::bcondNotZero, slow_case);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   137
  // done
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   138
  bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   139
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   140
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   141
void C1_MacroAssembler::unlock_object(Register hdr, Register obj, Register disp_hdr, Label& slow_case) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   142
  const int aligned_mask = BytesPerWord -1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   143
  const int hdr_offset = oopDesc::mark_offset_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   144
  assert_different_registers(hdr, obj, disp_hdr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   145
  NearLabel done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   146
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   147
  if (UseBiasedLocking) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   148
    // Load object.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   149
    z_lg(obj, Address(disp_hdr, BasicObjectLock::obj_offset_in_bytes()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   150
    biased_locking_exit(obj, hdr, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   151
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   152
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   153
  // Load displaced header.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   154
  z_ltg(hdr, Address(disp_hdr, (intptr_t)0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   155
  // If the loaded hdr is NULL we had recursive locking, and we are done.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   156
  z_bre(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   157
  if (!UseBiasedLocking) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   158
    // Load object.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   159
    z_lg(obj, Address(disp_hdr, BasicObjectLock::obj_offset_in_bytes()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   160
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   161
  verify_oop(obj);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   162
  // Test if object header is pointing to the displaced header, and if so, restore
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   163
  // the displaced header in the object. If the object header is not pointing to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   164
  // the displaced header, get the object header instead.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   165
  z_csg(disp_hdr, hdr, hdr_offset, obj);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   166
  // If the object header was not pointing to the displaced header,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   167
  // we do unlocking via runtime call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   168
  branch_optimized(Assembler::bcondNotEqual, slow_case);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   169
  // done
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   170
  bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   171
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   172
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   173
void C1_MacroAssembler::try_allocate(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   174
  Register obj,                        // result: Pointer to object after successful allocation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   175
  Register var_size_in_bytes,          // Object size in bytes if unknown at compile time; invalid otherwise.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   176
  int      con_size_in_bytes,          // Object size in bytes if   known at compile time.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   177
  Register t1,                         // Temp register: Must be global register for incr_allocated_bytes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   178
  Label&   slow_case                   // Continuation point if fast allocation fails.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   179
) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   180
  if (UseTLAB) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   181
    tlab_allocate(obj, var_size_in_bytes, con_size_in_bytes, t1, slow_case);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   182
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   183
    // Allocation in shared Eden not implemented, because sapjvm allocation trace does not allow it.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   184
    z_brul(slow_case);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   185
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   186
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   187
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   188
void C1_MacroAssembler::initialize_header(Register obj, Register klass, Register len, Register Rzero, Register t1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   189
  assert_different_registers(obj, klass, len, t1, Rzero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   190
  if (UseBiasedLocking && !len->is_valid()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   191
    assert_different_registers(obj, klass, len, t1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   192
    z_lg(t1, Address(klass, Klass::prototype_header_offset()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   193
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   194
    // This assumes that all prototype bits fit in an int32_t.
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 50380
diff changeset
   195
    load_const_optimized(t1, (intx)markWord::prototype().value());
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   196
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   197
  z_stg(t1, Address(obj, oopDesc::mark_offset_in_bytes()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   198
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   199
  if (len->is_valid()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   200
    // Length will be in the klass gap, if one exists.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   201
    z_st(len, Address(obj, arrayOopDesc::length_offset_in_bytes()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   202
  } else if (UseCompressedClassPointers) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   203
    store_klass_gap(Rzero, obj);  // Zero klass gap for compressed oops.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   204
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   205
  store_klass(klass, obj, t1);
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
void C1_MacroAssembler::initialize_body(Register objectFields, Register len_in_bytes, Register Rzero) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   209
  Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   210
  assert_different_registers(objectFields, len_in_bytes, Rzero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   211
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   212
  // Initialize object fields.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   213
  // See documentation for MVCLE instruction!!!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   214
  assert(objectFields->encoding()%2==0, "objectFields must be an even register");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   215
  assert(len_in_bytes->encoding() == (objectFields->encoding()+1), "objectFields and len_in_bytes must be a register pair");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   216
  assert(Rzero->encoding()%2==1, "Rzero must be an odd register");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   217
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   218
  // Use Rzero as src length, then mvcle will copy nothing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   219
  // and fill the object with the padding value 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   220
  move_long_ext(objectFields, as_Register(Rzero->encoding()-1), 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   221
  bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   222
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   223
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   224
void C1_MacroAssembler::allocate_object(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   225
  Register obj,                        // Result: pointer to object after successful allocation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   226
  Register t1,                         // temp register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   227
  Register t2,                         // temp register: Must be a global register for try_allocate.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   228
  int      hdr_size,                   // object header size in words
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   229
  int      obj_size,                   // object size in words
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   230
  Register klass,                      // object klass
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   231
  Label&   slow_case                   // Continuation point if fast allocation fails.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   232
) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   233
  assert_different_registers(obj, t1, t2, klass);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   234
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   235
  // Allocate space and initialize header.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   236
  try_allocate(obj, noreg, obj_size * wordSize, t1, slow_case);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   237
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   238
  initialize_object(obj, klass, noreg, obj_size * HeapWordSize, t1, t2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   239
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   240
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   241
void C1_MacroAssembler::initialize_object(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   242
  Register obj,                        // result: Pointer to object after successful allocation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   243
  Register klass,                      // object klass
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   244
  Register var_size_in_bytes,          // Object size in bytes if unknown at compile time; invalid otherwise.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   245
  int      con_size_in_bytes,          // Object size in bytes if   known at compile time.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   246
  Register t1,                         // temp register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   247
  Register t2                          // temp register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   248
 ) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   249
  assert((con_size_in_bytes & MinObjAlignmentInBytesMask) == 0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   250
         "con_size_in_bytes is not multiple of alignment");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   251
  assert(var_size_in_bytes == noreg, "not implemented");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   252
  const int hdr_size_in_bytes = instanceOopDesc::header_size() * HeapWordSize;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   253
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   254
  const Register Rzero = t2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   255
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   256
  z_xgr(Rzero, Rzero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   257
  initialize_header(obj, klass, noreg, Rzero, t1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   258
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   259
  // Clear rest of allocated space.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   260
  const int threshold = 4 * BytesPerWord;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   261
  if (con_size_in_bytes <= threshold) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   262
    // Use explicit null stores.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   263
    // code size = 6*n bytes (n = number of fields to clear)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   264
    for (int i = hdr_size_in_bytes; i < con_size_in_bytes; i += BytesPerWord)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   265
      z_stg(Rzero, Address(obj, i));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   266
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   267
    // Code size generated by initialize_body() is 16.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   268
    Register object_fields = Z_R0_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   269
    Register len_in_bytes  = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   270
    z_la(object_fields, hdr_size_in_bytes, obj);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   271
    load_const_optimized(len_in_bytes, con_size_in_bytes - hdr_size_in_bytes);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   272
    initialize_body(object_fields, len_in_bytes, Rzero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   273
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   274
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   275
  // Dtrace support is unimplemented.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   276
  //  if (CURRENT_ENV->dtrace_alloc_probes()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   277
  //    assert(obj == rax, "must be");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   278
  //    call(RuntimeAddress(Runtime1::entry_for (Runtime1::dtrace_object_alloc_id)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   279
  //  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   280
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   281
  verify_oop(obj);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   282
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   283
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   284
void C1_MacroAssembler::allocate_array(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   285
  Register obj,                        // result: Pointer to array after successful allocation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   286
  Register len,                        // array length
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   287
  Register t1,                         // temp register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   288
  Register t2,                         // temp register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   289
  int      hdr_size,                   // object header size in words
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   290
  int      elt_size,                   // element size in bytes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   291
  Register klass,                      // object klass
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   292
  Label&   slow_case                   // Continuation point if fast allocation fails.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   293
) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   294
  assert_different_registers(obj, len, t1, t2, klass);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   295
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   296
  // Determine alignment mask.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   297
  assert(!(BytesPerWord & 1), "must be a multiple of 2 for masking code to work");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   298
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   299
  // Check for negative or excessive length.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   300
  compareU64_and_branch(len, (int32_t)max_array_allocation_length, bcondHigh, slow_case);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   301
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   302
  // Compute array size.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   303
  // Note: If 0 <= len <= max_length, len*elt_size + header + alignment is
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   304
  // smaller or equal to the largest integer. Also, since top is always
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   305
  // aligned, we can do the alignment here instead of at the end address
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   306
  // computation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   307
  const Register arr_size = t2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   308
  switch (elt_size) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   309
    case  1: lgr_if_needed(arr_size, len); break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   310
    case  2: z_sllg(arr_size, len, 1); break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   311
    case  4: z_sllg(arr_size, len, 2); break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   312
    case  8: z_sllg(arr_size, len, 3); break;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   313
    default: ShouldNotReachHere();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   314
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   315
  add2reg(arr_size, hdr_size * wordSize + MinObjAlignmentInBytesMask); // Add space for header & alignment.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   316
  z_nill(arr_size, (~MinObjAlignmentInBytesMask) & 0xffff);            // Align array size.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   317
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   318
  try_allocate(obj, arr_size, 0, t1, slow_case);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   319
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   320
  initialize_header(obj, klass, len, noreg, t1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   321
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   322
  // Clear rest of allocated space.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   323
  Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   324
  Register object_fields = t1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   325
  Register Rzero = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   326
  z_aghi(arr_size, -(hdr_size * BytesPerWord));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   327
  z_bre(done); // Jump if size of fields is zero.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   328
  z_la(object_fields, hdr_size * BytesPerWord, obj);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   329
  z_xgr(Rzero, Rzero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   330
  initialize_body(object_fields, arr_size, Rzero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   331
  bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   332
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   333
  // Dtrace support is unimplemented.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   334
  // if (CURRENT_ENV->dtrace_alloc_probes()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   335
  //   assert(obj == rax, "must be");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   336
  //   call(RuntimeAddress(Runtime1::entry_for (Runtime1::dtrace_object_alloc_id)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   337
  // }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   338
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   339
  verify_oop(obj);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   340
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   341
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   342
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   343
#ifndef PRODUCT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   344
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   345
void C1_MacroAssembler::verify_stack_oop(int stack_offset) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   346
  Unimplemented();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   347
  // if (!VerifyOops) return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   348
  // verify_oop_addr(Address(SP, stack_offset + STACK_BIAS));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   349
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   350
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   351
void C1_MacroAssembler::verify_not_null_oop(Register r) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   352
  if (!VerifyOops) return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   353
  NearLabel not_null;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   354
  compareU64_and_branch(r, (intptr_t)0, bcondNotEqual, not_null);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   355
  stop("non-null oop required");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   356
  bind(not_null);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   357
  verify_oop(r);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   358
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   359
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   360
void C1_MacroAssembler::invalidate_registers(Register preserve1,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   361
                                             Register preserve2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   362
                                             Register preserve3) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   363
  Register dead_value = noreg;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   364
  for (int i = 0; i < FrameMap::nof_cpu_regs; i++) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   365
    Register r = as_Register(i);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   366
    if (r != preserve1 && r != preserve2 && r != preserve3 && r != Z_SP && r != Z_thread) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   367
      if (dead_value == noreg) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   368
        load_const_optimized(r, 0xc1dead);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   369
        dead_value = r;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   370
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   371
        z_lgr(r, dead_value);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   372
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   373
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   374
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   375
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   376
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   377
#endif // !PRODUCT