src/share/vm/interpreter/cppInterpreter.cpp

Wed, 03 Jul 2019 20:42:37 +0800

author
aoqi
date
Wed, 03 Jul 2019 20:42:37 +0800
changeset 9637
eef07cd490d4
parent 6876
710a3c8b516e
permissions
-rw-r--r--

Merge

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 1997, 2011, 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 "interpreter/bytecodeInterpreter.hpp"
aoqi@0 27 #include "interpreter/interpreter.hpp"
aoqi@0 28 #include "interpreter/interpreterGenerator.hpp"
aoqi@0 29 #include "interpreter/interpreterRuntime.hpp"
aoqi@0 30
aoqi@0 31 #ifdef CC_INTERP
aoqi@0 32 # define __ _masm->
aoqi@0 33
aoqi@0 34 void CppInterpreter::initialize() {
aoqi@0 35 if (_code != NULL) return;
aoqi@0 36 AbstractInterpreter::initialize();
aoqi@0 37
aoqi@0 38 // generate interpreter
aoqi@0 39 { ResourceMark rm;
aoqi@0 40 TraceTime timer("Interpreter generation", TraceStartupTime);
aoqi@0 41 int code_size = InterpreterCodeSize;
aoqi@0 42 NOT_PRODUCT(code_size *= 4;) // debug uses extra interpreter code space
aoqi@0 43 _code = new StubQueue(new InterpreterCodeletInterface, code_size, NULL,
aoqi@0 44 "Interpreter");
aoqi@0 45 InterpreterGenerator g(_code);
aoqi@0 46 if (PrintInterpreter) print();
aoqi@0 47 }
aoqi@0 48
aoqi@0 49
aoqi@0 50 // Allow c++ interpreter to do one initialization now that switches are set, etc.
aoqi@0 51 BytecodeInterpreter start_msg(BytecodeInterpreter::initialize);
aoqi@0 52 if (JvmtiExport::can_post_interpreter_events())
aoqi@0 53 BytecodeInterpreter::runWithChecks(&start_msg);
aoqi@0 54 else
aoqi@0 55 BytecodeInterpreter::run(&start_msg);
aoqi@0 56 }
aoqi@0 57
aoqi@0 58
aoqi@0 59 address CppInterpreter::_tosca_to_stack [AbstractInterpreter::number_of_result_handlers];
aoqi@0 60 address CppInterpreter::_stack_to_stack [AbstractInterpreter::number_of_result_handlers];
aoqi@0 61 address CppInterpreter::_stack_to_native_abi [AbstractInterpreter::number_of_result_handlers];
aoqi@0 62
aoqi@0 63 CppInterpreterGenerator::CppInterpreterGenerator(StubQueue* _code): AbstractInterpreterGenerator(_code) {
aoqi@0 64 }
aoqi@0 65
aoqi@0 66 static const BasicType types[Interpreter::number_of_result_handlers] = {
aoqi@0 67 T_BOOLEAN,
aoqi@0 68 T_CHAR ,
aoqi@0 69 T_BYTE ,
aoqi@0 70 T_SHORT ,
aoqi@0 71 T_INT ,
aoqi@0 72 T_LONG ,
aoqi@0 73 T_VOID ,
aoqi@0 74 T_FLOAT ,
aoqi@0 75 T_DOUBLE ,
aoqi@0 76 T_OBJECT
aoqi@0 77 };
aoqi@0 78
aoqi@0 79 void CppInterpreterGenerator::generate_all() {
aoqi@0 80 AbstractInterpreterGenerator::generate_all();
aoqi@0 81
aoqi@0 82 { CodeletMark cm(_masm, "result handlers for native calls");
aoqi@0 83 // The various result converter stublets.
aoqi@0 84 int is_generated[Interpreter::number_of_result_handlers];
aoqi@0 85 memset(is_generated, 0, sizeof(is_generated));
aoqi@0 86 int _tosca_to_stack_is_generated[Interpreter::number_of_result_handlers];
aoqi@0 87 int _stack_to_stack_is_generated[Interpreter::number_of_result_handlers];
aoqi@0 88 int _stack_to_native_abi_is_generated[Interpreter::number_of_result_handlers];
aoqi@0 89
aoqi@0 90 memset(_tosca_to_stack_is_generated, 0, sizeof(_tosca_to_stack_is_generated));
aoqi@0 91 memset(_stack_to_stack_is_generated, 0, sizeof(_stack_to_stack_is_generated));
aoqi@0 92 memset(_stack_to_native_abi_is_generated, 0, sizeof(_stack_to_native_abi_is_generated));
aoqi@0 93 for (int i = 0; i < Interpreter::number_of_result_handlers; i++) {
aoqi@0 94 BasicType type = types[i];
aoqi@0 95 if (!is_generated[Interpreter::BasicType_as_index(type)]++) {
aoqi@0 96 Interpreter::_native_abi_to_tosca[Interpreter::BasicType_as_index(type)] = generate_result_handler_for(type);
aoqi@0 97 }
aoqi@0 98 if (!_tosca_to_stack_is_generated[Interpreter::BasicType_as_index(type)]++) {
aoqi@0 99 Interpreter::_tosca_to_stack[Interpreter::BasicType_as_index(type)] = generate_tosca_to_stack_converter(type);
aoqi@0 100 }
aoqi@0 101 if (!_stack_to_stack_is_generated[Interpreter::BasicType_as_index(type)]++) {
aoqi@0 102 Interpreter::_stack_to_stack[Interpreter::BasicType_as_index(type)] = generate_stack_to_stack_converter(type);
aoqi@0 103 }
aoqi@0 104 if (!_stack_to_native_abi_is_generated[Interpreter::BasicType_as_index(type)]++) {
aoqi@0 105 Interpreter::_stack_to_native_abi[Interpreter::BasicType_as_index(type)] = generate_stack_to_native_abi_converter(type);
aoqi@0 106 }
aoqi@0 107 }
aoqi@0 108 }
aoqi@0 109
aoqi@0 110
aoqi@0 111 #define method_entry(kind) Interpreter::_entry_table[Interpreter::kind] = generate_method_entry(Interpreter::kind)
aoqi@0 112
aoqi@0 113 { CodeletMark cm(_masm, "(kind = frame_manager)");
aoqi@0 114 // all non-native method kinds
aoqi@0 115 method_entry(zerolocals);
aoqi@0 116 method_entry(zerolocals_synchronized);
aoqi@0 117 method_entry(empty);
aoqi@0 118 method_entry(accessor);
aoqi@0 119 method_entry(abstract);
aoqi@0 120 method_entry(java_lang_math_sin );
aoqi@0 121 method_entry(java_lang_math_cos );
aoqi@0 122 method_entry(java_lang_math_tan );
aoqi@0 123 method_entry(java_lang_math_abs );
aoqi@0 124 method_entry(java_lang_math_sqrt );
aoqi@0 125 method_entry(java_lang_math_log );
aoqi@0 126 method_entry(java_lang_math_log10 );
aoqi@0 127 method_entry(java_lang_math_pow );
aoqi@0 128 method_entry(java_lang_math_exp );
aoqi@0 129 method_entry(java_lang_ref_reference_get);
aoqi@0 130
aoqi@0 131 initialize_method_handle_entries();
aoqi@0 132
aoqi@0 133 Interpreter::_native_entry_begin = Interpreter::code()->code_end();
aoqi@0 134 method_entry(native);
aoqi@0 135 method_entry(native_synchronized);
aoqi@0 136 Interpreter::_native_entry_end = Interpreter::code()->code_end();
aoqi@0 137 }
aoqi@0 138
aoqi@0 139
aoqi@0 140 #undef method_entry
aoqi@0 141
aoqi@0 142 }
aoqi@0 143
aoqi@0 144 #endif // CC_INTERP

mercurial