--- old/src/cpu/aarch64/vm/interpreter_aarch64.cpp 2016-01-04 13:47:12.697866802 -0500 +++ /dev/null 2015-12-21 13:23:27.979393335 -0500 @@ -1,260 +0,0 @@ -/* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2014, Red Hat Inc. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#include "precompiled.hpp" -#include "asm/macroAssembler.hpp" -#include "interpreter/bytecodeHistogram.hpp" -#include "interpreter/interpreter.hpp" -#include "interpreter/interpreterRuntime.hpp" -#include "interpreter/interp_masm.hpp" -#include "interpreter/templateInterpreterGenerator.hpp" -#include "interpreter/templateTable.hpp" -#include "oops/arrayOop.hpp" -#include "oops/methodData.hpp" -#include "oops/method.hpp" -#include "oops/oop.inline.hpp" -#include "prims/jvmtiExport.hpp" -#include "prims/jvmtiThreadState.hpp" -#include "prims/methodHandles.hpp" -#include "runtime/arguments.hpp" -#include "runtime/frame.inline.hpp" -#include "runtime/sharedRuntime.hpp" -#include "runtime/stubRoutines.hpp" -#include "runtime/synchronizer.hpp" -#include "runtime/timer.hpp" -#include "runtime/vframeArray.hpp" -#include "utilities/debug.hpp" -#ifdef COMPILER1 -#include "c1/c1_Runtime1.hpp" -#endif - -#define __ _masm-> - - -address AbstractInterpreterGenerator::generate_slow_signature_handler() { - address entry = __ pc(); - - __ andr(esp, esp, -16); - __ mov(c_rarg3, esp); - // rmethod - // rlocals - // c_rarg3: first stack arg - wordSize - - // adjust sp - __ sub(sp, c_rarg3, 18 * wordSize); - __ str(lr, Address(__ pre(sp, -2 * wordSize))); - __ call_VM(noreg, - CAST_FROM_FN_PTR(address, - InterpreterRuntime::slow_signature_handler), - rmethod, rlocals, c_rarg3); - - // r0: result handler - - // Stack layout: - // rsp: return address <- sp - // 1 garbage - // 8 integer args (if static first is unused) - // 1 float/double identifiers - // 8 double args - // stack args <- esp - // garbage - // expression stack bottom - // bcp (NULL) - // ... - - // Restore LR - __ ldr(lr, Address(__ post(sp, 2 * wordSize))); - - // Do FP first so we can use c_rarg3 as temp - __ ldrw(c_rarg3, Address(sp, 9 * wordSize)); // float/double identifiers - - for (int i = 0; i < Argument::n_float_register_parameters_c; i++) { - const FloatRegister r = as_FloatRegister(i); - - Label d, done; - - __ tbnz(c_rarg3, i, d); - __ ldrs(r, Address(sp, (10 + i) * wordSize)); - __ b(done); - __ bind(d); - __ ldrd(r, Address(sp, (10 + i) * wordSize)); - __ bind(done); - } - - // c_rarg0 contains the result from the call of - // InterpreterRuntime::slow_signature_handler so we don't touch it - // here. It will be loaded with the JNIEnv* later. - __ ldr(c_rarg1, Address(sp, 1 * wordSize)); - for (int i = c_rarg2->encoding(); i <= c_rarg7->encoding(); i += 2) { - Register rm = as_Register(i), rn = as_Register(i+1); - __ ldp(rm, rn, Address(sp, i * wordSize)); - } - - __ add(sp, sp, 18 * wordSize); - __ ret(lr); - - return entry; -} - - -// -// Various method entries -// - -address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::MethodKind kind) { - // rmethod: Method* - // r13: sender sp - // esp: args - - if (!InlineIntrinsics) return NULL; // Generate a vanilla entry - - // These don't need a safepoint check because they aren't virtually - // callable. We won't enter these intrinsics from compiled code. - // If in the future we added an intrinsic which was virtually callable - // we'd have to worry about how to safepoint so that this code is used. - - // mathematical functions inlined by compiler - // (interpreter must provide identical implementation - // in order to avoid monotonicity bugs when switching - // from interpreter to compiler in the middle of some - // computation) - // - // stack: - // [ arg ] <-- esp - // [ arg ] - // retaddr in lr - - address entry_point = NULL; - Register continuation = lr; - switch (kind) { - case Interpreter::java_lang_math_abs: - entry_point = __ pc(); - __ ldrd(v0, Address(esp)); - __ fabsd(v0, v0); - __ mov(sp, r13); // Restore caller's SP - break; - case Interpreter::java_lang_math_sqrt: - entry_point = __ pc(); - __ ldrd(v0, Address(esp)); - __ fsqrtd(v0, v0); - __ mov(sp, r13); - break; - case Interpreter::java_lang_math_sin : - case Interpreter::java_lang_math_cos : - case Interpreter::java_lang_math_tan : - case Interpreter::java_lang_math_log : - case Interpreter::java_lang_math_log10 : - case Interpreter::java_lang_math_exp : - entry_point = __ pc(); - __ ldrd(v0, Address(esp)); - __ mov(sp, r13); - __ mov(r19, lr); - continuation = r19; // The first callee-saved register - generate_transcendental_entry(kind, 1); - break; - case Interpreter::java_lang_math_pow : - entry_point = __ pc(); - __ mov(r19, lr); - continuation = r19; - __ ldrd(v0, Address(esp, 2 * Interpreter::stackElementSize)); - __ ldrd(v1, Address(esp)); - __ mov(sp, r13); - generate_transcendental_entry(kind, 2); - break; - default: - ; - } - if (entry_point) { - __ br(continuation); - } - - return entry_point; -} - - // double trigonometrics and transcendentals - // static jdouble dsin(jdouble x); - // static jdouble dcos(jdouble x); - // static jdouble dtan(jdouble x); - // static jdouble dlog(jdouble x); - // static jdouble dlog10(jdouble x); - // static jdouble dexp(jdouble x); - // static jdouble dpow(jdouble x, jdouble y); - -void TemplateInterpreterGenerator::generate_transcendental_entry(AbstractInterpreter::MethodKind kind, int fpargs) { - address fn; - switch (kind) { - case Interpreter::java_lang_math_sin : - fn = CAST_FROM_FN_PTR(address, SharedRuntime::dsin); - break; - case Interpreter::java_lang_math_cos : - fn = CAST_FROM_FN_PTR(address, SharedRuntime::dcos); - break; - case Interpreter::java_lang_math_tan : - fn = CAST_FROM_FN_PTR(address, SharedRuntime::dtan); - break; - case Interpreter::java_lang_math_log : - fn = CAST_FROM_FN_PTR(address, SharedRuntime::dlog); - break; - case Interpreter::java_lang_math_log10 : - fn = CAST_FROM_FN_PTR(address, SharedRuntime::dlog10); - break; - case Interpreter::java_lang_math_exp : - fn = CAST_FROM_FN_PTR(address, SharedRuntime::dexp); - break; - case Interpreter::java_lang_math_pow : - fpargs = 2; - fn = CAST_FROM_FN_PTR(address, SharedRuntime::dpow); - break; - default: - ShouldNotReachHere(); - } - const int gpargs = 0, rtype = 3; - __ mov(rscratch1, fn); - __ blrt(rscratch1, gpargs, fpargs, rtype); -} - -// Abstract method entry -// Attempt to execute abstract method. Throw exception -address TemplateInterpreterGenerator::generate_abstract_entry(void) { - // rmethod: Method* - // r13: sender SP - - address entry_point = __ pc(); - - // abstract method entry - - // pop return address, reset last_sp to NULL - __ empty_expression_stack(); - __ restore_bcp(); // bcp must be correct for exception handler (was destroyed) - __ restore_locals(); // make sure locals pointer is correct as well (was destroyed) - - // throw exception - __ call_VM(noreg, CAST_FROM_FN_PTR(address, - InterpreterRuntime::throw_AbstractMethodError)); - // the call_VM checks for exception, so we should never return here. - __ should_not_reach_here(); - - return entry_point; -}