src/cpu/sparc/vm/jniFastGetField_sparc.cpp

Tue, 07 May 2019 20:38:26 +0000

author
phh
date
Tue, 07 May 2019 20:38:26 +0000
changeset 9669
32bc598624bd
parent 4323
f0c2369fda5a
child 9703
2fdf635bcf28
permissions
-rw-r--r--

8176100: [REDO][REDO] G1 Needs pre barrier on dereference of weak JNI handles
Summary: Add tag bit to all JNI weak handles
Reviewed-by: kbarrett, coleenp, tschatzl

duke@435 1 /*
phh@9669 2 * Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #include "precompiled.hpp"
twisti@4323 26 #include "asm/macroAssembler.inline.hpp"
stefank@2314 27 #include "memory/resourceArea.hpp"
stefank@2314 28 #include "prims/jniFastGetField.hpp"
stefank@2314 29 #include "prims/jvm_misc.hpp"
stefank@2314 30 #include "runtime/safepoint.hpp"
duke@435 31
duke@435 32 // TSO ensures that loads are blocking and ordered with respect to
duke@435 33 // to earlier loads, so we don't need LoadLoad membars.
duke@435 34
duke@435 35 #define __ masm->
duke@435 36
duke@435 37 #define BUFFER_SIZE 30*sizeof(jint)
duke@435 38
duke@435 39 // Common register usage:
duke@435 40 // O0: env
duke@435 41 // O1: obj
duke@435 42 // O2: jfieldID
duke@435 43 // O4: offset (O2 >> 2)
duke@435 44 // G4: old safepoint counter
duke@435 45
duke@435 46 address JNI_FastGetField::generate_fast_get_int_field0(BasicType type) {
duke@435 47 const char *name;
duke@435 48 switch (type) {
duke@435 49 case T_BOOLEAN: name = "jni_fast_GetBooleanField"; break;
duke@435 50 case T_BYTE: name = "jni_fast_GetByteField"; break;
duke@435 51 case T_CHAR: name = "jni_fast_GetCharField"; break;
duke@435 52 case T_SHORT: name = "jni_fast_GetShortField"; break;
duke@435 53 case T_INT: name = "jni_fast_GetIntField"; break;
duke@435 54 default: ShouldNotReachHere();
duke@435 55 }
duke@435 56 ResourceMark rm;
twisti@2103 57 BufferBlob* blob = BufferBlob::create(name, BUFFER_SIZE*wordSize);
twisti@2103 58 CodeBuffer cbuf(blob);
duke@435 59 MacroAssembler* masm = new MacroAssembler(&cbuf);
twisti@2103 60 address fast_entry = __ pc();
duke@435 61
duke@435 62 Label label1, label2;
duke@435 63
twisti@1162 64 AddressLiteral cnt_addrlit(SafepointSynchronize::safepoint_counter_addr());
twisti@1162 65 __ sethi (cnt_addrlit, O3);
twisti@1162 66 Address cnt_addr(O3, cnt_addrlit.low10());
twisti@1162 67 __ ld (cnt_addr, G4);
duke@435 68 __ andcc (G4, 1, G0);
duke@435 69 __ br (Assembler::notZero, false, Assembler::pn, label1);
duke@435 70 __ delayed()->srl (O2, 2, O4);
phh@9669 71 __ andn (O1, JNIHandles::weak_tag_mask, O1);
duke@435 72 __ ld_ptr (O1, 0, O5);
duke@435 73
duke@435 74 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
duke@435 75 speculative_load_pclist[count] = __ pc();
duke@435 76 switch (type) {
duke@435 77 case T_BOOLEAN: __ ldub (O5, O4, G3); break;
duke@435 78 case T_BYTE: __ ldsb (O5, O4, G3); break;
duke@435 79 case T_CHAR: __ lduh (O5, O4, G3); break;
duke@435 80 case T_SHORT: __ ldsh (O5, O4, G3); break;
duke@435 81 case T_INT: __ ld (O5, O4, G3); break;
duke@435 82 default: ShouldNotReachHere();
duke@435 83 }
duke@435 84
twisti@1162 85 __ ld (cnt_addr, O5);
duke@435 86 __ cmp (O5, G4);
duke@435 87 __ br (Assembler::notEqual, false, Assembler::pn, label2);
duke@435 88 __ delayed()->mov (O7, G1);
duke@435 89 __ retl ();
duke@435 90 __ delayed()->mov (G3, O0);
duke@435 91
duke@435 92 slowcase_entry_pclist[count++] = __ pc();
duke@435 93 __ bind (label1);
duke@435 94 __ mov (O7, G1);
duke@435 95
duke@435 96 address slow_case_addr;
duke@435 97 switch (type) {
duke@435 98 case T_BOOLEAN: slow_case_addr = jni_GetBooleanField_addr(); break;
duke@435 99 case T_BYTE: slow_case_addr = jni_GetByteField_addr(); break;
duke@435 100 case T_CHAR: slow_case_addr = jni_GetCharField_addr(); break;
duke@435 101 case T_SHORT: slow_case_addr = jni_GetShortField_addr(); break;
duke@435 102 case T_INT: slow_case_addr = jni_GetIntField_addr(); break;
duke@435 103 default: ShouldNotReachHere();
duke@435 104 }
duke@435 105 __ bind (label2);
duke@435 106 __ call (slow_case_addr, relocInfo::none);
duke@435 107 __ delayed()->mov (G1, O7);
duke@435 108
duke@435 109 __ flush ();
duke@435 110
duke@435 111 return fast_entry;
duke@435 112 }
duke@435 113
duke@435 114 address JNI_FastGetField::generate_fast_get_boolean_field() {
duke@435 115 return generate_fast_get_int_field0(T_BOOLEAN);
duke@435 116 }
duke@435 117
duke@435 118 address JNI_FastGetField::generate_fast_get_byte_field() {
duke@435 119 return generate_fast_get_int_field0(T_BYTE);
duke@435 120 }
duke@435 121
duke@435 122 address JNI_FastGetField::generate_fast_get_char_field() {
duke@435 123 return generate_fast_get_int_field0(T_CHAR);
duke@435 124 }
duke@435 125
duke@435 126 address JNI_FastGetField::generate_fast_get_short_field() {
duke@435 127 return generate_fast_get_int_field0(T_SHORT);
duke@435 128 }
duke@435 129
duke@435 130 address JNI_FastGetField::generate_fast_get_int_field() {
duke@435 131 return generate_fast_get_int_field0(T_INT);
duke@435 132 }
duke@435 133
duke@435 134 address JNI_FastGetField::generate_fast_get_long_field() {
duke@435 135 const char *name = "jni_fast_GetLongField";
duke@435 136 ResourceMark rm;
twisti@2103 137 BufferBlob* blob = BufferBlob::create(name, BUFFER_SIZE*wordSize);
twisti@2103 138 CodeBuffer cbuf(blob);
duke@435 139 MacroAssembler* masm = new MacroAssembler(&cbuf);
twisti@2103 140 address fast_entry = __ pc();
duke@435 141
duke@435 142 Label label1, label2;
duke@435 143
twisti@1162 144 AddressLiteral cnt_addrlit(SafepointSynchronize::safepoint_counter_addr());
twisti@1162 145 __ sethi (cnt_addrlit, G3);
twisti@1162 146 Address cnt_addr(G3, cnt_addrlit.low10());
twisti@1162 147 __ ld (cnt_addr, G4);
duke@435 148 __ andcc (G4, 1, G0);
duke@435 149 __ br (Assembler::notZero, false, Assembler::pn, label1);
duke@435 150 __ delayed()->srl (O2, 2, O4);
phh@9669 151 __ andn (O1, JNIHandles::weak_tag_mask, O1);
duke@435 152 __ ld_ptr (O1, 0, O5);
duke@435 153 __ add (O5, O4, O5);
duke@435 154
duke@435 155 #ifndef _LP64
duke@435 156 assert(count < LIST_CAPACITY-1, "LIST_CAPACITY too small");
duke@435 157 speculative_load_pclist[count++] = __ pc();
duke@435 158 __ ld (O5, 0, G2);
duke@435 159
duke@435 160 speculative_load_pclist[count] = __ pc();
duke@435 161 __ ld (O5, 4, O3);
duke@435 162 #else
duke@435 163 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
duke@435 164 speculative_load_pclist[count] = __ pc();
duke@435 165 __ ldx (O5, 0, O3);
duke@435 166 #endif
duke@435 167
twisti@1162 168 __ ld (cnt_addr, G1);
duke@435 169 __ cmp (G1, G4);
duke@435 170 __ br (Assembler::notEqual, false, Assembler::pn, label2);
duke@435 171 __ delayed()->mov (O7, G1);
duke@435 172
duke@435 173 #ifndef _LP64
duke@435 174 __ mov (G2, O0);
duke@435 175 __ retl ();
duke@435 176 __ delayed()->mov (O3, O1);
duke@435 177 #else
duke@435 178 __ retl ();
duke@435 179 __ delayed()->mov (O3, O0);
duke@435 180 #endif
duke@435 181
duke@435 182 #ifndef _LP64
duke@435 183 slowcase_entry_pclist[count-1] = __ pc();
duke@435 184 slowcase_entry_pclist[count++] = __ pc() ;
duke@435 185 #else
duke@435 186 slowcase_entry_pclist[count++] = __ pc();
duke@435 187 #endif
duke@435 188
duke@435 189 __ bind (label1);
duke@435 190 __ mov (O7, G1);
duke@435 191
duke@435 192 address slow_case_addr = jni_GetLongField_addr();
duke@435 193 __ bind (label2);
duke@435 194 __ call (slow_case_addr, relocInfo::none);
duke@435 195 __ delayed()->mov (G1, O7);
duke@435 196
duke@435 197 __ flush ();
duke@435 198
duke@435 199 return fast_entry;
duke@435 200 }
duke@435 201
duke@435 202 address JNI_FastGetField::generate_fast_get_float_field0(BasicType type) {
duke@435 203 const char *name;
duke@435 204 switch (type) {
duke@435 205 case T_FLOAT: name = "jni_fast_GetFloatField"; break;
duke@435 206 case T_DOUBLE: name = "jni_fast_GetDoubleField"; break;
duke@435 207 default: ShouldNotReachHere();
duke@435 208 }
duke@435 209 ResourceMark rm;
twisti@2103 210 BufferBlob* blob = BufferBlob::create(name, BUFFER_SIZE*wordSize);
twisti@2103 211 CodeBuffer cbuf(blob);
duke@435 212 MacroAssembler* masm = new MacroAssembler(&cbuf);
twisti@2103 213 address fast_entry = __ pc();
duke@435 214
duke@435 215 Label label1, label2;
duke@435 216
twisti@1162 217 AddressLiteral cnt_addrlit(SafepointSynchronize::safepoint_counter_addr());
twisti@1162 218 __ sethi (cnt_addrlit, O3);
twisti@1162 219 Address cnt_addr(O3, cnt_addrlit.low10());
twisti@1162 220 __ ld (cnt_addr, G4);
duke@435 221 __ andcc (G4, 1, G0);
duke@435 222 __ br (Assembler::notZero, false, Assembler::pn, label1);
duke@435 223 __ delayed()->srl (O2, 2, O4);
phh@9669 224 __ andn (O1, JNIHandles::weak_tag_mask, O1);
duke@435 225 __ ld_ptr (O1, 0, O5);
duke@435 226
duke@435 227 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
duke@435 228 speculative_load_pclist[count] = __ pc();
duke@435 229 switch (type) {
duke@435 230 case T_FLOAT: __ ldf (FloatRegisterImpl::S, O5, O4, F0); break;
duke@435 231 case T_DOUBLE: __ ldf (FloatRegisterImpl::D, O5, O4, F0); break;
duke@435 232 default: ShouldNotReachHere();
duke@435 233 }
duke@435 234
twisti@1162 235 __ ld (cnt_addr, O5);
duke@435 236 __ cmp (O5, G4);
duke@435 237 __ br (Assembler::notEqual, false, Assembler::pn, label2);
duke@435 238 __ delayed()->mov (O7, G1);
duke@435 239
duke@435 240 __ retl ();
duke@435 241 __ delayed()-> nop ();
duke@435 242
duke@435 243 slowcase_entry_pclist[count++] = __ pc();
duke@435 244 __ bind (label1);
duke@435 245 __ mov (O7, G1);
duke@435 246
duke@435 247 address slow_case_addr;
duke@435 248 switch (type) {
duke@435 249 case T_FLOAT: slow_case_addr = jni_GetFloatField_addr(); break;
duke@435 250 case T_DOUBLE: slow_case_addr = jni_GetDoubleField_addr(); break;
duke@435 251 default: ShouldNotReachHere();
duke@435 252 }
duke@435 253 __ bind (label2);
duke@435 254 __ call (slow_case_addr, relocInfo::none);
duke@435 255 __ delayed()->mov (G1, O7);
duke@435 256
duke@435 257 __ flush ();
duke@435 258
duke@435 259 return fast_entry;
duke@435 260 }
duke@435 261
duke@435 262 address JNI_FastGetField::generate_fast_get_float_field() {
duke@435 263 return generate_fast_get_float_field0(T_FLOAT);
duke@435 264 }
duke@435 265
duke@435 266 address JNI_FastGetField::generate_fast_get_double_field() {
duke@435 267 return generate_fast_get_float_field0(T_DOUBLE);
duke@435 268 }

mercurial