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