Path: blob/master/src/hotspot/share/interpreter/zero/zeroInterpreterGenerator.cpp
40957 views
/*1* Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.2* Copyright 2007, 2008, 2009, 2010, 2011 Red Hat, Inc.3* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.4*5* This code is free software; you can redistribute it and/or modify it6* under the terms of the GNU General Public License version 2 only, as7* published by the Free Software Foundation.8*9* This code is distributed in the hope that it will be useful, but WITHOUT10* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or11* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License12* version 2 for more details (a copy is included in the LICENSE file that13* accompanied this code).14*15* You should have received a copy of the GNU General Public License version16* 2 along with this work; if not, write to the Free Software Foundation,17* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.18*19* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA20* or visit www.oracle.com if you need additional information or have any21* questions.22*23*/2425#include "precompiled.hpp"26#include "asm/assembler.hpp"27#include "interpreter/interpreter.hpp"28#include "interpreter/interpreterRuntime.hpp"29#include "interpreter/zero/bytecodeInterpreter.hpp"30#include "interpreter/zero/zeroInterpreter.hpp"31#include "oops/method.hpp"32#include "zeroInterpreterGenerator.hpp"3334ZeroInterpreterGenerator::ZeroInterpreterGenerator(StubQueue* _code): AbstractInterpreterGenerator(_code) {35generate_all();36}3738void ZeroInterpreterGenerator::generate_all() {39{ CodeletMark cm(_masm, "slow signature handler");40AbstractInterpreter::_slow_signature_handler = generate_slow_signature_handler();41}4243#define method_entry(kind) Interpreter::_entry_table[Interpreter::kind] = generate_method_entry(Interpreter::kind)4445{ CodeletMark cm(_masm, "(kind = frame_manager)");46// all non-native method kinds47method_entry(zerolocals);48method_entry(zerolocals_synchronized);49method_entry(empty);50method_entry(getter);51method_entry(setter);52method_entry(abstract);53method_entry(java_lang_math_sin );54method_entry(java_lang_math_cos );55method_entry(java_lang_math_tan );56method_entry(java_lang_math_abs );57method_entry(java_lang_math_sqrt );58method_entry(java_lang_math_log );59method_entry(java_lang_math_log10 );60method_entry(java_lang_math_pow );61method_entry(java_lang_math_exp );62method_entry(java_lang_math_fmaD );63method_entry(java_lang_math_fmaF );64method_entry(java_lang_ref_reference_get);6566AbstractInterpreter::initialize_method_handle_entries();6768Interpreter::_native_entry_begin = Interpreter::code()->code_end();69method_entry(native);70method_entry(native_synchronized);71Interpreter::_native_entry_end = Interpreter::code()->code_end();72}7374#undef method_entry75}7677// Generate method entries78address ZeroInterpreterGenerator::generate_method_entry(79AbstractInterpreter::MethodKind kind) {80// determine code generation flags81bool native = false;82bool synchronized = false;83address entry_point = NULL;8485switch (kind) {86case Interpreter::zerolocals : break;87case Interpreter::zerolocals_synchronized: synchronized = true; break;88case Interpreter::native : native = true; break;89case Interpreter::native_synchronized : native = true; synchronized = true; break;90case Interpreter::empty : entry_point = generate_empty_entry(); break;91case Interpreter::getter : entry_point = generate_getter_entry(); break;92case Interpreter::setter : entry_point = generate_setter_entry(); break;93case Interpreter::abstract : entry_point = generate_abstract_entry(); break;9495case Interpreter::java_lang_math_sin : // fall thru96case Interpreter::java_lang_math_cos : // fall thru97case Interpreter::java_lang_math_tan : // fall thru98case Interpreter::java_lang_math_abs : // fall thru99case Interpreter::java_lang_math_log : // fall thru100case Interpreter::java_lang_math_log10 : // fall thru101case Interpreter::java_lang_math_sqrt : // fall thru102case Interpreter::java_lang_math_pow : // fall thru103case Interpreter::java_lang_math_exp : // fall thru104case Interpreter::java_lang_math_fmaD : // fall thru105case Interpreter::java_lang_math_fmaF : entry_point = generate_math_entry(kind); break;106case Interpreter::java_lang_ref_reference_get107: entry_point = generate_Reference_get_entry(); break;108default:109fatal("unexpected method kind: %d", kind);110break;111}112113if (entry_point) {114return entry_point;115}116117// We expect the normal and native entry points to be generated first so we can reuse them.118if (native) {119entry_point = Interpreter::entry_for_kind(synchronized ? Interpreter::native_synchronized : Interpreter::native);120if (entry_point == NULL) {121entry_point = generate_native_entry(synchronized);122}123} else {124entry_point = Interpreter::entry_for_kind(synchronized ? Interpreter::zerolocals_synchronized : Interpreter::zerolocals);125if (entry_point == NULL) {126entry_point = generate_normal_entry(synchronized);127}128}129130return entry_point;131}132133address ZeroInterpreterGenerator::generate_slow_signature_handler() {134_masm->advance(1);135return (address) InterpreterRuntime::slow_signature_handler;136}137138address ZeroInterpreterGenerator::generate_math_entry(139AbstractInterpreter::MethodKind kind) {140if (!InlineIntrinsics)141return NULL;142143Unimplemented();144return NULL;145}146147address ZeroInterpreterGenerator::generate_abstract_entry() {148return generate_entry((address) ShouldNotCallThisEntry());149}150151address ZeroInterpreterGenerator::generate_empty_entry() {152if (!UseFastEmptyMethods)153return NULL;154155return generate_entry((address) ZeroInterpreter::empty_entry);156}157158address ZeroInterpreterGenerator::generate_getter_entry() {159if (!UseFastAccessorMethods)160return NULL;161162return generate_entry((address) ZeroInterpreter::getter_entry);163}164165address ZeroInterpreterGenerator::generate_setter_entry() {166if (!UseFastAccessorMethods)167return NULL;168169return generate_entry((address) ZeroInterpreter::setter_entry);170}171172address ZeroInterpreterGenerator::generate_Reference_get_entry(void) {173return generate_entry((address) ZeroInterpreter::Reference_get_entry);174}175176address ZeroInterpreterGenerator::generate_native_entry(bool synchronized) {177return generate_entry((address) ZeroInterpreter::native_entry);178}179180address ZeroInterpreterGenerator::generate_normal_entry(bool synchronized) {181return generate_entry((address) ZeroInterpreter::normal_entry);182}183184185