src/hotspot/cpu/aarch64/gc/z/zBarrierSetAssembler_aarch64.cpp
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 58516 d376d86b0a01
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
     1
/*
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
     4
 *
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
     7
 * published by the Free Software Foundation.
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
     8
 *
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    13
 * accompanied this code).
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    14
 *
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    18
 *
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    21
 * questions.
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    22
 */
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    23
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    24
#include "precompiled.hpp"
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    25
#include "asm/macroAssembler.inline.hpp"
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    26
#include "code/codeBlob.hpp"
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
    27
#include "code/vmreg.inline.hpp"
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    28
#include "gc/z/zBarrier.inline.hpp"
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    29
#include "gc/z/zBarrierSet.hpp"
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    30
#include "gc/z/zBarrierSetAssembler.hpp"
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    31
#include "gc/z/zBarrierSetRuntime.hpp"
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
    32
#include "gc/z/zThreadLocalData.hpp"
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    33
#include "memory/resourceArea.hpp"
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
    34
#include "runtime/sharedRuntime.hpp"
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
    35
#include "utilities/macros.hpp"
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    36
#ifdef COMPILER1
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    37
#include "c1/c1_LIRAssembler.hpp"
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    38
#include "c1/c1_MacroAssembler.hpp"
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    39
#include "gc/z/c1/zBarrierSetC1.hpp"
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    40
#endif // COMPILER1
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
    41
#ifdef COMPILER2
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
    42
#include "gc/z/c2/zBarrierSetC2.hpp"
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
    43
#endif // COMPILER2
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    44
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    45
#ifdef PRODUCT
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    46
#define BLOCK_COMMENT(str) /* nothing */
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    47
#else
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    48
#define BLOCK_COMMENT(str) __ block_comment(str)
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    49
#endif
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    50
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    51
#undef __
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    52
#define __ masm->
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    53
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    54
void ZBarrierSetAssembler::load_at(MacroAssembler* masm,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    55
                                   DecoratorSet decorators,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    56
                                   BasicType type,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    57
                                   Register dst,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    58
                                   Address src,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    59
                                   Register tmp1,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    60
                                   Register tmp_thread) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    61
  if (!ZBarrierSet::barrier_needed(decorators, type)) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    62
    // Barrier not needed
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    63
    BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    64
    return;
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    65
  }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    66
55504
b7f68ddec66f 8226515: AArch64: float point register corruption in ZBarrierSetAssembler::load_at
smonteith
parents: 55379
diff changeset
    67
  assert_different_registers(rscratch1, rscratch2, src.base());
b7f68ddec66f 8226515: AArch64: float point register corruption in ZBarrierSetAssembler::load_at
smonteith
parents: 55379
diff changeset
    68
  assert_different_registers(rscratch1, rscratch2, dst);
b7f68ddec66f 8226515: AArch64: float point register corruption in ZBarrierSetAssembler::load_at
smonteith
parents: 55379
diff changeset
    69
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
    70
  RegSet savedRegs = RegSet::range(r0, r28) - RegSet::of(dst, rscratch1, rscratch2);
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    71
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    72
  Label done;
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    73
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    74
  // Load bad mask into scratch register.
55504
b7f68ddec66f 8226515: AArch64: float point register corruption in ZBarrierSetAssembler::load_at
smonteith
parents: 55379
diff changeset
    75
  __ ldr(rscratch1, address_bad_mask_from_thread(rthread));
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    76
  __ lea(rscratch2, src);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    77
  __ ldr(dst, src);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    78
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    79
  // Test reference against bad mask. If mask bad, then we need to fix it up.
55504
b7f68ddec66f 8226515: AArch64: float point register corruption in ZBarrierSetAssembler::load_at
smonteith
parents: 55379
diff changeset
    80
  __ tst(dst, rscratch1);
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    81
  __ br(Assembler::EQ, done);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    82
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    83
  __ enter();
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    84
55504
b7f68ddec66f 8226515: AArch64: float point register corruption in ZBarrierSetAssembler::load_at
smonteith
parents: 55379
diff changeset
    85
  __ push(savedRegs, sp);
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    86
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    87
  if (c_rarg0 != dst) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    88
    __ mov(c_rarg0, dst);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    89
  }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    90
  __ mov(c_rarg1, rscratch2);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    91
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    92
  int step = 4 * wordSize;
55504
b7f68ddec66f 8226515: AArch64: float point register corruption in ZBarrierSetAssembler::load_at
smonteith
parents: 55379
diff changeset
    93
  __ mov(rscratch2, -step);
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    94
  __ sub(sp, sp, step);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    95
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    96
  for (int i = 28; i >= 4; i -= 4) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    97
    __ st1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
55504
b7f68ddec66f 8226515: AArch64: float point register corruption in ZBarrierSetAssembler::load_at
smonteith
parents: 55379
diff changeset
    98
        as_FloatRegister(i+3), __ T1D, Address(__ post(sp, rscratch2)));
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
    99
  }
55504
b7f68ddec66f 8226515: AArch64: float point register corruption in ZBarrierSetAssembler::load_at
smonteith
parents: 55379
diff changeset
   100
  __ st1(as_FloatRegister(0), as_FloatRegister(1), as_FloatRegister(2),
b7f68ddec66f 8226515: AArch64: float point register corruption in ZBarrierSetAssembler::load_at
smonteith
parents: 55379
diff changeset
   101
      as_FloatRegister(3), __ T1D, Address(sp));
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   102
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   103
  __ call_VM_leaf(ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr(decorators), 2);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   104
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   105
  for (int i = 0; i <= 28; i += 4) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   106
    __ ld1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   107
        as_FloatRegister(i+3), __ T1D, Address(__ post(sp, step)));
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   108
  }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   109
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   110
  // Make sure dst has the return value.
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   111
  if (dst != r0) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   112
    __ mov(dst, r0);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   113
  }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   114
55504
b7f68ddec66f 8226515: AArch64: float point register corruption in ZBarrierSetAssembler::load_at
smonteith
parents: 55379
diff changeset
   115
  __ pop(savedRegs, sp);
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   116
  __ leave();
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   117
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   118
  __ bind(done);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   119
}
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   120
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   121
#ifdef ASSERT
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   122
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   123
void ZBarrierSetAssembler::store_at(MacroAssembler* masm,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   124
                                        DecoratorSet decorators,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   125
                                        BasicType type,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   126
                                        Address dst,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   127
                                        Register val,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   128
                                        Register tmp1,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   129
                                        Register tmp2) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   130
  // Verify value
58273
08a5148e7c4e 8230505: Replace JVM type comparisons to T_OBJECT and T_ARRAY with call to is_reference_type
lfoltan
parents: 55504
diff changeset
   131
  if (is_reference_type(type)) {
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   132
    // Note that src could be noreg, which means we
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   133
    // are storing null and can skip verification.
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   134
    if (val != noreg) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   135
      Label done;
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   136
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   137
      // tmp1 and tmp2 are often set to noreg.
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   138
      RegSet savedRegs = RegSet::of(rscratch1);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   139
      __ push(savedRegs, sp);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   140
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   141
      __ ldr(rscratch1, address_bad_mask_from_thread(rthread));
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   142
      __ tst(val, rscratch1);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   143
      __ br(Assembler::EQ, done);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   144
      __ stop("Verify oop store failed");
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   145
      __ should_not_reach_here();
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   146
      __ bind(done);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   147
      __ pop(savedRegs, sp);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   148
    }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   149
  }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   150
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   151
  // Store value
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   152
  BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   153
}
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   154
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   155
#endif // ASSERT
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   156
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   157
void ZBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   158
                                              DecoratorSet decorators,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   159
                                              bool is_oop,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   160
                                              Register src,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   161
                                              Register dst,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   162
                                              Register count,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   163
                                              RegSet saved_regs) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   164
  if (!is_oop) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   165
    // Barrier not needed
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   166
    return;
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   167
  }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   168
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   169
  BLOCK_COMMENT("ZBarrierSetAssembler::arraycopy_prologue {");
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   170
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   171
  assert_different_registers(src, count, rscratch1);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   172
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   173
  __ pusha();
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   174
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   175
  if (count == c_rarg0) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   176
    if (src == c_rarg1) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   177
      // exactly backwards!!
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   178
      __ mov(rscratch1, c_rarg0);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   179
      __ mov(c_rarg0, c_rarg1);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   180
      __ mov(c_rarg1, rscratch1);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   181
    } else {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   182
      __ mov(c_rarg1, count);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   183
      __ mov(c_rarg0, src);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   184
    }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   185
  } else {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   186
    __ mov(c_rarg0, src);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   187
    __ mov(c_rarg1, count);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   188
  }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   189
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   190
  __ call_VM_leaf(ZBarrierSetRuntime::load_barrier_on_oop_array_addr(), 2);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   191
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   192
  __ popa();
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   193
  BLOCK_COMMENT("} ZBarrierSetAssembler::arraycopy_prologue");
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   194
}
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   195
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   196
void ZBarrierSetAssembler::try_resolve_jobject_in_native(MacroAssembler* masm,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   197
                                                         Register jni_env,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   198
                                                         Register robj,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   199
                                                         Register tmp,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   200
                                                         Label& slowpath) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   201
  BLOCK_COMMENT("ZBarrierSetAssembler::try_resolve_jobject_in_native {");
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   202
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   203
  assert_different_registers(jni_env, robj, tmp);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   204
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   205
  // Resolve jobject
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   206
  BarrierSetAssembler::try_resolve_jobject_in_native(masm, jni_env, robj, tmp, slowpath);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   207
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   208
  // The Address offset is too large to direct load - -784. Our range is +127, -128.
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   209
  __ mov(tmp, (long int)(in_bytes(ZThreadLocalData::address_bad_mask_offset()) -
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   210
              in_bytes(JavaThread::jni_environment_offset())));
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   211
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   212
  // Load address bad mask
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   213
  __ add(tmp, jni_env, tmp);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   214
  __ ldr(tmp, Address(tmp));
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   215
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   216
  // Check address bad mask
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   217
  __ tst(robj, tmp);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   218
  __ br(Assembler::NE, slowpath);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   219
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   220
  BLOCK_COMMENT("} ZBarrierSetAssembler::try_resolve_jobject_in_native");
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   221
}
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   222
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   223
#ifdef COMPILER1
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   224
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   225
#undef __
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   226
#define __ ce->masm()->
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   227
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   228
void ZBarrierSetAssembler::generate_c1_load_barrier_test(LIR_Assembler* ce,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   229
                                                         LIR_Opr ref) const {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   230
  assert_different_registers(rheapbase, rthread, ref->as_register());
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   231
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   232
  __ ldr(rheapbase, address_bad_mask_from_thread(rthread));
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   233
  __ tst(ref->as_register(), rheapbase);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   234
}
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   235
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   236
void ZBarrierSetAssembler::generate_c1_load_barrier_stub(LIR_Assembler* ce,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   237
                                                         ZLoadBarrierStubC1* stub) const {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   238
  // Stub entry
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   239
  __ bind(*stub->entry());
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   240
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   241
  Register ref = stub->ref()->as_register();
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   242
  Register ref_addr = noreg;
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   243
  Register tmp = noreg;
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   244
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   245
  if (stub->tmp()->is_valid()) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   246
    // Load address into tmp register
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   247
    ce->leal(stub->ref_addr(), stub->tmp());
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   248
    ref_addr = tmp = stub->tmp()->as_pointer_register();
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   249
  } else {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   250
    // Address already in register
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   251
    ref_addr = stub->ref_addr()->as_address_ptr()->base()->as_pointer_register();
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   252
  }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   253
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   254
  assert_different_registers(ref, ref_addr, noreg);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   255
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   256
  // Save r0 unless it is the result or tmp register
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   257
  // Set up SP to accomodate parameters and maybe r0..
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   258
  if (ref != r0 && tmp != r0) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   259
    __ sub(sp, sp, 32);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   260
    __ str(r0, Address(sp, 16));
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   261
  } else {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   262
    __ sub(sp, sp, 16);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   263
  }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   264
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   265
  // Setup arguments and call runtime stub
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   266
  ce->store_parameter(ref_addr, 1);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   267
  ce->store_parameter(ref, 0);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   268
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   269
  __ far_call(stub->runtime_stub());
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   270
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   271
  // Verify result
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   272
  __ verify_oop(r0, "Bad oop");
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   273
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   274
  // Move result into place
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   275
  if (ref != r0) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   276
    __ mov(ref, r0);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   277
  }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   278
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   279
  // Restore r0 unless it is the result or tmp register
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   280
  if (ref != r0 && tmp != r0) {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   281
    __ ldr(r0, Address(sp, 16));
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   282
    __ add(sp, sp, 32);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   283
  } else {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   284
    __ add(sp, sp, 16);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   285
  }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   286
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   287
  // Stub exit
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   288
  __ b(*stub->continuation());
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   289
}
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   290
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   291
#undef __
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   292
#define __ sasm->
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   293
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   294
void ZBarrierSetAssembler::generate_c1_load_barrier_runtime_stub(StubAssembler* sasm,
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   295
                                                                 DecoratorSet decorators) const {
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   296
  __ prologue("zgc_load_barrier stub", false);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   297
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   298
  // We don't use push/pop_clobbered_registers() - we need to pull out the result from r0.
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   299
  for (int i = 0; i < 32; i += 2) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   300
    __ stpd(as_FloatRegister(i), as_FloatRegister(i + 1), Address(__ pre(sp,-16)));
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   301
  }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   302
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   303
  const RegSet save_regs = RegSet::range(r1, r28);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   304
  __ push(save_regs, sp);
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   305
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   306
  // Setup arguments
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   307
  __ load_parameter(0, c_rarg0);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   308
  __ load_parameter(1, c_rarg1);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   309
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   310
  __ call_VM_leaf(ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr(decorators), 2);
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   311
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   312
  __ pop(save_regs, sp);
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   313
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   314
  for (int i = 30; i >= 0; i -= 2) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   315
    __ ldpd(as_FloatRegister(i), as_FloatRegister(i + 1), Address(__ post(sp, 16)));
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   316
  }
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   317
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   318
  __ epilogue();
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   319
}
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   320
#endif // COMPILER1
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   321
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   322
#ifdef COMPILER2
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   323
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   324
OptoReg::Name ZBarrierSetAssembler::refine_register(const Node* node, OptoReg::Name opto_reg) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   325
  if (!OptoReg::is_reg(opto_reg)) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   326
    return OptoReg::Bad;
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   327
  }
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   328
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   329
  const VMReg vm_reg = OptoReg::as_VMReg(opto_reg);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   330
  if (vm_reg->is_FloatRegister()) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   331
    return opto_reg & ~1;
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   332
  }
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   333
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   334
  return opto_reg;
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   335
}
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   336
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   337
#undef __
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   338
#define __ _masm->
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   339
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   340
class ZSaveLiveRegisters {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   341
private:
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   342
  MacroAssembler* const _masm;
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   343
  RegSet                _gp_regs;
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   344
  RegSet                _fp_regs;
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   345
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   346
public:
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   347
  void initialize(ZLoadBarrierStubC2* stub) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   348
    // Create mask of live registers
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   349
    RegMask live = stub->live();
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   350
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   351
    // Record registers that needs to be saved/restored
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   352
    while (live.is_NotEmpty()) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   353
      const OptoReg::Name opto_reg = live.find_first_elem();
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   354
      live.Remove(opto_reg);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   355
      if (OptoReg::is_reg(opto_reg)) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   356
        const VMReg vm_reg = OptoReg::as_VMReg(opto_reg);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   357
        if (vm_reg->is_Register()) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   358
          _gp_regs += RegSet::of(vm_reg->as_Register());
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   359
        } else if (vm_reg->is_FloatRegister()) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   360
          _fp_regs += RegSet::of((Register)vm_reg->as_FloatRegister());
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   361
        } else {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   362
          fatal("Unknown register type");
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   363
        }
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   364
      }
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   365
    }
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   366
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   367
    // Remove C-ABI SOE registers, scratch regs and _ref register that will be updated
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   368
    _gp_regs -= RegSet::range(r19, r30) + RegSet::of(r8, r9, stub->ref());
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   369
  }
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   370
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   371
  ZSaveLiveRegisters(MacroAssembler* masm, ZLoadBarrierStubC2* stub) :
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   372
      _masm(masm),
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   373
      _gp_regs(),
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   374
      _fp_regs() {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   375
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   376
    // Figure out what registers to save/restore
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   377
    initialize(stub);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   378
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   379
    // Save registers
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   380
    __ push(_gp_regs, sp);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   381
    __ push_fp(_fp_regs, sp);
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   382
  }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   383
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   384
  ~ZSaveLiveRegisters() {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   385
    // Restore registers
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   386
    __ pop_fp(_fp_regs, sp);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   387
    __ pop(_gp_regs, sp);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   388
  }
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   389
};
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   390
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   391
#undef __
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   392
#define __ _masm->
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   393
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   394
class ZSetupArguments {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   395
private:
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   396
  MacroAssembler* const _masm;
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   397
  const Register        _ref;
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   398
  const Address         _ref_addr;
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   399
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   400
public:
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   401
  ZSetupArguments(MacroAssembler* masm, ZLoadBarrierStubC2* stub) :
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   402
      _masm(masm),
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   403
      _ref(stub->ref()),
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   404
      _ref_addr(stub->ref_addr()) {
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   405
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   406
    // Setup arguments
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   407
    if (_ref_addr.base() == noreg) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   408
      // No self healing
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   409
      if (_ref != c_rarg0) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   410
        __ mov(c_rarg0, _ref);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   411
      }
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   412
      __ mov(c_rarg1, 0);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   413
    } else {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   414
      // Self healing
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   415
      if (_ref == c_rarg0) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   416
        // _ref is already at correct place
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   417
        __ lea(c_rarg1, _ref_addr);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   418
      } else if (_ref != c_rarg1) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   419
        // _ref is in wrong place, but not in c_rarg1, so fix it first
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   420
        __ lea(c_rarg1, _ref_addr);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   421
        __ mov(c_rarg0, _ref);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   422
      } else if (_ref_addr.base() != c_rarg0 && _ref_addr.index() != c_rarg0) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   423
        assert(_ref == c_rarg1, "Mov ref first, vacating c_rarg0");
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   424
        __ mov(c_rarg0, _ref);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   425
        __ lea(c_rarg1, _ref_addr);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   426
      } else {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   427
        assert(_ref == c_rarg1, "Need to vacate c_rarg1 and _ref_addr is using c_rarg0");
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   428
        if (_ref_addr.base() == c_rarg0 || _ref_addr.index() == c_rarg0) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   429
          __ mov(rscratch2, c_rarg1);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   430
          __ lea(c_rarg1, _ref_addr);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   431
          __ mov(c_rarg0, rscratch2);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   432
        } else {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   433
          ShouldNotReachHere();
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   434
        }
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   435
      }
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   436
    }
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   437
  }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   438
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   439
  ~ZSetupArguments() {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   440
    // Transfer result
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   441
    if (_ref != r0) {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   442
      __ mov(_ref, r0);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   443
    }
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   444
  }
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   445
};
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   446
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   447
#undef __
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   448
#define __ masm->
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   449
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   450
void ZBarrierSetAssembler::generate_c2_load_barrier_stub(MacroAssembler* masm, ZLoadBarrierStubC2* stub) const {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   451
  BLOCK_COMMENT("ZLoadBarrierStubC2");
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   452
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   453
  // Stub entry
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   454
  __ bind(*stub->entry());
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   455
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   456
  {
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   457
    ZSaveLiveRegisters save_live_registers(masm, stub);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   458
    ZSetupArguments setup_arguments(masm, stub);
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   459
    __ mov(rscratch1, stub->slow_path());
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   460
    __ blr(rscratch1);
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   461
  }
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   462
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   463
  // Stub exit
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   464
  __ b(*stub->continuation());
55379
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   465
}
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   466
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   467
#undef __
865775b86780 8214527: ZGC for Aarch64
smonteith
parents:
diff changeset
   468
58516
d376d86b0a01 8230565: ZGC: Redesign C2 load barrier to expand on the MachNode level
eosterlund
parents: 58273
diff changeset
   469
#endif // COMPILER2