Path: blob/master/src/hotspot/cpu/ppc/c1_FrameMap_ppc.cpp
40930 views
/*1* Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.2* Copyright (c) 2012, 2019 SAP SE. All rights reserved.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 "c1/c1_FrameMap.hpp"27#include "c1/c1_LIR.hpp"28#include "runtime/sharedRuntime.hpp"29#include "vmreg_ppc.inline.hpp"303132const int FrameMap::pd_c_runtime_reserved_arg_size = 7;333435LIR_Opr FrameMap::map_to_opr(BasicType type, VMRegPair* reg, bool outgoing) {36LIR_Opr opr = LIR_OprFact::illegalOpr;37VMReg r_1 = reg->first();38VMReg r_2 = reg->second();39if (r_1->is_stack()) {40// Convert stack slot to an SP offset.41// The calling convention does not count the SharedRuntime::out_preserve_stack_slots() value42// so we must add it in here.43int st_off = (r_1->reg2stack() + SharedRuntime::out_preserve_stack_slots()) * VMRegImpl::stack_slot_size;44opr = LIR_OprFact::address(new LIR_Address(SP_opr, st_off, type));45} else if (r_1->is_Register()) {46Register reg = r_1->as_Register();47//if (outgoing) {48// assert(!reg->is_in(), "should be using I regs");49//} else {50// assert(!reg->is_out(), "should be using O regs");51//}52if (r_2->is_Register() && (type == T_LONG || type == T_DOUBLE)) {53opr = as_long_opr(reg);54} else if (is_reference_type(type)) {55opr = as_oop_opr(reg);56} else if (type == T_METADATA) {57opr = as_metadata_opr(reg);58} else if (type == T_ADDRESS) {59opr = as_address_opr(reg);60} else {61opr = as_opr(reg);62}63} else if (r_1->is_FloatRegister()) {64assert(type == T_DOUBLE || type == T_FLOAT, "wrong type");65FloatRegister f = r_1->as_FloatRegister();66if (type == T_DOUBLE) {67opr = as_double_opr(f);68} else {69opr = as_float_opr(f);70}71}72return opr;73}7475// FrameMap76//--------------------------------------------------------7778FloatRegister FrameMap::_fpu_regs [FrameMap::nof_fpu_regs];7980LIR_Opr FrameMap::R0_opr;81LIR_Opr FrameMap::R1_opr;82LIR_Opr FrameMap::R2_opr;83LIR_Opr FrameMap::R3_opr;84LIR_Opr FrameMap::R4_opr;85LIR_Opr FrameMap::R5_opr;86LIR_Opr FrameMap::R6_opr;87LIR_Opr FrameMap::R7_opr;88LIR_Opr FrameMap::R8_opr;89LIR_Opr FrameMap::R9_opr;90LIR_Opr FrameMap::R10_opr;91LIR_Opr FrameMap::R11_opr;92LIR_Opr FrameMap::R12_opr;93LIR_Opr FrameMap::R13_opr;94LIR_Opr FrameMap::R14_opr;95LIR_Opr FrameMap::R15_opr;96LIR_Opr FrameMap::R16_opr;97LIR_Opr FrameMap::R17_opr;98LIR_Opr FrameMap::R18_opr;99LIR_Opr FrameMap::R19_opr;100LIR_Opr FrameMap::R20_opr;101LIR_Opr FrameMap::R21_opr;102LIR_Opr FrameMap::R22_opr;103LIR_Opr FrameMap::R23_opr;104LIR_Opr FrameMap::R24_opr;105LIR_Opr FrameMap::R25_opr;106LIR_Opr FrameMap::R26_opr;107LIR_Opr FrameMap::R27_opr;108LIR_Opr FrameMap::R28_opr;109LIR_Opr FrameMap::R29_opr;110LIR_Opr FrameMap::R30_opr;111LIR_Opr FrameMap::R31_opr;112113LIR_Opr FrameMap::R0_oop_opr;114//LIR_Opr FrameMap::R1_oop_opr;115LIR_Opr FrameMap::R2_oop_opr;116LIR_Opr FrameMap::R3_oop_opr;117LIR_Opr FrameMap::R4_oop_opr;118LIR_Opr FrameMap::R5_oop_opr;119LIR_Opr FrameMap::R6_oop_opr;120LIR_Opr FrameMap::R7_oop_opr;121LIR_Opr FrameMap::R8_oop_opr;122LIR_Opr FrameMap::R9_oop_opr;123LIR_Opr FrameMap::R10_oop_opr;124LIR_Opr FrameMap::R11_oop_opr;125LIR_Opr FrameMap::R12_oop_opr;126//LIR_Opr FrameMap::R13_oop_opr;127LIR_Opr FrameMap::R14_oop_opr;128LIR_Opr FrameMap::R15_oop_opr;129//LIR_Opr FrameMap::R16_oop_opr;130LIR_Opr FrameMap::R17_oop_opr;131LIR_Opr FrameMap::R18_oop_opr;132LIR_Opr FrameMap::R19_oop_opr;133LIR_Opr FrameMap::R20_oop_opr;134LIR_Opr FrameMap::R21_oop_opr;135LIR_Opr FrameMap::R22_oop_opr;136LIR_Opr FrameMap::R23_oop_opr;137LIR_Opr FrameMap::R24_oop_opr;138LIR_Opr FrameMap::R25_oop_opr;139LIR_Opr FrameMap::R26_oop_opr;140LIR_Opr FrameMap::R27_oop_opr;141LIR_Opr FrameMap::R28_oop_opr;142//LIR_Opr FrameMap::R29_oop_opr;143LIR_Opr FrameMap::R30_oop_opr;144LIR_Opr FrameMap::R31_oop_opr;145146LIR_Opr FrameMap::R0_metadata_opr;147//LIR_Opr FrameMap::R1_metadata_opr;148LIR_Opr FrameMap::R2_metadata_opr;149LIR_Opr FrameMap::R3_metadata_opr;150LIR_Opr FrameMap::R4_metadata_opr;151LIR_Opr FrameMap::R5_metadata_opr;152LIR_Opr FrameMap::R6_metadata_opr;153LIR_Opr FrameMap::R7_metadata_opr;154LIR_Opr FrameMap::R8_metadata_opr;155LIR_Opr FrameMap::R9_metadata_opr;156LIR_Opr FrameMap::R10_metadata_opr;157LIR_Opr FrameMap::R11_metadata_opr;158LIR_Opr FrameMap::R12_metadata_opr;159//LIR_Opr FrameMap::R13_metadata_opr;160LIR_Opr FrameMap::R14_metadata_opr;161LIR_Opr FrameMap::R15_metadata_opr;162//LIR_Opr FrameMap::R16_metadata_opr;163LIR_Opr FrameMap::R17_metadata_opr;164LIR_Opr FrameMap::R18_metadata_opr;165LIR_Opr FrameMap::R19_metadata_opr;166LIR_Opr FrameMap::R20_metadata_opr;167LIR_Opr FrameMap::R21_metadata_opr;168LIR_Opr FrameMap::R22_metadata_opr;169LIR_Opr FrameMap::R23_metadata_opr;170LIR_Opr FrameMap::R24_metadata_opr;171LIR_Opr FrameMap::R25_metadata_opr;172LIR_Opr FrameMap::R26_metadata_opr;173LIR_Opr FrameMap::R27_metadata_opr;174LIR_Opr FrameMap::R28_metadata_opr;175//LIR_Opr FrameMap::R29_metadata_opr;176LIR_Opr FrameMap::R30_metadata_opr;177LIR_Opr FrameMap::R31_metadata_opr;178179LIR_Opr FrameMap::SP_opr;180181LIR_Opr FrameMap::R0_long_opr;182LIR_Opr FrameMap::R3_long_opr;183184LIR_Opr FrameMap::F1_opr;185LIR_Opr FrameMap::F1_double_opr;186187LIR_Opr FrameMap::_caller_save_cpu_regs[] = { 0, };188LIR_Opr FrameMap::_caller_save_fpu_regs[] = { 0, };189190FloatRegister FrameMap::nr2floatreg (int rnr) {191assert(_init_done, "tables not initialized");192debug_only(fpu_range_check(rnr);)193return _fpu_regs[rnr];194}195196197// Returns true if reg could be smashed by a callee.198bool FrameMap::is_caller_save_register (LIR_Opr reg) {199if (reg->is_single_fpu() || reg->is_double_fpu()) { return true; }200if (reg->is_double_cpu()) {201return is_caller_save_register(reg->as_register_lo()) ||202is_caller_save_register(reg->as_register_hi());203}204return is_caller_save_register(reg->as_register());205}206207208bool FrameMap::is_caller_save_register (Register r) {209// not visible to allocator: R0: scratch, R1: SP210// r->encoding() < 2 + nof_caller_save_cpu_regs();211return true; // Currently all regs are caller save.212}213214215void FrameMap::initialize() {216assert(!_init_done, "once");217218int i = 0;219220// Put generally available registers at the beginning (allocated, saved for GC).221for (int j = 0; j < nof_cpu_regs; ++j) {222Register rj = as_Register(j);223if (reg_needs_save(rj)) {224map_register(i++, rj);225}226}227assert(i == nof_cpu_regs_reg_alloc, "number of allocated registers");228229// The following registers are not normally available.230for (int j = 0; j < nof_cpu_regs; ++j) {231Register rj = as_Register(j);232if (!reg_needs_save(rj)) {233map_register(i++, rj);234}235}236assert(i == nof_cpu_regs, "number of CPU registers");237238for (i = 0; i < nof_fpu_regs; i++) {239_fpu_regs[i] = as_FloatRegister(i);240}241242_init_done = true;243244R0_opr = as_opr(R0);245R1_opr = as_opr(R1);246R2_opr = as_opr(R2);247R3_opr = as_opr(R3);248R4_opr = as_opr(R4);249R5_opr = as_opr(R5);250R6_opr = as_opr(R6);251R7_opr = as_opr(R7);252R8_opr = as_opr(R8);253R9_opr = as_opr(R9);254R10_opr = as_opr(R10);255R11_opr = as_opr(R11);256R12_opr = as_opr(R12);257R13_opr = as_opr(R13);258R14_opr = as_opr(R14);259R15_opr = as_opr(R15);260R16_opr = as_opr(R16);261R17_opr = as_opr(R17);262R18_opr = as_opr(R18);263R19_opr = as_opr(R19);264R20_opr = as_opr(R20);265R21_opr = as_opr(R21);266R22_opr = as_opr(R22);267R23_opr = as_opr(R23);268R24_opr = as_opr(R24);269R25_opr = as_opr(R25);270R26_opr = as_opr(R26);271R27_opr = as_opr(R27);272R28_opr = as_opr(R28);273R29_opr = as_opr(R29);274R30_opr = as_opr(R30);275R31_opr = as_opr(R31);276277R0_oop_opr = as_oop_opr(R0);278//R1_oop_opr = as_oop_opr(R1);279R2_oop_opr = as_oop_opr(R2);280R3_oop_opr = as_oop_opr(R3);281R4_oop_opr = as_oop_opr(R4);282R5_oop_opr = as_oop_opr(R5);283R6_oop_opr = as_oop_opr(R6);284R7_oop_opr = as_oop_opr(R7);285R8_oop_opr = as_oop_opr(R8);286R9_oop_opr = as_oop_opr(R9);287R10_oop_opr = as_oop_opr(R10);288R11_oop_opr = as_oop_opr(R11);289R12_oop_opr = as_oop_opr(R12);290//R13_oop_opr = as_oop_opr(R13);291R14_oop_opr = as_oop_opr(R14);292R15_oop_opr = as_oop_opr(R15);293//R16_oop_opr = as_oop_opr(R16);294R17_oop_opr = as_oop_opr(R17);295R18_oop_opr = as_oop_opr(R18);296R19_oop_opr = as_oop_opr(R19);297R20_oop_opr = as_oop_opr(R20);298R21_oop_opr = as_oop_opr(R21);299R22_oop_opr = as_oop_opr(R22);300R23_oop_opr = as_oop_opr(R23);301R24_oop_opr = as_oop_opr(R24);302R25_oop_opr = as_oop_opr(R25);303R26_oop_opr = as_oop_opr(R26);304R27_oop_opr = as_oop_opr(R27);305R28_oop_opr = as_oop_opr(R28);306//R29_oop_opr = as_oop_opr(R29);307R30_oop_opr = as_oop_opr(R30);308R31_oop_opr = as_oop_opr(R31);309310R0_metadata_opr = as_metadata_opr(R0);311//R1_metadata_opr = as_metadata_opr(R1);312R2_metadata_opr = as_metadata_opr(R2);313R3_metadata_opr = as_metadata_opr(R3);314R4_metadata_opr = as_metadata_opr(R4);315R5_metadata_opr = as_metadata_opr(R5);316R6_metadata_opr = as_metadata_opr(R6);317R7_metadata_opr = as_metadata_opr(R7);318R8_metadata_opr = as_metadata_opr(R8);319R9_metadata_opr = as_metadata_opr(R9);320R10_metadata_opr = as_metadata_opr(R10);321R11_metadata_opr = as_metadata_opr(R11);322R12_metadata_opr = as_metadata_opr(R12);323//R13_metadata_opr = as_metadata_opr(R13);324R14_metadata_opr = as_metadata_opr(R14);325R15_metadata_opr = as_metadata_opr(R15);326//R16_metadata_opr = as_metadata_opr(R16);327R17_metadata_opr = as_metadata_opr(R17);328R18_metadata_opr = as_metadata_opr(R18);329R19_metadata_opr = as_metadata_opr(R19);330R20_metadata_opr = as_metadata_opr(R20);331R21_metadata_opr = as_metadata_opr(R21);332R22_metadata_opr = as_metadata_opr(R22);333R23_metadata_opr = as_metadata_opr(R23);334R24_metadata_opr = as_metadata_opr(R24);335R25_metadata_opr = as_metadata_opr(R25);336R26_metadata_opr = as_metadata_opr(R26);337R27_metadata_opr = as_metadata_opr(R27);338R28_metadata_opr = as_metadata_opr(R28);339//R29_metadata_opr = as_metadata_opr(R29);340R30_metadata_opr = as_metadata_opr(R30);341R31_metadata_opr = as_metadata_opr(R31);342343SP_opr = as_pointer_opr(R1_SP);344345R0_long_opr = LIR_OprFact::double_cpu(cpu_reg2rnr(R0), cpu_reg2rnr(R0));346R3_long_opr = LIR_OprFact::double_cpu(cpu_reg2rnr(R3), cpu_reg2rnr(R3));347348F1_opr = as_float_opr(F1);349F1_double_opr = as_double_opr(F1);350351// All the allocated cpu regs are caller saved.352for (int i = 0; i < max_nof_caller_save_cpu_regs; i++) {353_caller_save_cpu_regs[i] = LIR_OprFact::single_cpu(i);354}355356// All the fpu regs are caller saved.357for (int i = 0; i < nof_caller_save_fpu_regs; i++) {358_caller_save_fpu_regs[i] = LIR_OprFact::single_fpu(i);359}360}361362363Address FrameMap::make_new_address(ByteSize sp_offset) const {364return Address(R1_SP, in_bytes(sp_offset));365}366367368VMReg FrameMap::fpu_regname (int n) {369return as_FloatRegister(n)->as_VMReg();370}371372373LIR_Opr FrameMap::stack_pointer() {374return SP_opr;375}376377378// JSR 292379// On PPC64, there is no need to save the SP, because neither380// method handle intrinsics, nor compiled lambda forms modify it.381LIR_Opr FrameMap::method_handle_invoke_SP_save_opr() {382return LIR_OprFact::illegalOpr;383}384385386bool FrameMap::validate_frame() {387int max_offset = in_bytes(framesize_in_bytes());388int java_index = 0;389for (int i = 0; i < _incoming_arguments->length(); i++) {390LIR_Opr opr = _incoming_arguments->at(i);391if (opr->is_stack()) {392max_offset = MAX2(_argument_locations->at(java_index), max_offset);393}394java_index += type2size[opr->type()];395}396return Assembler::is_simm16(max_offset);397}398399400