src/cpu/x86/vm/interpreter_x86_64.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) 2003, 2014, 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.hpp"
aoqi@0 27 #include "interpreter/bytecodeHistogram.hpp"
aoqi@0 28 #include "interpreter/interpreter.hpp"
aoqi@0 29 #include "interpreter/interpreterGenerator.hpp"
aoqi@0 30 #include "interpreter/interpreterRuntime.hpp"
aoqi@0 31 #include "interpreter/templateTable.hpp"
aoqi@0 32 #include "oops/arrayOop.hpp"
aoqi@0 33 #include "oops/methodData.hpp"
aoqi@0 34 #include "oops/method.hpp"
aoqi@0 35 #include "oops/oop.inline.hpp"
aoqi@0 36 #include "prims/jvmtiExport.hpp"
aoqi@0 37 #include "prims/jvmtiThreadState.hpp"
aoqi@0 38 #include "prims/methodHandles.hpp"
aoqi@0 39 #include "runtime/arguments.hpp"
aoqi@0 40 #include "runtime/deoptimization.hpp"
aoqi@0 41 #include "runtime/frame.inline.hpp"
aoqi@0 42 #include "runtime/sharedRuntime.hpp"
aoqi@0 43 #include "runtime/stubRoutines.hpp"
aoqi@0 44 #include "runtime/synchronizer.hpp"
aoqi@0 45 #include "runtime/timer.hpp"
aoqi@0 46 #include "runtime/vframeArray.hpp"
aoqi@0 47 #include "utilities/debug.hpp"
aoqi@0 48 #ifdef COMPILER1
aoqi@0 49 #include "c1/c1_Runtime1.hpp"
aoqi@0 50 #endif
aoqi@0 51
aoqi@0 52 #define __ _masm->
aoqi@0 53
aoqi@0 54 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
aoqi@0 55
aoqi@0 56 #ifdef _WIN64
aoqi@0 57 address AbstractInterpreterGenerator::generate_slow_signature_handler() {
aoqi@0 58 address entry = __ pc();
aoqi@0 59
aoqi@0 60 // rbx: method
aoqi@0 61 // r14: pointer to locals
aoqi@0 62 // c_rarg3: first stack arg - wordSize
aoqi@0 63 __ mov(c_rarg3, rsp);
aoqi@0 64 // adjust rsp
aoqi@0 65 __ subptr(rsp, 4 * wordSize);
aoqi@0 66 __ call_VM(noreg,
aoqi@0 67 CAST_FROM_FN_PTR(address,
aoqi@0 68 InterpreterRuntime::slow_signature_handler),
aoqi@0 69 rbx, r14, c_rarg3);
aoqi@0 70
aoqi@0 71 // rax: result handler
aoqi@0 72
aoqi@0 73 // Stack layout:
aoqi@0 74 // rsp: 3 integer or float args (if static first is unused)
aoqi@0 75 // 1 float/double identifiers
aoqi@0 76 // return address
aoqi@0 77 // stack args
aoqi@0 78 // garbage
aoqi@0 79 // expression stack bottom
aoqi@0 80 // bcp (NULL)
aoqi@0 81 // ...
aoqi@0 82
aoqi@0 83 // Do FP first so we can use c_rarg3 as temp
aoqi@0 84 __ movl(c_rarg3, Address(rsp, 3 * wordSize)); // float/double identifiers
aoqi@0 85
aoqi@0 86 for ( int i= 0; i < Argument::n_int_register_parameters_c-1; i++ ) {
aoqi@0 87 XMMRegister floatreg = as_XMMRegister(i+1);
aoqi@0 88 Label isfloatordouble, isdouble, next;
aoqi@0 89
aoqi@0 90 __ testl(c_rarg3, 1 << (i*2)); // Float or Double?
aoqi@0 91 __ jcc(Assembler::notZero, isfloatordouble);
aoqi@0 92
aoqi@0 93 // Do Int register here
aoqi@0 94 switch ( i ) {
aoqi@0 95 case 0:
aoqi@0 96 __ movl(rscratch1, Address(rbx, Method::access_flags_offset()));
aoqi@0 97 __ testl(rscratch1, JVM_ACC_STATIC);
aoqi@0 98 __ cmovptr(Assembler::zero, c_rarg1, Address(rsp, 0));
aoqi@0 99 break;
aoqi@0 100 case 1:
aoqi@0 101 __ movptr(c_rarg2, Address(rsp, wordSize));
aoqi@0 102 break;
aoqi@0 103 case 2:
aoqi@0 104 __ movptr(c_rarg3, Address(rsp, 2 * wordSize));
aoqi@0 105 break;
aoqi@0 106 default:
aoqi@0 107 break;
aoqi@0 108 }
aoqi@0 109
aoqi@0 110 __ jmp (next);
aoqi@0 111
aoqi@0 112 __ bind(isfloatordouble);
aoqi@0 113 __ testl(c_rarg3, 1 << ((i*2)+1)); // Double?
aoqi@0 114 __ jcc(Assembler::notZero, isdouble);
aoqi@0 115
aoqi@0 116 // Do Float Here
aoqi@0 117 __ movflt(floatreg, Address(rsp, i * wordSize));
aoqi@0 118 __ jmp(next);
aoqi@0 119
aoqi@0 120 // Do Double here
aoqi@0 121 __ bind(isdouble);
aoqi@0 122 __ movdbl(floatreg, Address(rsp, i * wordSize));
aoqi@0 123
aoqi@0 124 __ bind(next);
aoqi@0 125 }
aoqi@0 126
aoqi@0 127
aoqi@0 128 // restore rsp
aoqi@0 129 __ addptr(rsp, 4 * wordSize);
aoqi@0 130
aoqi@0 131 __ ret(0);
aoqi@0 132
aoqi@0 133 return entry;
aoqi@0 134 }
aoqi@0 135 #else
aoqi@0 136 address AbstractInterpreterGenerator::generate_slow_signature_handler() {
aoqi@0 137 address entry = __ pc();
aoqi@0 138
aoqi@0 139 // rbx: method
aoqi@0 140 // r14: pointer to locals
aoqi@0 141 // c_rarg3: first stack arg - wordSize
aoqi@0 142 __ mov(c_rarg3, rsp);
aoqi@0 143 // adjust rsp
aoqi@0 144 __ subptr(rsp, 14 * wordSize);
aoqi@0 145 __ call_VM(noreg,
aoqi@0 146 CAST_FROM_FN_PTR(address,
aoqi@0 147 InterpreterRuntime::slow_signature_handler),
aoqi@0 148 rbx, r14, c_rarg3);
aoqi@0 149
aoqi@0 150 // rax: result handler
aoqi@0 151
aoqi@0 152 // Stack layout:
aoqi@0 153 // rsp: 5 integer args (if static first is unused)
aoqi@0 154 // 1 float/double identifiers
aoqi@0 155 // 8 double args
aoqi@0 156 // return address
aoqi@0 157 // stack args
aoqi@0 158 // garbage
aoqi@0 159 // expression stack bottom
aoqi@0 160 // bcp (NULL)
aoqi@0 161 // ...
aoqi@0 162
aoqi@0 163 // Do FP first so we can use c_rarg3 as temp
aoqi@0 164 __ movl(c_rarg3, Address(rsp, 5 * wordSize)); // float/double identifiers
aoqi@0 165
aoqi@0 166 for (int i = 0; i < Argument::n_float_register_parameters_c; i++) {
aoqi@0 167 const XMMRegister r = as_XMMRegister(i);
aoqi@0 168
aoqi@0 169 Label d, done;
aoqi@0 170
aoqi@0 171 __ testl(c_rarg3, 1 << i);
aoqi@0 172 __ jcc(Assembler::notZero, d);
aoqi@0 173 __ movflt(r, Address(rsp, (6 + i) * wordSize));
aoqi@0 174 __ jmp(done);
aoqi@0 175 __ bind(d);
aoqi@0 176 __ movdbl(r, Address(rsp, (6 + i) * wordSize));
aoqi@0 177 __ bind(done);
aoqi@0 178 }
aoqi@0 179
aoqi@0 180 // Now handle integrals. Only do c_rarg1 if not static.
aoqi@0 181 __ movl(c_rarg3, Address(rbx, Method::access_flags_offset()));
aoqi@0 182 __ testl(c_rarg3, JVM_ACC_STATIC);
aoqi@0 183 __ cmovptr(Assembler::zero, c_rarg1, Address(rsp, 0));
aoqi@0 184
aoqi@0 185 __ movptr(c_rarg2, Address(rsp, wordSize));
aoqi@0 186 __ movptr(c_rarg3, Address(rsp, 2 * wordSize));
aoqi@0 187 __ movptr(c_rarg4, Address(rsp, 3 * wordSize));
aoqi@0 188 __ movptr(c_rarg5, Address(rsp, 4 * wordSize));
aoqi@0 189
aoqi@0 190 // restore rsp
aoqi@0 191 __ addptr(rsp, 14 * wordSize);
aoqi@0 192
aoqi@0 193 __ ret(0);
aoqi@0 194
aoqi@0 195 return entry;
aoqi@0 196 }
aoqi@0 197 #endif
aoqi@0 198
aoqi@0 199
aoqi@0 200 //
aoqi@0 201 // Various method entries
aoqi@0 202 //
aoqi@0 203
aoqi@0 204 address InterpreterGenerator::generate_math_entry(AbstractInterpreter::MethodKind kind) {
aoqi@0 205
aoqi@0 206 // rbx,: Method*
aoqi@0 207 // rcx: scratrch
aoqi@0 208 // r13: sender sp
aoqi@0 209
aoqi@0 210 if (!InlineIntrinsics) return NULL; // Generate a vanilla entry
aoqi@0 211
aoqi@0 212 address entry_point = __ pc();
aoqi@0 213
aoqi@0 214 // These don't need a safepoint check because they aren't virtually
aoqi@0 215 // callable. We won't enter these intrinsics from compiled code.
aoqi@0 216 // If in the future we added an intrinsic which was virtually callable
aoqi@0 217 // we'd have to worry about how to safepoint so that this code is used.
aoqi@0 218
aoqi@0 219 // mathematical functions inlined by compiler
aoqi@0 220 // (interpreter must provide identical implementation
aoqi@0 221 // in order to avoid monotonicity bugs when switching
aoqi@0 222 // from interpreter to compiler in the middle of some
aoqi@0 223 // computation)
aoqi@0 224 //
aoqi@0 225 // stack: [ ret adr ] <-- rsp
aoqi@0 226 // [ lo(arg) ]
aoqi@0 227 // [ hi(arg) ]
aoqi@0 228 //
aoqi@0 229
aoqi@0 230 // Note: For JDK 1.2 StrictMath doesn't exist and Math.sin/cos/sqrt are
aoqi@0 231 // native methods. Interpreter::method_kind(...) does a check for
aoqi@0 232 // native methods first before checking for intrinsic methods and
aoqi@0 233 // thus will never select this entry point. Make sure it is not
aoqi@0 234 // called accidentally since the SharedRuntime entry points will
aoqi@0 235 // not work for JDK 1.2.
aoqi@0 236 //
aoqi@0 237 // We no longer need to check for JDK 1.2 since it's EOL'ed.
aoqi@0 238 // The following check existed in pre 1.6 implementation,
aoqi@0 239 // if (Universe::is_jdk12x_version()) {
aoqi@0 240 // __ should_not_reach_here();
aoqi@0 241 // }
aoqi@0 242 // Universe::is_jdk12x_version() always returns false since
aoqi@0 243 // the JDK version is not yet determined when this method is called.
aoqi@0 244 // This method is called during interpreter_init() whereas
aoqi@0 245 // JDK version is only determined when universe2_init() is called.
aoqi@0 246
aoqi@0 247 // Note: For JDK 1.3 StrictMath exists and Math.sin/cos/sqrt are
aoqi@0 248 // java methods. Interpreter::method_kind(...) will select
aoqi@0 249 // this entry point for the corresponding methods in JDK 1.3.
aoqi@0 250 // get argument
aoqi@0 251
aoqi@0 252 if (kind == Interpreter::java_lang_math_sqrt) {
aoqi@0 253 __ sqrtsd(xmm0, Address(rsp, wordSize));
aoqi@0 254 } else {
aoqi@0 255 __ fld_d(Address(rsp, wordSize));
aoqi@0 256 switch (kind) {
aoqi@0 257 case Interpreter::java_lang_math_sin :
aoqi@0 258 __ trigfunc('s');
aoqi@0 259 break;
aoqi@0 260 case Interpreter::java_lang_math_cos :
aoqi@0 261 __ trigfunc('c');
aoqi@0 262 break;
aoqi@0 263 case Interpreter::java_lang_math_tan :
aoqi@0 264 __ trigfunc('t');
aoqi@0 265 break;
aoqi@0 266 case Interpreter::java_lang_math_abs:
aoqi@0 267 __ fabs();
aoqi@0 268 break;
aoqi@0 269 case Interpreter::java_lang_math_log:
aoqi@0 270 __ flog();
aoqi@0 271 break;
aoqi@0 272 case Interpreter::java_lang_math_log10:
aoqi@0 273 __ flog10();
aoqi@0 274 break;
aoqi@0 275 case Interpreter::java_lang_math_pow:
aoqi@0 276 __ fld_d(Address(rsp, 3*wordSize)); // second argument (one
aoqi@0 277 // empty stack slot)
aoqi@0 278 __ pow_with_fallback(0);
aoqi@0 279 break;
aoqi@0 280 case Interpreter::java_lang_math_exp:
aoqi@0 281 __ exp_with_fallback(0);
aoqi@0 282 break;
aoqi@0 283 default :
aoqi@0 284 ShouldNotReachHere();
aoqi@0 285 }
aoqi@0 286
aoqi@0 287 // return double result in xmm0 for interpreter and compilers.
aoqi@0 288 __ subptr(rsp, 2*wordSize);
aoqi@0 289 // Round to 64bit precision
aoqi@0 290 __ fstp_d(Address(rsp, 0));
aoqi@0 291 __ movdbl(xmm0, Address(rsp, 0));
aoqi@0 292 __ addptr(rsp, 2*wordSize);
aoqi@0 293 }
aoqi@0 294
aoqi@0 295
aoqi@0 296 __ pop(rax);
aoqi@0 297 __ mov(rsp, r13);
aoqi@0 298 __ jmp(rax);
aoqi@0 299
aoqi@0 300 return entry_point;
aoqi@0 301 }
aoqi@0 302
aoqi@0 303
aoqi@0 304 // Abstract method entry
aoqi@0 305 // Attempt to execute abstract method. Throw exception
aoqi@0 306 address InterpreterGenerator::generate_abstract_entry(void) {
aoqi@0 307 // rbx: Method*
aoqi@0 308 // r13: sender SP
aoqi@0 309
aoqi@0 310 address entry_point = __ pc();
aoqi@0 311
aoqi@0 312 // abstract method entry
aoqi@0 313
aoqi@0 314 // pop return address, reset last_sp to NULL
aoqi@0 315 __ empty_expression_stack();
aoqi@0 316 __ restore_bcp(); // rsi must be correct for exception handler (was destroyed)
aoqi@0 317 __ restore_locals(); // make sure locals pointer is correct as well (was destroyed)
aoqi@0 318
aoqi@0 319 // throw exception
aoqi@0 320 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
aoqi@0 321 InterpreterRuntime::throw_AbstractMethodError));
aoqi@0 322 // the call_VM checks for exception, so we should never return here.
aoqi@0 323 __ should_not_reach_here();
aoqi@0 324
aoqi@0 325 return entry_point;
aoqi@0 326 }
aoqi@0 327
aoqi@0 328
aoqi@0 329 // Empty method, generate a very fast return.
aoqi@0 330
aoqi@0 331 address InterpreterGenerator::generate_empty_entry(void) {
aoqi@0 332 // rbx: Method*
aoqi@0 333 // r13: sender sp must set sp to this value on return
aoqi@0 334
aoqi@0 335 if (!UseFastEmptyMethods) {
aoqi@0 336 return NULL;
aoqi@0 337 }
aoqi@0 338
aoqi@0 339 address entry_point = __ pc();
aoqi@0 340
aoqi@0 341 // If we need a safepoint check, generate full interpreter entry.
aoqi@0 342 Label slow_path;
aoqi@0 343 __ cmp32(ExternalAddress(SafepointSynchronize::address_of_state()),
aoqi@0 344 SafepointSynchronize::_not_synchronized);
aoqi@0 345 __ jcc(Assembler::notEqual, slow_path);
aoqi@0 346
aoqi@0 347 // do nothing for empty methods (do not even increment invocation counter)
aoqi@0 348 // Code: _return
aoqi@0 349 // _return
aoqi@0 350 // return w/o popping parameters
aoqi@0 351 __ pop(rax);
aoqi@0 352 __ mov(rsp, r13);
aoqi@0 353 __ jmp(rax);
aoqi@0 354
aoqi@0 355 __ bind(slow_path);
aoqi@0 356 (void) generate_normal_entry(false);
aoqi@0 357 return entry_point;
aoqi@0 358
aoqi@0 359 }
aoqi@0 360
aoqi@0 361 void Deoptimization::unwind_callee_save_values(frame* f, vframeArray* vframe_array) {
aoqi@0 362
aoqi@0 363 // This code is sort of the equivalent of C2IAdapter::setup_stack_frame back in
aoqi@0 364 // the days we had adapter frames. When we deoptimize a situation where a
aoqi@0 365 // compiled caller calls a compiled caller will have registers it expects
aoqi@0 366 // to survive the call to the callee. If we deoptimize the callee the only
aoqi@0 367 // way we can restore these registers is to have the oldest interpreter
aoqi@0 368 // frame that we create restore these values. That is what this routine
aoqi@0 369 // will accomplish.
aoqi@0 370
aoqi@0 371 // At the moment we have modified c2 to not have any callee save registers
aoqi@0 372 // so this problem does not exist and this routine is just a place holder.
aoqi@0 373
aoqi@0 374 assert(f->is_interpreted_frame(), "must be interpreted");
aoqi@0 375 }

mercurial