src/hotspot/cpu/aarch64/gc/shared/barrierSetAssembler_aarch64.cpp
author kbarrett
Fri, 15 Jun 2018 16:53:58 -0400
changeset 50599 ecc2af326b5f
parent 50536 8434981a4137
child 50693 db0a17475826
permissions -rw-r--r--
8204939: Change Access nomenclature: root to native Summary: Rename RootAccess => NativeAccess, IN_ROOT => IN_NATIVE, and related cleanups. Reviewed-by: pliden, stefank, coleenp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49748
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
     1
/*
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
     2
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
     4
 *
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
     7
 * published by the Free Software Foundation.
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
     8
 *
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    13
 * accompanied this code).
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    14
 *
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    18
 *
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    21
 * questions.
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    22
 *
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    23
 */
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    24
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    25
#include "precompiled.hpp"
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    26
#include "gc/shared/barrierSetAssembler.hpp"
49898
4745598b307f 8200235: Generalize jniFastGetField jobject/jweak resolve
eosterlund
parents: 49748
diff changeset
    27
#include "runtime/jniHandles.hpp"
49748
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    28
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    29
#define __ masm->
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    30
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    31
void BarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    32
                                  Register dst, Address src, Register tmp1, Register tmp_thread) {
50024
7238cb613dc5 8202676: AArch64: Missing enter/leave around barrier leads to infinite loop
rkennke
parents: 49929
diff changeset
    33
7238cb613dc5 8202676: AArch64: Missing enter/leave around barrier leads to infinite loop
rkennke
parents: 49929
diff changeset
    34
  // LR is live.  It must be saved around calls.
7238cb613dc5 8202676: AArch64: Missing enter/leave around barrier leads to infinite loop
rkennke
parents: 49929
diff changeset
    35
50599
ecc2af326b5f 8204939: Change Access nomenclature: root to native
kbarrett
parents: 50536
diff changeset
    36
  bool in_heap = (decorators & IN_HEAP) != 0;
ecc2af326b5f 8204939: Change Access nomenclature: root to native
kbarrett
parents: 50536
diff changeset
    37
  bool in_native = (decorators & IN_NATIVE) != 0;
50110
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    38
  bool oop_not_null = (decorators & OOP_NOT_NULL) != 0;
49748
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    39
  switch (type) {
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    40
  case T_OBJECT:
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    41
  case T_ARRAY: {
50599
ecc2af326b5f 8204939: Change Access nomenclature: root to native
kbarrett
parents: 50536
diff changeset
    42
    if (in_heap) {
50110
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    43
      if (UseCompressedOops) {
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    44
        __ ldrw(dst, src);
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    45
        if (oop_not_null) {
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    46
          __ decode_heap_oop_not_null(dst);
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    47
        } else {
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    48
          __ decode_heap_oop(dst);
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    49
        }
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    50
      } else {
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    51
        __ ldr(dst, src);
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    52
      }
49748
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    53
    } else {
50599
ecc2af326b5f 8204939: Change Access nomenclature: root to native
kbarrett
parents: 50536
diff changeset
    54
      assert(in_native, "why else?");
49748
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    55
      __ ldr(dst, src);
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    56
    }
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    57
    break;
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    58
  }
50496
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
    59
  case T_BOOLEAN: __ load_unsigned_byte (dst, src); break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
    60
  case T_BYTE:    __ load_signed_byte   (dst, src); break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
    61
  case T_CHAR:    __ load_unsigned_short(dst, src); break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
    62
  case T_SHORT:   __ load_signed_short  (dst, src); break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
    63
  case T_INT:     __ ldrw               (dst, src); break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
    64
  case T_LONG:    __ ldr                (dst, src); break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
    65
  case T_ADDRESS: __ ldr                (dst, src); break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
    66
  case T_FLOAT:   __ ldrs               (v0, src);  break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
    67
  case T_DOUBLE:  __ ldrd               (v0, src);  break;
49748
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    68
  default: Unimplemented();
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    69
  }
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    70
}
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    71
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    72
void BarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    73
                                   Address dst, Register val, Register tmp1, Register tmp2) {
50599
ecc2af326b5f 8204939: Change Access nomenclature: root to native
kbarrett
parents: 50536
diff changeset
    74
  bool in_heap = (decorators & IN_HEAP) != 0;
ecc2af326b5f 8204939: Change Access nomenclature: root to native
kbarrett
parents: 50536
diff changeset
    75
  bool in_native = (decorators & IN_NATIVE) != 0;
49748
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    76
  switch (type) {
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    77
  case T_OBJECT:
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    78
  case T_ARRAY: {
50110
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    79
    val = val == noreg ? zr : val;
50599
ecc2af326b5f 8204939: Change Access nomenclature: root to native
kbarrett
parents: 50536
diff changeset
    80
    if (in_heap) {
50110
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    81
      if (UseCompressedOops) {
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    82
        assert(!dst.uses(val), "not enough registers");
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    83
        if (val != zr) {
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    84
          __ encode_heap_oop(val);
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    85
        }
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    86
        __ strw(val, dst);
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    87
      } else {
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    88
        __ str(val, dst);
3d98842c8677 8202714: Create a MacroAssembler::access_load/store_at wrapper for AArch64
rkennke
parents: 50024
diff changeset
    89
      }
49748
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    90
    } else {
50599
ecc2af326b5f 8204939: Change Access nomenclature: root to native
kbarrett
parents: 50536
diff changeset
    91
      assert(in_native, "why else?");
49748
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    92
      __ str(val, dst);
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    93
    }
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    94
    break;
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
    95
  }
50496
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
    96
  case T_BOOLEAN:
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
    97
    __ andw(val, val, 0x1);  // boolean is true if LSB is 1
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
    98
    __ strb(val, dst);
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
    99
    break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
   100
  case T_BYTE:    __ strb(val, dst); break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
   101
  case T_CHAR:    __ strh(val, dst); break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
   102
  case T_SHORT:   __ strh(val, dst); break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
   103
  case T_INT:     __ strw(val, dst); break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
   104
  case T_LONG:    __ str (val, dst); break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
   105
  case T_ADDRESS: __ str (val, dst); break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
   106
  case T_FLOAT:   __ strs(v0,  dst); break;
6d021f0a2bf8 8203172: Primitive heap access for interpreter BarrierSetAssembler/aarch64
rkennke
parents: 50110
diff changeset
   107
  case T_DOUBLE:  __ strd(v0,  dst); break;
49748
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
   108
  default: Unimplemented();
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
   109
  }
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents:
diff changeset
   110
}
49898
4745598b307f 8200235: Generalize jniFastGetField jobject/jweak resolve
eosterlund
parents: 49748
diff changeset
   111
50536
8434981a4137 8203157: Object equals abstraction for BarrierSetAssembler
rkennke
parents: 50496
diff changeset
   112
void BarrierSetAssembler::obj_equals(MacroAssembler* masm,
8434981a4137 8203157: Object equals abstraction for BarrierSetAssembler
rkennke
parents: 50496
diff changeset
   113
                                     Register obj1, Register obj2) {
8434981a4137 8203157: Object equals abstraction for BarrierSetAssembler
rkennke
parents: 50496
diff changeset
   114
  __ cmp(obj1, obj2);
8434981a4137 8203157: Object equals abstraction for BarrierSetAssembler
rkennke
parents: 50496
diff changeset
   115
}
8434981a4137 8203157: Object equals abstraction for BarrierSetAssembler
rkennke
parents: 50496
diff changeset
   116
49929
f38329fe8055 8202381: (Solaris) SIGBUS in # V [libjvm.so+0xcee494] jni_GetIntField+0x224
eosterlund
parents: 49898
diff changeset
   117
void BarrierSetAssembler::try_resolve_jobject_in_native(MacroAssembler* masm, Register jni_env,
f38329fe8055 8202381: (Solaris) SIGBUS in # V [libjvm.so+0xcee494] jni_GetIntField+0x224
eosterlund
parents: 49898
diff changeset
   118
                                                        Register obj, Register tmp, Label& slowpath) {
49898
4745598b307f 8200235: Generalize jniFastGetField jobject/jweak resolve
eosterlund
parents: 49748
diff changeset
   119
  // If mask changes we need to ensure that the inverse is still encodable as an immediate
4745598b307f 8200235: Generalize jniFastGetField jobject/jweak resolve
eosterlund
parents: 49748
diff changeset
   120
  STATIC_ASSERT(JNIHandles::weak_tag_mask == 1);
49929
f38329fe8055 8202381: (Solaris) SIGBUS in # V [libjvm.so+0xcee494] jni_GetIntField+0x224
eosterlund
parents: 49898
diff changeset
   121
  __ andr(obj, obj, ~JNIHandles::weak_tag_mask);
f38329fe8055 8202381: (Solaris) SIGBUS in # V [libjvm.so+0xcee494] jni_GetIntField+0x224
eosterlund
parents: 49898
diff changeset
   122
  __ ldr(obj, Address(obj, 0));             // *obj
49898
4745598b307f 8200235: Generalize jniFastGetField jobject/jweak resolve
eosterlund
parents: 49748
diff changeset
   123
}