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/*
18f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee * This file contains target independent register alloction support.
195d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */
205d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
215d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng#include "compiler/CompilerUtility.h"
225d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng#include "compiler/CompilerIR.h"
235d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng#include "compiler/Dataflow.h"
245d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng#include "compiler/codegen/arm/ArmLIR.h"
255d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
26749e8162846b9dec5418d4d8f2334e683af81d52Bill Buzbee/*
27749e8162846b9dec5418d4d8f2334e683af81d52Bill Buzbee * Return most flexible allowed register class based on size.
28749e8162846b9dec5418d4d8f2334e683af81d52Bill Buzbee * Bug: 2813841
29749e8162846b9dec5418d4d8f2334e683af81d52Bill Buzbee * Must use a core register for data types narrower than word (due
30749e8162846b9dec5418d4d8f2334e683af81d52Bill Buzbee * to possible unaligned load/store.
31749e8162846b9dec5418d4d8f2334e683af81d52Bill Buzbee */
32749e8162846b9dec5418d4d8f2334e683af81d52Bill Buzbeestatic inline RegisterClass dvmCompilerRegClassBySize(OpSize size)
33749e8162846b9dec5418d4d8f2334e683af81d52Bill Buzbee{
34749e8162846b9dec5418d4d8f2334e683af81d52Bill Buzbee    return (size == kUnsignedHalf ||
35749e8162846b9dec5418d4d8f2334e683af81d52Bill Buzbee            size == kSignedHalf ||
36749e8162846b9dec5418d4d8f2334e683af81d52Bill Buzbee            size == kUnsignedByte ||
37749e8162846b9dec5418d4d8f2334e683af81d52Bill Buzbee            size == kSignedByte ) ? kCoreReg : kAnyReg;
38749e8162846b9dec5418d4d8f2334e683af81d52Bill Buzbee}
39749e8162846b9dec5418d4d8f2334e683af81d52Bill Buzbee
40c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeestatic inline int dvmCompilerS2VReg(CompilationUnit *cUnit, int sReg)
415d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng{
425d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng    assert(sReg != INVALID_SREG);
435d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng    return DECODE_REG(dvmConvertSSARegToDalvik(cUnit, sReg));
445d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng}
455d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
465d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Reset the tracker to unknown state */
47c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeestatic inline void dvmCompilerResetNullCheck(CompilationUnit *cUnit)
485d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng{
495d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng    dvmClearAllBits(cUnit->regPool->nullCheckedRegs);
505d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng}
515d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
525d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/*
535d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Get the "real" sreg number associated with an sReg slot.  In general,
545d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * sReg values passed through codegen are the SSA names created by
555d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * dataflow analysis and refer to slot numbers in the cUnit->regLocation
565d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * array.  However, renaming is accomplished by simply replacing RegLocation
575d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * entries in the cUnit->reglocation[] array.  Therefore, when location
585d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * records for operands are first created, we need to ask the locRecord
595d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * identified by the dataflow pass what it's new name is.
605d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */
615d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
62c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeestatic inline int dvmCompilerSRegHi(int lowSreg) {
635d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng    return (lowSreg == INVALID_SREG) ? INVALID_SREG : lowSreg + 1;
645d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng}
655d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
665d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
67c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeestatic inline bool dvmCompilerLiveOut(CompilationUnit *cUnit, int sReg)
685d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng{
695d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng    //TODO: fully implement
705d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng    return true;
715d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng}
725d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
73c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeestatic inline int dvmCompilerSSASrc(MIR *mir, int num)
745d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng{
755d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng    assert(mir->ssaRep->numUses > num);
765d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng    return mir->ssaRep->uses[num];
775d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng}
785d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
79c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerEvalLoc(CompilationUnit *cUnit, RegLocation loc,
80c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee                                      int regClass, bool update);
815d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Mark a temp register as dead.  Does not affect allocation state. */
82c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerClobber(CompilationUnit *cUnit, int reg);
835d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
84c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerUpdateLoc(CompilationUnit *cUnit,
85c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee                                        RegLocation loc);
865d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
875d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* see comments for updateLoc */
88c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerUpdateLocWide(CompilationUnit *cUnit,
89c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee                                            RegLocation loc);
905d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
915d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Clobber all of the temps that might be used by a handler. */
92c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerClobberHandlerRegs(CompilationUnit *cUnit);
935d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
94c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerMarkLive(CompilationUnit *cUnit, int reg, int sReg);
955d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
96c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerMarkDirty(CompilationUnit *cUnit, int reg);
975d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
98c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerMarkPair(CompilationUnit *cUnit, int lowReg,
99c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee                                int highReg);
1005d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
101c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerMarkClean(CompilationUnit *cUnit, int reg);
1025d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
103c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerResetDef(CompilationUnit *cUnit, int reg);
1045d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
105c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerResetDefLoc(CompilationUnit *cUnit, RegLocation rl);
1065d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
1075d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Set up temp & preserved register pools specialized by target */
108c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerInitPool(RegisterInfo *regs, int *regNums, int num);
1095d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
1105d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/*
1115d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Mark the beginning and end LIR of a def sequence.  Note that
1125d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * on entry start points to the LIR prior to the beginning of the
1135d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * sequence.
1145d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */
115c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerMarkDef(CompilationUnit *cUnit, RegLocation rl,
116c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee                               LIR *start, LIR *finish);
1175d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/*
1185d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Mark the beginning and end LIR of a def sequence.  Note that
1195d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * on entry start points to the LIR prior to the beginning of the
1205d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * sequence.
1215d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */
122c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerMarkDefWide(CompilationUnit *cUnit, RegLocation rl,
123c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee                                   LIR *start, LIR *finish);
1245d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
125c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetSrcWide(CompilationUnit *cUnit, MIR *mir,
1265d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng                                         int low, int high);
1275d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
128c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetDestWide(CompilationUnit *cUnit, MIR *mir,
129c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee                                          int low, int high);
1305d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng// Get the LocRecord associated with an SSA name use.
131c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetSrc(CompilationUnit *cUnit, MIR *mir, int num);
1325d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
1335d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng// Get the LocRecord associated with an SSA name def.
134c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetDest(CompilationUnit *cUnit, MIR *mir,
135c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee                                      int num);
1365d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
137c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetReturnWide(CompilationUnit *cUnit);
1385d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
1395d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Clobber all regs that might be used by an external C call */
1406a55513b0d268bc0721834050a3698316854fa0aElliott Hughesextern void dvmCompilerClobberCallRegs(CompilationUnit *cUnit);
1415d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
142c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegisterInfo *dvmCompilerIsTemp(CompilationUnit *cUnit, int reg);
1435d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
1446a55513b0d268bc0721834050a3698316854fa0aElliott Hughesextern void dvmCompilerMarkInUse(CompilationUnit *cUnit, int reg);
1455d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
146c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern int dvmCompilerAllocTemp(CompilationUnit *cUnit);
1475d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
148c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern int dvmCompilerAllocTempFloat(CompilationUnit *cUnit);
1495d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
1505d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng//REDO: too many assumptions.
151c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern int dvmCompilerAllocTempDouble(CompilationUnit *cUnit);
1525d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
153c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerFreeTemp(CompilationUnit *cUnit, int reg);
1545d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
155c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerResetDefLocWide(CompilationUnit *cUnit, RegLocation rl);
1565d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
157c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerResetDefTracking(CompilationUnit *cUnit);
1585d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
1595d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Kill the corresponding bit in the null-checked register list */
160c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerKillNullCheckedLoc(CompilationUnit *cUnit,
161c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee                                          RegLocation loc);
1625d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
1635d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng//FIXME - this needs to also check the preserved pool.
164c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegisterInfo *dvmCompilerIsLive(CompilationUnit *cUnit, int reg);
1655d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
1665d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* To be used when explicitly managing register use */
167c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerLockAllTemps(CompilationUnit *cUnit);
1685d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
169c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerFlushAllRegs(CompilationUnit *cUnit);
1705d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
171c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetReturnWideAlt(CompilationUnit *cUnit);
1725d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
173c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetReturn(CompilationUnit *cUnit);
1745d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
175c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerGetReturnAlt(CompilationUnit *cUnit);
1765d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
1775d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Clobber any temp associated with an sReg.  Could be in either class */
178c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerClobberSReg(CompilationUnit *cUnit, int sReg);
1795d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
1805d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/* Return a temp if one is available, -1 otherwise */
181c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern int dvmCompilerAllocFreeTemp(CompilationUnit *cUnit);
1825d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
1835d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/*
184c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee * Similar to dvmCompilerAllocTemp(), but forces the allocation of a specific
1855d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * register.  No check is made to see if the register was previously
1865d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * allocated.  Use with caution.
1875d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */
188c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerLockTemp(CompilationUnit *cUnit, int reg);
1895d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
190c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern RegLocation dvmCompilerWideToNarrow(CompilationUnit *cUnit,
191c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbee                                           RegLocation rl);
1925d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
1935d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng/*
1945d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * Free all allocated temps in the temp pools.  Note that this does
1955d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * not affect the "liveness" of a temp register, which will stay
1965d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng * live until it is either explicitly killed or reallocated.
1975d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng */
198c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerResetRegPool(CompilationUnit *cUnit);
1995d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
200c6f1066fd2dd761349128a9f422bc1ce3c3de595Bill Buzbeeextern void dvmCompilerClobberAllRegs(CompilationUnit *cUnit);
2015d90c20bd7903d7bba966b224e576bf137bf8b4bBen Cheng
202f6789277a9d25379bf43ffc39ef091db722dd5afbuzbeeextern void dvmCompilerFlushRegWide(CompilationUnit *cUnit, int reg1, int reg2);
203f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee
204f6789277a9d25379bf43ffc39ef091db722dd5afbuzbeeextern void dvmCompilerFlushReg(CompilationUnit *cUnit, int reg);
205f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee
206f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee/*
207f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee * Architecture-dependent register allocation routines implemented in
208f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee * ${TARGET_ARCH}/${TARGET_ARCH_VARIANT}/Ralloc.c
209f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee */
210f6789277a9d25379bf43ffc39ef091db722dd5afbuzbeeextern int dvmCompilerAllocTypedTempPair(CompilationUnit *cUnit,
211f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee                                         bool fpHint, int regClass);
212f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee
213f6789277a9d25379bf43ffc39ef091db722dd5afbuzbeeextern int dvmCompilerAllocTypedTemp(CompilationUnit *cUnit, bool fpHint,
214f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee                                     int regClass);
215f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee
216f6789277a9d25379bf43ffc39ef091db722dd5afbuzbeeextern ArmLIR* dvmCompilerRegCopy(CompilationUnit *cUnit, int rDest, int rSrc);
217f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee
218f6789277a9d25379bf43ffc39ef091db722dd5afbuzbeeextern void dvmCompilerRegCopyWide(CompilationUnit *cUnit, int destLo,
219f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee                                   int destHi, int srcLo, int srcHi);
220f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee
221f6789277a9d25379bf43ffc39ef091db722dd5afbuzbeeextern void dvmCompilerFlushRegImpl(CompilationUnit *cUnit, int rBase,
222f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee                                    int displacement, int rSrc, OpSize size);
223f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee
224f6789277a9d25379bf43ffc39ef091db722dd5afbuzbeeextern void dvmCompilerFlushRegWideImpl(CompilationUnit *cUnit, int rBase,
225f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee                                        int displacement, int rSrcLo,
226f6789277a9d25379bf43ffc39ef091db722dd5afbuzbee                                        int rSrcHi);
227