regalloc.cpp revision 0:a61af66fc99e
1139804Simp/* 248391Speter * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. 348391Speter * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 448391Speter * 548391Speter * This code is free software; you can redistribute it and/or modify it 648391Speter * under the terms of the GNU General Public License version 2 only, as 748391Speter * published by the Free Software Foundation. 848391Speter * 948391Speter * This code is distributed in the hope that it will be useful, but WITHOUT 1048391Speter * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1148391Speter * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1248391Speter * version 2 for more details (a copy is included in the LICENSE file that 1348391Speter * accompanied this code). 1448391Speter * 1548391Speter * You should have received a copy of the GNU General Public License version 1648391Speter * 2 along with this work; if not, write to the Free Software Foundation, 1748391Speter * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1848391Speter * 1948391Speter * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 2048391Speter * CA 95054 USA or visit www.sun.com if you need additional information or 2148391Speter * have any questions. 2248391Speter * 2348391Speter */ 2448391Speter 2548391Speter#include "incls/_precompiled.incl" 2648391Speter#include "incls/_regalloc.cpp.incl" 27116182Sobrien 28116182Sobrienstatic const int NodeRegsOverflowSize = 200; 29116182Sobrien 3048391Spetervoid (*PhaseRegAlloc::_alloc_statistics[MAX_REG_ALLOCATORS])(); 3148391Speterint PhaseRegAlloc::_num_allocators = 0; 3248391Speter#ifndef PRODUCT 3370317Sjakeint PhaseRegAlloc::_total_framesize = 0; 3474927Sjhbint PhaseRegAlloc::_max_framesize = 0; 3574927Sjhb#endif 3655722Simp 3755539SluoqiPhaseRegAlloc::PhaseRegAlloc( uint unique, PhaseCFG &cfg, 3874927Sjhb Matcher &matcher, 3948391Speter void (*pr_stats)() ): 4048391Speter Phase(Register_Allocation), _cfg(cfg), _matcher(matcher), 41166188Sjeff _node_oops(Thread::current()->resource_area()), 42173004Sjulian _node_regs(0), 43173004Sjulian _framesize(0xdeadbeef) 4448391Speter{ 4548391Speter int i; 4648391Speter 4748391Speter for (i=0; i < _num_allocators; i++) { 4848391Speter if (_alloc_statistics[i] == pr_stats) 4948391Speter return; 5048391Speter } 5148391Speter assert((_num_allocators + 1) < MAX_REG_ALLOCATORS, "too many register allocators"); 5248391Speter _alloc_statistics[_num_allocators++] = pr_stats; 5348391Speter} 5448391Speter 5548391Speter 5648391Speter//------------------------------reg2offset------------------------------------- 5748391Speterint PhaseRegAlloc::reg2offset_unchecked( OptoReg::Name reg ) const { 5848391Speter // Slots below _max_in_arg_stack_reg are offset by the entire frame. 5948391Speter // Slots above _max_in_arg_stack_reg are frame_slots and are not offset. 6048391Speter int slot = (reg < _matcher._new_SP) 61172836Sjulian ? reg - OptoReg::stack0() + _framesize 62104354Sscottl : reg - _matcher._new_SP; 6348391Speter // Note: We use the direct formula (reg - SharedInfo::stack0) instead of 6448391Speter // OptoReg::reg2stack(reg), in order to avoid asserts in the latter 6548391Speter // function. This routine must remain unchecked, so that dump_frame() 6648391Speter // can do its work undisturbed. 6748391Speter // %%% not really clear why reg2stack would assert here 6865557Sjasone 6948391Speter return slot*VMRegImpl::stack_slot_size; 7065557Sjasone} 7165557Sjasone 7265557Sjasoneint PhaseRegAlloc::reg2offset( OptoReg::Name reg ) const { 7365557Sjasone 7465557Sjasone // Not allowed in the out-preserve area. 7565557Sjasone // In-preserve area is allowed so Intel can fetch the return pc out. 7648391Speter assert( reg < _matcher._old_SP || 7748391Speter (reg >= OptoReg::add(_matcher._old_SP,C->out_preserve_stack_slots()) && 78172836Sjulian reg < _matcher._in_arg_limit) || 79104354Sscottl reg >= OptoReg::add(_matcher._new_SP,C->out_preserve_stack_slots()), 8048391Speter "register allocated in a preserve area" ); 8148391Speter return reg2offset_unchecked( reg ); 8248391Speter} 83103216Sjulian 8448391Speter//------------------------------offset2reg------------------------------------- 8548391SpeterOptoReg::Name PhaseRegAlloc::offset2reg(int stk_offset) const { 86114434Sdes int slot = stk_offset / jintSize; 87172836Sjulian int reg = (slot < (int) _framesize) 8865557Sjasone ? slot + _matcher._new_SP 8990375Speter : OptoReg::stack2reg(slot) - _framesize; 90104354Sscottl assert(stk_offset == reg2offset((OptoReg::Name) reg), 9148391Speter "offset2reg does not invert properly"); 9248391Speter return (OptoReg::Name) reg; 9348391Speter} 9448391Speter 9548391Speter//------------------------------set_oop---------------------------------------- 9648391Spetervoid PhaseRegAlloc::set_oop( const Node *n, bool is_an_oop ) { 9748391Speter if( is_an_oop ) { 9848391Speter _node_oops.set(n->_idx); 9971559Sjhb } 100173004Sjulian} 10171559Sjhb 102173004Sjulian//------------------------------is_oop----------------------------------------- 103114983Sjhbbool PhaseRegAlloc::is_oop( const Node *n ) const { 104114983Sjhb return _node_oops.test(n->_idx) != 0; 105114983Sjhb} 10671559Sjhb 10748391Speter// Allocate _node_regs table with at least "size" elements 10848391Spetervoid PhaseRegAlloc::alloc_node_regs(int size) { 10948391Speter _node_regs_max_index = size + (size >> 1) + NodeRegsOverflowSize; 11048391Speter _node_regs = NEW_RESOURCE_ARRAY( OptoRegPair, _node_regs_max_index ); 11148391Speter // We assume our caller will fill in all elements up to size-1, so 112173004Sjulian // only the extra space we allocate is initialized here. 113173004Sjulian for( uint i = size; i < _node_regs_max_index; ++i ) 114173004Sjulian _node_regs[i].set_bad(); 115173004Sjulian} 11648391Speter 11748391Speter#ifndef PRODUCT 118103216Sjulianvoid 119103216SjulianPhaseRegAlloc::print_statistics() { 12048391Speter tty->print_cr("Total frameslots = %d, Max frameslots = %d", _total_framesize, _max_framesize); 12169657Sjhb int i; 12269657Sjhb 123170307Sjeff for (i=0; i < _num_allocators; i++) { 124166188Sjeff _alloc_statistics[i](); 125170307Sjeff } 12669657Sjhb} 12769657Sjhb#endif 12848391Speter