aoqi@1: /* aoqi@1: * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. aoqi@1: * Copyright (c) 2015, 2016, Loongson Technology. All rights reserved. aoqi@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@1: * aoqi@1: * This code is free software; you can redistribute it and/or modify it aoqi@1: * under the terms of the GNU General Public License version 2 only, as aoqi@1: * published by the Free Software Foundation. aoqi@1: * aoqi@1: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@1: * version 2 for more details (a copy is included in the LICENSE file that aoqi@1: * accompanied this code). aoqi@1: * aoqi@1: * You should have received a copy of the GNU General Public License version aoqi@1: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@1: * aoqi@1: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@1: * or visit www.oracle.com if you need additional information or have any aoqi@1: * questions. aoqi@1: * aoqi@1: */ aoqi@1: aoqi@1: #include "precompiled.hpp" aoqi@1: #include "c1/c1_FrameMap.hpp" aoqi@1: #include "c1/c1_LIR.hpp" aoqi@1: #include "runtime/sharedRuntime.hpp" aoqi@1: #include "vmreg_mips.inline.hpp" aoqi@1: aoqi@1: const int FrameMap::pd_c_runtime_reserved_arg_size = 0; aoqi@1: aoqi@1: aoqi@1: FloatRegister FrameMap::_fpu_regs[32]; aoqi@1: aoqi@1: aoqi@1: aoqi@1: LIR_Opr FrameMap::map_to_opr(BasicType type, VMRegPair* reg, bool) { aoqi@1: LIR_Opr opr = LIR_OprFact::illegalOpr; aoqi@1: VMReg r_1 = reg->first(); aoqi@1: VMReg r_2 = reg->second(); aoqi@1: if (r_1->is_stack()) { aoqi@1: // Convert stack slot to an SP offset aoqi@1: // The calling convention does not count the aoqi@1: // SharedRuntime::out_preserve_stack_slots() value aoqi@1: // so we must add it in here. aoqi@1: int st_off = (r_1->reg2stack() + SharedRuntime::out_preserve_stack_slots()) aoqi@1: * VMRegImpl::stack_slot_size; aoqi@1: opr = LIR_OprFact::address(new LIR_Address(_sp_opr, st_off, type)); aoqi@1: } else if (r_1->is_Register()) { aoqi@1: Register reg = r_1->as_Register(); aoqi@1: if (r_2->is_Register() && (type == T_LONG || type == T_DOUBLE)) { aoqi@1: Register reg2 = r_2->as_Register(); aoqi@1: #ifdef _LP64 aoqi@1: assert(reg2 == reg, "must be same register"); aoqi@1: #endif aoqi@1: opr = as_long_opr(reg, reg2); aoqi@1: } else if (type == T_OBJECT || type == T_ARRAY) { aoqi@1: opr = as_oop_opr(reg); aoqi@1: } else { aoqi@1: opr = as_opr(reg); aoqi@1: } aoqi@1: } else if (r_1->is_FloatRegister()) { aoqi@1: assert(type == T_DOUBLE || type == T_FLOAT, "wrong type"); aoqi@1: int num = r_1->as_FloatRegister()->encoding(); aoqi@1: if (type == T_FLOAT) { aoqi@1: opr = LIR_OprFact::single_fpu(num); aoqi@1: } else { aoqi@1: opr = LIR_OprFact::double_fpu(num); aoqi@1: } aoqi@1: } else { aoqi@1: ShouldNotReachHere(); aoqi@1: } aoqi@1: return opr; aoqi@1: } aoqi@1: aoqi@1: // some useful constant RInfo's: aoqi@1: LIR_Opr FrameMap::_zero_opr; aoqi@1: LIR_Opr FrameMap::_k0_opr; aoqi@1: LIR_Opr FrameMap::_k1_opr; aoqi@1: LIR_Opr FrameMap::_at_opr; aoqi@1: LIR_Opr FrameMap::_v0_opr; aoqi@1: LIR_Opr FrameMap::_v1_opr; aoqi@1: LIR_Opr FrameMap::_a0_opr; aoqi@1: LIR_Opr FrameMap::_a1_opr; aoqi@1: LIR_Opr FrameMap::_a2_opr; aoqi@1: LIR_Opr FrameMap::_a3_opr; aoqi@1: LIR_Opr FrameMap::_t0_opr; aoqi@1: LIR_Opr FrameMap::_t1_opr; aoqi@1: LIR_Opr FrameMap::_t2_opr; aoqi@1: LIR_Opr FrameMap::_t3_opr; aoqi@1: #ifndef _LP64 aoqi@1: LIR_Opr FrameMap::_t4_opr; aoqi@1: LIR_Opr FrameMap::_t5_opr; aoqi@1: LIR_Opr FrameMap::_t6_opr; aoqi@1: LIR_Opr FrameMap::_t7_opr; aoqi@1: #else aoqi@1: LIR_Opr FrameMap::_a4_opr; aoqi@1: LIR_Opr FrameMap::_a5_opr; aoqi@1: LIR_Opr FrameMap::_a6_opr; aoqi@1: LIR_Opr FrameMap::_a7_opr; aoqi@1: #endif aoqi@1: LIR_Opr FrameMap::_t8_opr; aoqi@1: LIR_Opr FrameMap::_t9_opr; aoqi@1: LIR_Opr FrameMap::_s0_opr; aoqi@1: LIR_Opr FrameMap::_s1_opr; aoqi@1: LIR_Opr FrameMap::_s2_opr; aoqi@1: LIR_Opr FrameMap::_s3_opr; aoqi@1: LIR_Opr FrameMap::_s4_opr; aoqi@1: LIR_Opr FrameMap::_s5_opr; aoqi@1: LIR_Opr FrameMap::_s6_opr; aoqi@1: LIR_Opr FrameMap::_s7_opr; aoqi@1: LIR_Opr FrameMap::_gp_opr; aoqi@1: LIR_Opr FrameMap::_fp_opr; aoqi@1: LIR_Opr FrameMap::_sp_opr; aoqi@1: LIR_Opr FrameMap::_ra_opr; aoqi@1: aoqi@1: aoqi@1: aoqi@1: LIR_Opr FrameMap::_a0_a1_opr; aoqi@1: LIR_Opr FrameMap::_a2_a3_opr; aoqi@1: LIR_Opr FrameMap::_v0_v1_opr; aoqi@1: aoqi@1: aoqi@1: LIR_Opr FrameMap::_f0_opr; aoqi@1: LIR_Opr FrameMap::_f12_opr; aoqi@1: LIR_Opr FrameMap::_f14_opr; aoqi@1: LIR_Opr FrameMap::_d0_opr; aoqi@1: LIR_Opr FrameMap::_d12_opr; aoqi@1: LIR_Opr FrameMap::_d14_opr; aoqi@1: aoqi@1: aoqi@1: LIR_Opr FrameMap::receiver_opr; aoqi@1: aoqi@1: //caller saved register aoqi@1: LIR_Opr FrameMap::_v0_oop_opr; aoqi@1: LIR_Opr FrameMap::_v1_oop_opr; aoqi@1: LIR_Opr FrameMap::_a0_oop_opr; aoqi@1: LIR_Opr FrameMap::_a1_oop_opr; aoqi@1: LIR_Opr FrameMap::_a2_oop_opr; aoqi@1: LIR_Opr FrameMap::_a3_oop_opr; aoqi@1: LIR_Opr FrameMap::_t0_oop_opr; aoqi@1: LIR_Opr FrameMap::_t1_oop_opr; aoqi@1: LIR_Opr FrameMap::_t2_oop_opr; aoqi@1: LIR_Opr FrameMap::_t3_oop_opr; aoqi@1: #ifndef _LP64 aoqi@1: LIR_Opr FrameMap::_t4_oop_opr; aoqi@1: LIR_Opr FrameMap::_t5_oop_opr; aoqi@1: LIR_Opr FrameMap::_t6_oop_opr; aoqi@1: LIR_Opr FrameMap::_t7_oop_opr; aoqi@1: #else aoqi@1: LIR_Opr FrameMap::_a4_oop_opr; aoqi@1: LIR_Opr FrameMap::_a5_oop_opr; aoqi@1: LIR_Opr FrameMap::_a6_oop_opr; aoqi@1: LIR_Opr FrameMap::_a7_oop_opr; aoqi@1: #endif aoqi@1: LIR_Opr FrameMap::_t8_oop_opr; aoqi@1: LIR_Opr FrameMap::_t9_oop_opr; aoqi@1: LIR_Opr FrameMap::_s0_oop_opr; aoqi@1: LIR_Opr FrameMap::_s1_oop_opr; aoqi@1: LIR_Opr FrameMap::_s2_oop_opr; aoqi@1: LIR_Opr FrameMap::_s3_oop_opr; aoqi@1: LIR_Opr FrameMap::_s4_oop_opr; aoqi@1: LIR_Opr FrameMap::_s5_oop_opr; aoqi@1: LIR_Opr FrameMap::_s6_oop_opr; aoqi@1: LIR_Opr FrameMap::_s7_oop_opr; aoqi@1: aoqi@1: aoqi@1: LIR_Opr FrameMap::_a0_a1_long_opr; aoqi@1: LIR_Opr FrameMap::_a2_a3_long_opr; aoqi@1: LIR_Opr FrameMap::_v0_v1_long_opr; aoqi@1: LIR_Opr FrameMap::_f0_float_opr; aoqi@1: LIR_Opr FrameMap::_f12_float_opr; aoqi@1: LIR_Opr FrameMap::_f14_float_opr; aoqi@1: LIR_Opr FrameMap::_d0_double_opr; aoqi@1: LIR_Opr FrameMap::_d12_double_opr; aoqi@1: LIR_Opr FrameMap::_d14_double_opr; aoqi@1: aoqi@1: aoqi@1: aoqi@1: aoqi@1: LIR_Opr FrameMap::_caller_save_cpu_regs[] = { 0, }; aoqi@1: LIR_Opr FrameMap::_caller_save_fpu_regs[] = { 0, }; aoqi@1: aoqi@1: aoqi@1: //-------------------------------------------------------- aoqi@1: // FrameMap aoqi@1: //-------------------------------------------------------- aoqi@1: FloatRegister FrameMap::nr2floatreg (int rnr) { aoqi@1: assert(_init_done, "tables not initialized"); aoqi@1: debug_only(fpu_range_check(rnr);) aoqi@1: return _fpu_regs[rnr]; aoqi@1: } aoqi@1: aoqi@1: // returns true if reg could be smashed by a callee. aoqi@1: bool FrameMap::is_caller_save_register (LIR_Opr reg) { aoqi@1: if (reg->is_single_fpu() || reg->is_double_fpu()) { return true; } aoqi@1: if (reg->is_double_cpu()) { aoqi@1: return is_caller_save_register(reg->as_register_lo()) || aoqi@1: is_caller_save_register(reg->as_register_hi()); aoqi@1: } aoqi@1: return is_caller_save_register(reg->as_register()); aoqi@1: } aoqi@1: aoqi@1: //FIXME, why always ture? @jerome aoqi@1: bool FrameMap::is_caller_save_register (Register r) { aoqi@1: // return (r>=V0 && r<=T7) || (r==T8) || (r==T9); aoqi@1: //return ((r>=V0) && (r<=T7)); aoqi@1: return true; aoqi@1: } aoqi@1: aoqi@1: void FrameMap::initialize() { aoqi@1: if (_init_done) return; aoqi@1: aoqi@1: assert(nof_cpu_regs == 32, "wrong number of CPU registers"); aoqi@1: //init _cpu_regs for RegAlloc aoqi@1: int i = 0; aoqi@1: aoqi@1: map_register(0,R0); _zero_opr=LIR_OprFact::single_cpu(0); aoqi@1: map_register(1,AT); aoqi@1: #ifdef _LP64 aoqi@1: _at_opr=LIR_OprFact::double_cpu(1, 1); aoqi@1: #else aoqi@1: _at_opr=LIR_OprFact::single_cpu(1); aoqi@1: #endif aoqi@1: map_register(2,V0); _v0_opr=LIR_OprFact::single_cpu(2); _v0_oop_opr=LIR_OprFact::single_cpu_oop(2); aoqi@1: map_register(3,V1); _v1_opr=LIR_OprFact::single_cpu(3); _v1_oop_opr=LIR_OprFact::single_cpu_oop(3); aoqi@1: map_register(4,A0); _a0_opr=LIR_OprFact::single_cpu(4); _a0_oop_opr=LIR_OprFact::single_cpu_oop(4); aoqi@1: map_register(5,A1); _a1_opr=LIR_OprFact::single_cpu(5); _a1_oop_opr=LIR_OprFact::single_cpu_oop(5); aoqi@1: map_register(6,A2); _a2_opr=LIR_OprFact::single_cpu(6); _a2_oop_opr=LIR_OprFact::single_cpu_oop(6); aoqi@1: map_register(7,A3); _a3_opr=LIR_OprFact::single_cpu(7); _a3_oop_opr=LIR_OprFact::single_cpu_oop(7); aoqi@1: #ifndef _LP64 aoqi@1: map_register(8,T0); _t0_opr=LIR_OprFact::single_cpu(8); _t0_oop_opr=LIR_OprFact::single_cpu_oop(8); aoqi@1: map_register(9,T1); _t1_opr=LIR_OprFact::single_cpu(9); _t1_oop_opr=LIR_OprFact::single_cpu_oop(9); aoqi@1: map_register(10,T2); _t2_opr=LIR_OprFact::single_cpu(10); _t2_oop_opr=LIR_OprFact::single_cpu_oop(10); aoqi@1: map_register(11,T3); _t3_opr=LIR_OprFact::single_cpu(11); _t3_oop_opr=LIR_OprFact::single_cpu_oop(11); aoqi@1: map_register(12,T4); _t4_opr=LIR_OprFact::single_cpu(12); _t4_oop_opr=LIR_OprFact::single_cpu_oop(12); aoqi@1: map_register(13,T5); _t5_opr=LIR_OprFact::single_cpu(13); _t5_oop_opr=LIR_OprFact::single_cpu_oop(13); aoqi@1: map_register(14,T6); _t6_opr=LIR_OprFact::single_cpu(14); _t6_oop_opr=LIR_OprFact::single_cpu_oop(14); aoqi@1: map_register(15,T7); _t7_opr=LIR_OprFact::single_cpu(15); _t7_oop_opr=LIR_OprFact::single_cpu_oop(15); aoqi@1: #else aoqi@1: map_register(8,A4); _a4_opr=LIR_OprFact::single_cpu(8); _a4_oop_opr=LIR_OprFact::single_cpu_oop(8); aoqi@1: map_register(9,A5); _a5_opr=LIR_OprFact::single_cpu(9); _a5_oop_opr=LIR_OprFact::single_cpu_oop(9); aoqi@1: map_register(10,A6); _a6_opr=LIR_OprFact::single_cpu(10); _a6_oop_opr=LIR_OprFact::single_cpu_oop(10); aoqi@1: map_register(11,A7); _a7_opr=LIR_OprFact::single_cpu(11); _a7_oop_opr=LIR_OprFact::single_cpu_oop(11); aoqi@1: map_register(12,T0); _t0_opr=LIR_OprFact::single_cpu(12); _t0_oop_opr=LIR_OprFact::single_cpu_oop(12); aoqi@1: map_register(13,T1); _t1_opr=LIR_OprFact::single_cpu(13); _t1_oop_opr=LIR_OprFact::single_cpu_oop(13); aoqi@1: map_register(14,T2); _t2_opr=LIR_OprFact::single_cpu(14); _t2_oop_opr=LIR_OprFact::single_cpu_oop(14); aoqi@1: map_register(15,T3); _t3_opr=LIR_OprFact::single_cpu(15); _t3_oop_opr=LIR_OprFact::single_cpu_oop(15); aoqi@1: #endif aoqi@1: map_register(16,S0); _s0_opr=LIR_OprFact::single_cpu(16); _s0_oop_opr=LIR_OprFact::single_cpu_oop(16); aoqi@1: map_register(17,S1); _s1_opr=LIR_OprFact::single_cpu(17); _s1_oop_opr=LIR_OprFact::single_cpu_oop(17); aoqi@1: map_register(18,S2); _s2_opr=LIR_OprFact::single_cpu(18); _s2_oop_opr=LIR_OprFact::single_cpu_oop(18); aoqi@1: map_register(19,S3); _s3_opr=LIR_OprFact::single_cpu(19); _s3_oop_opr=LIR_OprFact::single_cpu_oop(19); aoqi@1: map_register(20,S4); _s4_opr=LIR_OprFact::single_cpu(20); _s4_oop_opr=LIR_OprFact::single_cpu_oop(20); aoqi@1: map_register(21,S5); _s5_opr=LIR_OprFact::single_cpu(21); _s5_oop_opr=LIR_OprFact::single_cpu_oop(21); aoqi@1: map_register(22,S6); _s6_opr=LIR_OprFact::single_cpu(22); _s6_oop_opr=LIR_OprFact::single_cpu_oop(22); aoqi@1: map_register(23,S7); _s7_opr=LIR_OprFact::single_cpu(23); _s7_oop_opr=LIR_OprFact::single_cpu_oop(23); aoqi@1: map_register(24,T8); _t8_opr=LIR_OprFact::single_cpu(24); aoqi@1: map_register(25,T9); _t9_opr=LIR_OprFact::single_cpu(25); aoqi@1: map_register(26,K0); _k0_opr=LIR_OprFact::single_cpu(26); aoqi@1: map_register(27,K1); _k1_opr=LIR_OprFact::single_cpu(27); aoqi@1: map_register(28,GP); _gp_opr=LIR_OprFact::single_cpu(28); aoqi@1: map_register(29,SP); aoqi@1: #ifdef _LP64 aoqi@1: _sp_opr=LIR_OprFact::double_cpu(29, 29); aoqi@1: #else aoqi@1: _sp_opr=LIR_OprFact::single_cpu(29); aoqi@1: #endif aoqi@1: aoqi@1: map_register(30,FP); _fp_opr=LIR_OprFact::single_cpu(30); aoqi@1: map_register(31,RA); _ra_opr=LIR_OprFact::single_cpu(31); aoqi@1: aoqi@1: /* aoqi@1: _caller_save_cpu_regs[0] = _v0_opr; aoqi@1: _caller_save_cpu_regs[1] = _v1_opr; aoqi@1: _caller_save_cpu_regs[2] = _a0_opr; aoqi@1: _caller_save_cpu_regs[3] = _a1_opr; aoqi@1: _caller_save_cpu_regs[4] = _a2_opr; aoqi@1: _caller_save_cpu_regs[5] = _a3_opr; aoqi@1: _caller_save_cpu_regs[6] = _t0_opr; aoqi@1: _caller_save_cpu_regs[7] = _t1_opr; aoqi@1: _caller_save_cpu_regs[8] = _t2_opr; aoqi@1: _caller_save_cpu_regs[9] = _t3_opr; aoqi@1: _caller_save_cpu_regs[10] = _t4_opr; aoqi@1: _caller_save_cpu_regs[11] = _t5_opr; aoqi@1: _caller_save_cpu_regs[12] = _t6_opr; aoqi@1: _caller_save_cpu_regs[13] = _t7_opr; aoqi@1: _caller_save_cpu_regs[14] = _s0_opr; aoqi@1: _caller_save_cpu_regs[15] = _s1_opr; aoqi@1: _caller_save_cpu_regs[16] = _s2_opr; aoqi@1: _caller_save_cpu_regs[17] = _s3_opr; aoqi@1: _caller_save_cpu_regs[18] = _s4_opr; aoqi@1: _caller_save_cpu_regs[19] = _s5_opr; aoqi@1: _caller_save_cpu_regs[20] = _s6_opr; aoqi@1: _caller_save_cpu_regs[21] = _s7_opr; aoqi@1: _caller_save_cpu_regs[22] = _v0_opr; aoqi@1: _caller_save_cpu_regs[23] = _v1_opr; aoqi@1: */ aoqi@1: _caller_save_cpu_regs[0] = _t0_opr; aoqi@1: _caller_save_cpu_regs[1] = _t1_opr; aoqi@1: _caller_save_cpu_regs[2] = _t2_opr; aoqi@1: _caller_save_cpu_regs[3] = _t3_opr; aoqi@1: #ifndef _LP64 aoqi@1: _caller_save_cpu_regs[4] = _t4_opr; aoqi@1: _caller_save_cpu_regs[5] = _t5_opr; aoqi@1: _caller_save_cpu_regs[6] = _t6_opr; aoqi@1: _caller_save_cpu_regs[7] = _t7_opr; aoqi@1: #else aoqi@1: _caller_save_cpu_regs[4] = _a4_opr; aoqi@1: _caller_save_cpu_regs[5] = _a5_opr; aoqi@1: _caller_save_cpu_regs[6] = _a6_opr; aoqi@1: _caller_save_cpu_regs[7] = _a7_opr; aoqi@1: #endif aoqi@1: _caller_save_cpu_regs[8] = _s0_opr; aoqi@1: _caller_save_cpu_regs[9] = _s1_opr; aoqi@1: _caller_save_cpu_regs[10] = _s2_opr; aoqi@1: _caller_save_cpu_regs[11] = _s3_opr; aoqi@1: _caller_save_cpu_regs[12] = _s4_opr; aoqi@1: _caller_save_cpu_regs[13] = _s5_opr; aoqi@1: _caller_save_cpu_regs[14] = _s6_opr; aoqi@1: _caller_save_cpu_regs[15] = _s7_opr; aoqi@1: _caller_save_cpu_regs[16] = _v0_opr; aoqi@1: _caller_save_cpu_regs[17] = _v1_opr; aoqi@1: aoqi@1: aoqi@1: _caller_save_fpu_regs[0] = LIR_OprFact::single_fpu(0); aoqi@1: _caller_save_fpu_regs[1] = LIR_OprFact::single_fpu(1); aoqi@1: _caller_save_fpu_regs[2] = LIR_OprFact::single_fpu(2); aoqi@1: _caller_save_fpu_regs[3] = LIR_OprFact::single_fpu(3); aoqi@1: _caller_save_fpu_regs[4] = LIR_OprFact::single_fpu(4); aoqi@1: _caller_save_fpu_regs[5] = LIR_OprFact::single_fpu(5); aoqi@1: _caller_save_fpu_regs[6] = LIR_OprFact::single_fpu(6); aoqi@1: _caller_save_fpu_regs[7] = LIR_OprFact::single_fpu(7); aoqi@1: _caller_save_fpu_regs[8] = LIR_OprFact::single_fpu(8); aoqi@1: _caller_save_fpu_regs[9] = LIR_OprFact::single_fpu(9); aoqi@1: _caller_save_fpu_regs[10] = LIR_OprFact::single_fpu(10); aoqi@1: _caller_save_fpu_regs[11] = LIR_OprFact::single_fpu(11); aoqi@1: _caller_save_fpu_regs[12] = LIR_OprFact::single_fpu(12); aoqi@1: _caller_save_fpu_regs[13] = LIR_OprFact::single_fpu(13); aoqi@1: _caller_save_fpu_regs[14] = LIR_OprFact::single_fpu(14); aoqi@1: _caller_save_fpu_regs[15] = LIR_OprFact::single_fpu(15); aoqi@1: #ifdef _LP64 aoqi@1: _caller_save_fpu_regs[16] = LIR_OprFact::single_fpu(16); aoqi@1: _caller_save_fpu_regs[17] = LIR_OprFact::single_fpu(17); aoqi@1: _caller_save_fpu_regs[18] = LIR_OprFact::single_fpu(18); aoqi@1: _caller_save_fpu_regs[19] = LIR_OprFact::single_fpu(19); aoqi@1: _caller_save_fpu_regs[20] = LIR_OprFact::single_fpu(20); aoqi@1: _caller_save_fpu_regs[21] = LIR_OprFact::single_fpu(21); aoqi@1: _caller_save_fpu_regs[22] = LIR_OprFact::single_fpu(22); aoqi@1: _caller_save_fpu_regs[23] = LIR_OprFact::single_fpu(23); aoqi@1: _caller_save_fpu_regs[24] = LIR_OprFact::single_fpu(24); aoqi@1: _caller_save_fpu_regs[25] = LIR_OprFact::single_fpu(25); aoqi@1: _caller_save_fpu_regs[26] = LIR_OprFact::single_fpu(26); aoqi@1: _caller_save_fpu_regs[27] = LIR_OprFact::single_fpu(27); aoqi@1: _caller_save_fpu_regs[28] = LIR_OprFact::single_fpu(28); aoqi@1: _caller_save_fpu_regs[29] = LIR_OprFact::single_fpu(29); aoqi@1: _caller_save_fpu_regs[30] = LIR_OprFact::single_fpu(30); aoqi@1: _caller_save_fpu_regs[31] = LIR_OprFact::single_fpu(31); aoqi@1: #endif aoqi@1: /* aoqi@1: _caller_save_fpu_regs[0] = LIR_OprFact::single_fpu(0); aoqi@1: _caller_save_fpu_regs[1] = LIR_OprFact::single_fpu(2); aoqi@1: _caller_save_fpu_regs[2] = LIR_OprFact::single_fpu(4); aoqi@1: _caller_save_fpu_regs[3] = LIR_OprFact::single_fpu(6); aoqi@1: _caller_save_fpu_regs[4] = LIR_OprFact::single_fpu(8); aoqi@1: _caller_save_fpu_regs[5] = LIR_OprFact::single_fpu(10); aoqi@1: _caller_save_fpu_regs[6] = LIR_OprFact::single_fpu(12); aoqi@1: _caller_save_fpu_regs[7] = LIR_OprFact::single_fpu(14); aoqi@1: _caller_save_fpu_regs[8] = LIR_OprFact::single_fpu(16); aoqi@1: _caller_save_fpu_regs[9] = LIR_OprFact::single_fpu(18); aoqi@1: _caller_save_fpu_regs[10] = LIR_OprFact::single_fpu(20); aoqi@1: _caller_save_fpu_regs[11] = LIR_OprFact::single_fpu(22); aoqi@1: _caller_save_fpu_regs[12] = LIR_OprFact::single_fpu(24); aoqi@1: _caller_save_fpu_regs[13] = LIR_OprFact::single_fpu(26); aoqi@1: _caller_save_fpu_regs[14] = LIR_OprFact::single_fpu(28); aoqi@1: _caller_save_fpu_regs[15] = LIR_OprFact::single_fpu(30); aoqi@1: */ aoqi@1: aoqi@1: for (int i = 0; i < 32; i++) { aoqi@1: _fpu_regs[i] = as_FloatRegister(i); aoqi@1: } aoqi@1: aoqi@1: #ifndef _LP64 aoqi@1: _a0_a1_long_opr=LIR_OprFact::double_cpu(4/*a0*/,5/*a1*/); aoqi@1: _a2_a3_long_opr=LIR_OprFact::double_cpu(6/*a2*/,7/*a3*/); aoqi@1: _v0_v1_long_opr=LIR_OprFact::double_cpu(2/*v0*/,3/*v1*/); aoqi@1: #else aoqi@1: _a0_a1_long_opr=LIR_OprFact::double_cpu(4/*a0*/,4/*a0*/); aoqi@1: _a2_a3_long_opr=LIR_OprFact::double_cpu(6/*a2*/,6/*a2*/); aoqi@1: _v0_v1_long_opr=LIR_OprFact::double_cpu(2/*v0*/,2/*v0*/); aoqi@1: #endif aoqi@1: _f0_float_opr =LIR_OprFact::single_fpu(0/*f0*/); aoqi@1: _f12_float_opr =LIR_OprFact::single_fpu(12/*f12*/); aoqi@1: _f14_float_opr =LIR_OprFact::single_fpu(14/*f14*/); aoqi@1: _d0_double_opr =LIR_OprFact::double_fpu(0/*f0*/); aoqi@1: _d12_double_opr=LIR_OprFact::double_fpu(12/*f12*/); aoqi@1: _d14_double_opr=LIR_OprFact::double_fpu(14/*f14*/); aoqi@1: aoqi@1: aoqi@1: _init_done = true; aoqi@1: aoqi@1: VMRegPair regs; aoqi@1: BasicType sig_bt = T_OBJECT; aoqi@1: SharedRuntime::java_calling_convention(&sig_bt, ®s, 1, true); aoqi@1: aoqi@1: receiver_opr = as_oop_opr(regs.first()->as_Register()); aoqi@1: assert(receiver_opr == _t0_oop_opr, "rcvr ought to be t0"); aoqi@1: aoqi@1: } aoqi@1: aoqi@1: aoqi@1: Address FrameMap::make_new_address(ByteSize sp_offset) const { aoqi@1: return Address(SP, in_bytes(sp_offset)); aoqi@1: } aoqi@1: aoqi@1: aoqi@1: // ----------------mapping----------------------- aoqi@1: // all mapping is based on rbp, addressing, except for simple leaf methods where we access aoqi@1: // the locals rsp based (and no frame is built) aoqi@1: aoqi@1: aoqi@1: // Frame for simple leaf methods (quick entries) aoqi@1: // aoqi@1: // +----------+ aoqi@1: // | ret addr | <- TOS aoqi@1: // +----------+ aoqi@1: // | args | aoqi@1: // | ...... | aoqi@1: aoqi@1: // Frame for standard methods aoqi@1: // aoqi@1: // | .........| <- TOS aoqi@1: // | locals | aoqi@1: // +----------+ aoqi@1: // | old rbp, | <- EBP aoqi@1: // +----------+ aoqi@1: // | ret addr | aoqi@1: // +----------+ aoqi@1: // | args | aoqi@1: // | .........| aoqi@1: aoqi@1: aoqi@1: // For OopMaps, map a local variable or spill index to an VMRegImpl name. aoqi@1: // This is the offset from sp() in the frame of the slot for the index, aoqi@1: // skewed by VMRegImpl::stack0 to indicate a stack location (vs.a register.) aoqi@1: // aoqi@1: // framesize + aoqi@1: // stack0 stack0 0 <- VMReg aoqi@1: // | | | aoqi@1: // ...........|..............|.............| aoqi@1: // 0 1 2 3 x x 4 5 6 ... | <- local indices aoqi@1: // ^ ^ sp() ( x x indicate link aoqi@1: // | | and return addr) aoqi@1: // arguments non-argument locals aoqi@1: aoqi@1: VMReg FrameMap::fpu_regname (int n) { aoqi@1: // Return the OptoReg name for the fpu stack slot "n" aoqi@1: // A spilled fpu stack slot comprises to two single-word OptoReg's. aoqi@1: return as_FloatRegister(n)->as_VMReg(); aoqi@1: } aoqi@1: aoqi@1: LIR_Opr FrameMap::stack_pointer() { aoqi@1: //return FrameMap::esp_opr; aoqi@1: return FrameMap::_sp_opr; aoqi@1: } aoqi@1: aoqi@1: // JSR 292 aoqi@1: LIR_Opr FrameMap::method_handle_invoke_SP_save_opr() { aoqi@1: assert(SP == mh_SP_save, "must be same register"); aoqi@1: return _sp_opr; aoqi@1: } aoqi@1: aoqi@1: bool FrameMap::validate_frame() { aoqi@1: return true; aoqi@1: } aoqi@1: aoqi@1: