Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/cpu/aarch64/vm/c1_FrameMap_aarch64.cpp
32285 views
/*1* Copyright (c) 2013, Red Hat Inc.2* Copyright (c) 1999, 2010, Oracle and/or its affiliates.3* All rights reserved.4* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.5*6* This code is free software; you can redistribute it and/or modify it7* under the terms of the GNU General Public License version 2 only, as8* published by the Free Software Foundation.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*24*/2526#include "precompiled.hpp"27#include "c1/c1_FrameMap.hpp"28#include "c1/c1_LIR.hpp"29#include "runtime/sharedRuntime.hpp"30#include "vmreg_aarch64.inline.hpp"3132LIR_Opr FrameMap::map_to_opr(BasicType type, VMRegPair* reg, bool) {33LIR_Opr opr = LIR_OprFact::illegalOpr;34VMReg r_1 = reg->first();35VMReg r_2 = reg->second();36if (r_1->is_stack()) {37// Convert stack slot to an SP offset38// The calling convention does not count the SharedRuntime::out_preserve_stack_slots() value39// so we must add it in here.40int st_off = (r_1->reg2stack() + SharedRuntime::out_preserve_stack_slots()) * VMRegImpl::stack_slot_size;41opr = LIR_OprFact::address(new LIR_Address(sp_opr, st_off, type));42} else if (r_1->is_Register()) {43Register reg = r_1->as_Register();44if (r_2->is_Register() && (type == T_LONG || type == T_DOUBLE)) {45Register reg2 = r_2->as_Register();46#ifdef _LP6447assert(reg2 == reg, "must be same register");48opr = as_long_opr(reg);49#else50opr = as_long_opr(reg2, reg);51#endif // _LP6452} else if (type == T_OBJECT || type == T_ARRAY) {53opr = as_oop_opr(reg);54} else if (type == T_METADATA) {55opr = as_metadata_opr(reg);56} else if (type == T_ADDRESS) {57opr = as_address_opr(reg);58} else {59opr = as_opr(reg);60}61} else if (r_1->is_FloatRegister()) {62assert(type == T_DOUBLE || type == T_FLOAT, "wrong type");63int num = r_1->as_FloatRegister()->encoding();64if (type == T_FLOAT) {65opr = LIR_OprFact::single_fpu(num);66} else {67opr = LIR_OprFact::double_fpu(num);68}69} else {70ShouldNotReachHere();71}72return opr;73}7475LIR_Opr FrameMap::r0_opr;76LIR_Opr FrameMap::r1_opr;77LIR_Opr FrameMap::r2_opr;78LIR_Opr FrameMap::r3_opr;79LIR_Opr FrameMap::r4_opr;80LIR_Opr FrameMap::r5_opr;81LIR_Opr FrameMap::r6_opr;82LIR_Opr FrameMap::r7_opr;83LIR_Opr FrameMap::r8_opr;84LIR_Opr FrameMap::r9_opr;85LIR_Opr FrameMap::r10_opr;86LIR_Opr FrameMap::r11_opr;87LIR_Opr FrameMap::r12_opr;88LIR_Opr FrameMap::r13_opr;89LIR_Opr FrameMap::r14_opr;90LIR_Opr FrameMap::r15_opr;91LIR_Opr FrameMap::r16_opr;92LIR_Opr FrameMap::r17_opr;93LIR_Opr FrameMap::r18_opr;94LIR_Opr FrameMap::r19_opr;95LIR_Opr FrameMap::r20_opr;96LIR_Opr FrameMap::r21_opr;97LIR_Opr FrameMap::r22_opr;98LIR_Opr FrameMap::r23_opr;99LIR_Opr FrameMap::r24_opr;100LIR_Opr FrameMap::r25_opr;101LIR_Opr FrameMap::r26_opr;102LIR_Opr FrameMap::r27_opr;103LIR_Opr FrameMap::r28_opr;104LIR_Opr FrameMap::r29_opr;105LIR_Opr FrameMap::r30_opr;106107LIR_Opr FrameMap::rfp_opr;108LIR_Opr FrameMap::sp_opr;109110LIR_Opr FrameMap::receiver_opr;111112LIR_Opr FrameMap::r0_oop_opr;113LIR_Opr FrameMap::r1_oop_opr;114LIR_Opr FrameMap::r2_oop_opr;115LIR_Opr FrameMap::r3_oop_opr;116LIR_Opr FrameMap::r4_oop_opr;117LIR_Opr FrameMap::r5_oop_opr;118LIR_Opr FrameMap::r6_oop_opr;119LIR_Opr FrameMap::r7_oop_opr;120LIR_Opr FrameMap::r8_oop_opr;121LIR_Opr FrameMap::r9_oop_opr;122LIR_Opr FrameMap::r10_oop_opr;123LIR_Opr FrameMap::r11_oop_opr;124LIR_Opr FrameMap::r12_oop_opr;125LIR_Opr FrameMap::r13_oop_opr;126LIR_Opr FrameMap::r14_oop_opr;127LIR_Opr FrameMap::r15_oop_opr;128LIR_Opr FrameMap::r16_oop_opr;129LIR_Opr FrameMap::r17_oop_opr;130LIR_Opr FrameMap::r18_oop_opr;131LIR_Opr FrameMap::r19_oop_opr;132LIR_Opr FrameMap::r20_oop_opr;133LIR_Opr FrameMap::r21_oop_opr;134LIR_Opr FrameMap::r22_oop_opr;135LIR_Opr FrameMap::r23_oop_opr;136LIR_Opr FrameMap::r24_oop_opr;137LIR_Opr FrameMap::r25_oop_opr;138LIR_Opr FrameMap::r26_oop_opr;139LIR_Opr FrameMap::r27_oop_opr;140LIR_Opr FrameMap::r28_oop_opr;141LIR_Opr FrameMap::r29_oop_opr;142LIR_Opr FrameMap::r30_oop_opr;143144LIR_Opr FrameMap::rscratch1_opr;145LIR_Opr FrameMap::rscratch2_opr;146LIR_Opr FrameMap::rscratch1_long_opr;147LIR_Opr FrameMap::rscratch2_long_opr;148149LIR_Opr FrameMap::r0_metadata_opr;150LIR_Opr FrameMap::r1_metadata_opr;151LIR_Opr FrameMap::r2_metadata_opr;152LIR_Opr FrameMap::r3_metadata_opr;153LIR_Opr FrameMap::r4_metadata_opr;154LIR_Opr FrameMap::r5_metadata_opr;155156LIR_Opr FrameMap::long0_opr;157LIR_Opr FrameMap::long1_opr;158LIR_Opr FrameMap::fpu0_float_opr;159LIR_Opr FrameMap::fpu0_double_opr;160161LIR_Opr FrameMap::_caller_save_cpu_regs[] = { 0, };162LIR_Opr FrameMap::_caller_save_fpu_regs[] = { 0, };163164//--------------------------------------------------------165// FrameMap166//--------------------------------------------------------167168void FrameMap::initialize() {169assert(!_init_done, "once");170171int i=0;172map_register(i, r0); r0_opr = LIR_OprFact::single_cpu(i); i++;173map_register(i, r1); r1_opr = LIR_OprFact::single_cpu(i); i++;174map_register(i, r2); r2_opr = LIR_OprFact::single_cpu(i); i++;175map_register(i, r3); r3_opr = LIR_OprFact::single_cpu(i); i++;176map_register(i, r4); r4_opr = LIR_OprFact::single_cpu(i); i++;177map_register(i, r5); r5_opr = LIR_OprFact::single_cpu(i); i++;178map_register(i, r6); r6_opr = LIR_OprFact::single_cpu(i); i++;179map_register(i, r7); r7_opr = LIR_OprFact::single_cpu(i); i++;180map_register(i, r10); r10_opr = LIR_OprFact::single_cpu(i); i++;181map_register(i, r11); r11_opr = LIR_OprFact::single_cpu(i); i++;182map_register(i, r12); r12_opr = LIR_OprFact::single_cpu(i); i++;183map_register(i, r13); r13_opr = LIR_OprFact::single_cpu(i); i++;184map_register(i, r14); r14_opr = LIR_OprFact::single_cpu(i); i++;185map_register(i, r15); r15_opr = LIR_OprFact::single_cpu(i); i++;186map_register(i, r16); r16_opr = LIR_OprFact::single_cpu(i); i++;187map_register(i, r17); r17_opr = LIR_OprFact::single_cpu(i); i++;188map_register(i, r18); r18_opr = LIR_OprFact::single_cpu(i); i++;189map_register(i, r19); r19_opr = LIR_OprFact::single_cpu(i); i++;190map_register(i, r20); r20_opr = LIR_OprFact::single_cpu(i); i++;191map_register(i, r21); r21_opr = LIR_OprFact::single_cpu(i); i++;192map_register(i, r22); r22_opr = LIR_OprFact::single_cpu(i); i++;193map_register(i, r23); r23_opr = LIR_OprFact::single_cpu(i); i++;194map_register(i, r24); r24_opr = LIR_OprFact::single_cpu(i); i++;195map_register(i, r25); r25_opr = LIR_OprFact::single_cpu(i); i++;196map_register(i, r26); r26_opr = LIR_OprFact::single_cpu(i); i++;197198map_register(i, r27); r27_opr = LIR_OprFact::single_cpu(i); i++; // rheapbase199map_register(i, r28); r28_opr = LIR_OprFact::single_cpu(i); i++; // rthread200map_register(i, r29); r29_opr = LIR_OprFact::single_cpu(i); i++; // rfp201map_register(i, r30); r30_opr = LIR_OprFact::single_cpu(i); i++; // lr202map_register(i, r31_sp); sp_opr = LIR_OprFact::single_cpu(i); i++; // sp203map_register(i, r8); r8_opr = LIR_OprFact::single_cpu(i); i++; // rscratch1204map_register(i, r9); r9_opr = LIR_OprFact::single_cpu(i); i++; // rscratch2205206rscratch1_opr = r8_opr;207rscratch2_opr = r9_opr;208rscratch1_long_opr = LIR_OprFact::double_cpu(r8_opr->cpu_regnr(), r8_opr->cpu_regnr());209rscratch2_long_opr = LIR_OprFact::double_cpu(r9_opr->cpu_regnr(), r9_opr->cpu_regnr());210211long0_opr = LIR_OprFact::double_cpu(0, 0);212long1_opr = LIR_OprFact::double_cpu(1, 1);213214fpu0_float_opr = LIR_OprFact::single_fpu(0);215fpu0_double_opr = LIR_OprFact::double_fpu(0);216217_caller_save_cpu_regs[0] = r0_opr;218_caller_save_cpu_regs[1] = r1_opr;219_caller_save_cpu_regs[2] = r2_opr;220_caller_save_cpu_regs[3] = r3_opr;221_caller_save_cpu_regs[4] = r4_opr;222_caller_save_cpu_regs[5] = r5_opr;223_caller_save_cpu_regs[6] = r6_opr;224_caller_save_cpu_regs[7] = r7_opr;225// rscratch1, rscratch 2 not included226_caller_save_cpu_regs[8] = r10_opr;227_caller_save_cpu_regs[9] = r11_opr;228_caller_save_cpu_regs[10] = r12_opr;229_caller_save_cpu_regs[11] = r13_opr;230_caller_save_cpu_regs[12] = r14_opr;231_caller_save_cpu_regs[13] = r15_opr;232_caller_save_cpu_regs[14] = r16_opr;233_caller_save_cpu_regs[15] = r17_opr;234_caller_save_cpu_regs[16] = r18_opr;235236for (int i = 0; i < 8; i++) {237_caller_save_fpu_regs[i] = LIR_OprFact::single_fpu(i);238}239240_init_done = true;241242r0_oop_opr = as_oop_opr(r0);243r1_oop_opr = as_oop_opr(r1);244r2_oop_opr = as_oop_opr(r2);245r3_oop_opr = as_oop_opr(r3);246r4_oop_opr = as_oop_opr(r4);247r5_oop_opr = as_oop_opr(r5);248r6_oop_opr = as_oop_opr(r6);249r7_oop_opr = as_oop_opr(r7);250r8_oop_opr = as_oop_opr(r8);251r9_oop_opr = as_oop_opr(r9);252r10_oop_opr = as_oop_opr(r10);253r11_oop_opr = as_oop_opr(r11);254r12_oop_opr = as_oop_opr(r12);255r13_oop_opr = as_oop_opr(r13);256r14_oop_opr = as_oop_opr(r14);257r15_oop_opr = as_oop_opr(r15);258r16_oop_opr = as_oop_opr(r16);259r17_oop_opr = as_oop_opr(r17);260r18_oop_opr = as_oop_opr(r18);261r19_oop_opr = as_oop_opr(r19);262r20_oop_opr = as_oop_opr(r20);263r21_oop_opr = as_oop_opr(r21);264r22_oop_opr = as_oop_opr(r22);265r23_oop_opr = as_oop_opr(r23);266r24_oop_opr = as_oop_opr(r24);267r25_oop_opr = as_oop_opr(r25);268r26_oop_opr = as_oop_opr(r26);269r27_oop_opr = as_oop_opr(r27);270r28_oop_opr = as_oop_opr(r28);271r29_oop_opr = as_oop_opr(r29);272r30_oop_opr = as_oop_opr(r30);273274r0_metadata_opr = as_metadata_opr(r0);275r1_metadata_opr = as_metadata_opr(r1);276r2_metadata_opr = as_metadata_opr(r2);277r3_metadata_opr = as_metadata_opr(r3);278r4_metadata_opr = as_metadata_opr(r4);279r5_metadata_opr = as_metadata_opr(r5);280281sp_opr = as_pointer_opr(r31_sp);282rfp_opr = as_pointer_opr(rfp);283284VMRegPair regs;285BasicType sig_bt = T_OBJECT;286SharedRuntime::java_calling_convention(&sig_bt, ®s, 1, true);287receiver_opr = as_oop_opr(regs.first()->as_Register());288289for (int i = 0; i < nof_caller_save_fpu_regs; i++) {290_caller_save_fpu_regs[i] = LIR_OprFact::single_fpu(i);291}292}293294295Address FrameMap::make_new_address(ByteSize sp_offset) const {296// for rbp, based address use this:297// return Address(rbp, in_bytes(sp_offset) - (framesize() - 2) * 4);298return Address(sp, in_bytes(sp_offset));299}300301302// ----------------mapping-----------------------303// all mapping is based on rfp addressing, except for simple leaf methods where we access304// the locals sp based (and no frame is built)305306307// Frame for simple leaf methods (quick entries)308//309// +----------+310// | ret addr | <- TOS311// +----------+312// | args |313// | ...... |314315// Frame for standard methods316//317// | .........| <- TOS318// | locals |319// +----------+320// | old fp, | <- RFP321// +----------+322// | ret addr |323// +----------+324// | args |325// | .........|326327328// For OopMaps, map a local variable or spill index to an VMRegImpl name.329// This is the offset from sp() in the frame of the slot for the index,330// skewed by VMRegImpl::stack0 to indicate a stack location (vs.a register.)331//332// framesize +333// stack0 stack0 0 <- VMReg334// | | <registers> |335// ...........|..............|.............|336// 0 1 2 3 x x 4 5 6 ... | <- local indices337// ^ ^ sp() ( x x indicate link338// | | and return addr)339// arguments non-argument locals340341342VMReg FrameMap::fpu_regname (int n) {343// Return the OptoReg name for the fpu stack slot "n"344// A spilled fpu stack slot comprises to two single-word OptoReg's.345return as_FloatRegister(n)->as_VMReg();346}347348LIR_Opr FrameMap::stack_pointer() {349return FrameMap::sp_opr;350}351352353// JSR 292354LIR_Opr FrameMap::method_handle_invoke_SP_save_opr() {355// assert(rfp == rbp_mh_SP_save, "must be same register");356return rfp_opr;357}358359360bool FrameMap::validate_frame() {361return true;362}363364365