src/cpu/sparc/vm/jniFastGetField_sparc.cpp

Wed, 27 Apr 2016 01:25:04 +0800

author
aoqi
date
Wed, 27 Apr 2016 01:25:04 +0800
changeset 0
f90c822e73f8
child 6876
710a3c8b516e
permissions
-rw-r--r--

Initial load
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/
changeset: 6782:28b50d07f6f8
tag: jdk8u25-b17

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

mercurial