00001 /* Copyright 1994, LongView Technologies L.L.C. $Revision: 1.5 $ */ 00002 /* Copyright (c) 2006, Sun Microsystems, Inc. 00003 All rights reserved. 00004 00005 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the 00006 following conditions are met: 00007 00008 * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 00009 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following 00010 disclaimer in the documentation and/or other materials provided with the distribution. 00011 * Neither the name of Sun Microsystems nor the names of its contributors may be used to endorse or promote products derived 00012 from this software without specific prior written permission. 00013 00014 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT 00015 NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 00016 THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 00017 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00018 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 00019 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE 00020 00021 00022 */ 00023 00024 // A RegisterMask tells the scavenger which registers / stack locs are 00025 // live. (One bit per location.) 00026 00027 # ifdef DELTA_COMPILER_unused 00028 00029 inline RegisterMask& allocate(RegisterMask& s1, RegisterMask s2) { 00030 setBits(s1, s2); 00031 return s1; 00032 } 00033 00034 inline bool isAllocated(RegisterMask s, Location l) { 00035 Unimplemented(); 00036 // return isSet(s, l); 00037 return false; 00038 } 00039 00040 inline RegisterMask& deallocate(RegisterMask& s1, RegisterMask s2) { 00041 clearBits(s1, s2); 00042 return s1; 00043 } 00044 00045 inline RegisterMask& allocateRegister(RegisterMask& s, Location r) { 00046 Unimplemented(); 00047 // if (isRegister(r)) setNth(s, r); 00048 return s; 00049 } 00050 00051 inline RegisterMask& deallocateRegister(RegisterMask& s1, Location r) { 00052 Unimplemented(); 00053 // assert(isRegister(r), "not a register"); 00054 // clearNth(s1, r); 00055 return s1; 00056 } 00057 00058 Location pick(RegisterMask& alloc, RegisterMask mask = ~0); 00059 00060 void printRegister(Location r); 00061 void printAllocated(RegisterMask r); 00062 00063 // like a RegisterMask, but has arbitrary length (i.e., bits for 00064 // stack temps and regs) 00065 00066 class LongRegisterMask : ResourceObj { 00067 BitVector* bv; 00068 public: 00069 LongRegisterMask(); 00070 void allocate (Location l); 00071 void deallocate(Location l); 00072 bool isAllocated(Location l); 00073 RegisterMask regs(); // returns mask for registers 00074 void print(); 00075 00076 private: 00077 void grow(); 00078 friend int findFirstUnused(LongRegisterMask** masks, int len, 00079 int start); 00080 }; 00081 00082 Location findFirstUnusedTemp(LongRegisterMask** masks, int len); 00083 # endif 00084