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