Ralloc.h revision 6a55513b0d268bc0721834050a3698316854fa0a
15d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* 25d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Copyright (C) 2009 The Android Open Source Project 35d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * 45d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 55d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * you may not use this file except in compliance with the License. 65d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * You may obtain a copy of the License at 75d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * 85d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * http://www.apache.org/licenses/LICENSE-2.0 95d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * 105d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Unless required by applicable law or agreed to in writing, software 115d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * distributed under the License is distributed on an "AS IS" BASIS, 125d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * See the License for the specific language governing permissions and 145d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * limitations under the License. 155d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */ 165d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 175d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* 185d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * This file contains register alloction support and is intended to be 195d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * included by: 205d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * 215d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Codegen-$(TARGET_ARCH_VARIANT).c 225d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * 235d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */ 245d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 255d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng#include "compiler/CompilerUtility.h" 265d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng#include "compiler/CompilerIR.h" 275d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng#include "compiler/Dataflow.h" 285d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng#include "compiler/codegen/arm/ArmLIR.h" 295d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 30c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeestatic inline int dvmCompilerS2VReg(CompilationUnit *cUnit, int sReg) 315d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng{ 325d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng assert(sReg != INVALID_SREG); 335d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng return DECODE_REG(dvmConvertSSARegToDalvik(cUnit, sReg)); 345d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng} 355d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 365d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Reset the tracker to unknown state */ 37c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeestatic inline void dvmCompilerResetNullCheck(CompilationUnit *cUnit) 385d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng{ 395d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng dvmClearAllBits(cUnit->regPool->nullCheckedRegs); 405d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng} 415d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 425d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* 435d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Get the "real" sreg number associated with an sReg slot. In general, 445d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * sReg values passed through codegen are the SSA names created by 455d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * dataflow analysis and refer to slot numbers in the cUnit->regLocation 465d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * array. However, renaming is accomplished by simply replacing RegLocation 475d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * entries in the cUnit->reglocation[] array. Therefore, when location 485d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * records for operands are first created, we need to ask the locRecord 495d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * identified by the dataflow pass what it's new name is. 505d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */ 515d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 52c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeestatic inline int dvmCompilerSRegHi(int lowSreg) { 535d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng return (lowSreg == INVALID_SREG) ? INVALID_SREG : lowSreg + 1; 545d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng} 555d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 565d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 57c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeestatic inline bool dvmCompilerLiveOut(CompilationUnit *cUnit, int sReg) 585d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng{ 595d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng //TODO: fully implement 605d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng return true; 615d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng} 625d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 63c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeestatic inline int dvmCompilerSSASrc(MIR *mir, int num) 645d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng{ 655d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng assert(mir->ssaRep->numUses > num); 665d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng return mir->ssaRep->uses[num]; 675d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng} 685d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 69c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerEvalLoc(CompilationUnit *cUnit, RegLocation loc, 70c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee int regClass, bool update); 715d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Mark a temp register as dead. Does not affect allocation state. */ 72c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerClobber(CompilationUnit *cUnit, int reg); 735d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 74c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerUpdateLoc(CompilationUnit *cUnit, 75c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee RegLocation loc); 765d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 775d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* see comments for updateLoc */ 78c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerUpdateLocWide(CompilationUnit *cUnit, 79c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee RegLocation loc); 805d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 815d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Clobber all of the temps that might be used by a handler. */ 82c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerClobberHandlerRegs(CompilationUnit *cUnit); 835d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 84c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerMarkLive(CompilationUnit *cUnit, int reg, int sReg); 855d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 86c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerMarkDirty(CompilationUnit *cUnit, int reg); 875d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 88c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerMarkPair(CompilationUnit *cUnit, int lowReg, 89c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee int highReg); 905d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 91c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerMarkClean(CompilationUnit *cUnit, int reg); 925d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 93c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerResetDef(CompilationUnit *cUnit, int reg); 945d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 95c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerResetDefLoc(CompilationUnit *cUnit, RegLocation rl); 965d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 975d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Set up temp & preserved register pools specialized by target */ 98c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerInitPool(RegisterInfo *regs, int *regNums, int num); 995d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 1005d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* 1015d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Mark the beginning and end LIR of a def sequence. Note that 1025d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * on entry start points to the LIR prior to the beginning of the 1035d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * sequence. 1045d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */ 105c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerMarkDef(CompilationUnit *cUnit, RegLocation rl, 106c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee LIR *start, LIR *finish); 1075d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* 1085d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Mark the beginning and end LIR of a def sequence. Note that 1095d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * on entry start points to the LIR prior to the beginning of the 1105d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * sequence. 1115d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */ 112c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerMarkDefWide(CompilationUnit *cUnit, RegLocation rl, 113c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee LIR *start, LIR *finish); 1145d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 115c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetSrcWide(CompilationUnit *cUnit, MIR *mir, 1165d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng int low, int high); 1175d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 118c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetDestWide(CompilationUnit *cUnit, MIR *mir, 119c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee int low, int high); 1205d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng// Get the LocRecord associated with an SSA name use. 121c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetSrc(CompilationUnit *cUnit, MIR *mir, int num); 1225d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 1235d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng// Get the LocRecord associated with an SSA name def. 124c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetDest(CompilationUnit *cUnit, MIR *mir, 125c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee int num); 1265d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 127c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetReturnWide(CompilationUnit *cUnit); 1285d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 1295d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Clobber all regs that might be used by an external C call */ 1306a55513b0d268bc0721834050a3698316854fa0aElliott Hughesextern void dvmCompilerClobberCallRegs(CompilationUnit *cUnit); 1315d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 132c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegisterInfo *dvmCompilerIsTemp(CompilationUnit *cUnit, int reg); 1335d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 1346a55513b0d268bc0721834050a3698316854fa0aElliott Hughesextern void dvmCompilerMarkInUse(CompilationUnit *cUnit, int reg); 1355d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 136c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern int dvmCompilerAllocTemp(CompilationUnit *cUnit); 1375d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 138c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern int dvmCompilerAllocTempFloat(CompilationUnit *cUnit); 1395d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 1405d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng//REDO: too many assumptions. 141c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern int dvmCompilerAllocTempDouble(CompilationUnit *cUnit); 1425d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 143c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerFreeTemp(CompilationUnit *cUnit, int reg); 1445d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 145c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerResetDefLocWide(CompilationUnit *cUnit, RegLocation rl); 1465d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 147c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerResetDefTracking(CompilationUnit *cUnit); 1485d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 1495d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Kill the corresponding bit in the null-checked register list */ 150c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerKillNullCheckedLoc(CompilationUnit *cUnit, 151c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee RegLocation loc); 1525d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 1535d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng//FIXME - this needs to also check the preserved pool. 154c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegisterInfo *dvmCompilerIsLive(CompilationUnit *cUnit, int reg); 1555d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 1565d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* To be used when explicitly managing register use */ 157c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerLockAllTemps(CompilationUnit *cUnit); 1585d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 159c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerFlushAllRegs(CompilationUnit *cUnit); 1605d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 161c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetReturnWideAlt(CompilationUnit *cUnit); 1625d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 163c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetReturn(CompilationUnit *cUnit); 1645d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 165c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetReturnAlt(CompilationUnit *cUnit); 1665d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 1675d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Clobber any temp associated with an sReg. Could be in either class */ 168c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerClobberSReg(CompilationUnit *cUnit, int sReg); 1695d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 1705d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Return a temp if one is available, -1 otherwise */ 171c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern int dvmCompilerAllocFreeTemp(CompilationUnit *cUnit); 1725d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 1735d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* 174c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee * Similar to dvmCompilerAllocTemp(), but forces the allocation of a specific 1755d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * register. No check is made to see if the register was previously 1765d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * allocated. Use with caution. 1775d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */ 178c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerLockTemp(CompilationUnit *cUnit, int reg); 1795d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 180c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerWideToNarrow(CompilationUnit *cUnit, 181c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee RegLocation rl); 1825d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 1835d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* 1845d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Free all allocated temps in the temp pools. Note that this does 1855d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * not affect the "liveness" of a temp register, which will stay 1865d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * live until it is either explicitly killed or reallocated. 1875d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */ 188c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerResetRegPool(CompilationUnit *cUnit); 1895d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 190c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerClobberAllRegs(CompilationUnit *cUnit); 1915d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng 192c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerResetDefTracking(CompilationUnit *cUnit); 193