/* * Load a Dalvik register into a physical register. Take care when * using this routine, as it doesn't perform any bookkeeping regarding * register liveness. That is the responsibility of the caller. */ static void loadValueDirect(CompilationUnit *cUnit, RegLocation rlSrc, int reg1) { rlSrc = dvmCompilerUpdateLoc(cUnit, rlSrc); if (rlSrc.location == kLocPhysReg) { genRegCopy(cUnit, reg1, rlSrc.lowReg); } else if (rlSrc.location == kLocRetval) { loadWordDisp(cUnit, rGLUE, offsetof(InterpState, retval), reg1); } else { assert(rlSrc.location == kLocDalvikFrame); loadWordDisp(cUnit, rFP, dvmCompilerS2VReg(cUnit, rlSrc.sRegLow) << 2, reg1); } }
static void storeValue(CompilationUnit *cUnit, RegLocation rlDest, RegLocation rlSrc) { LIR *defStart; LIR *defEnd; assert(!rlDest.wide); assert(!rlSrc.wide); dvmCompilerKillNullCheckedLoc(cUnit, rlDest); rlSrc = dvmCompilerUpdateLoc(cUnit, rlSrc); rlDest = dvmCompilerUpdateLoc(cUnit, rlDest); if (rlSrc.location == kLocPhysReg) { if (dvmCompilerIsLive(cUnit, rlSrc.lowReg) || (rlDest.location == kLocPhysReg)) { // Src is live or Dest has assigned reg. rlDest = dvmCompilerEvalLoc(cUnit, rlDest, kAnyReg, false); genRegCopy(cUnit, rlDest.lowReg, rlSrc.lowReg); } else { // Just re-assign the registers. Dest gets Src's regs rlDest.lowReg = rlSrc.lowReg; dvmCompilerClobber(cUnit, rlSrc.lowReg); } } else { // Load Src either into promoted Dest or temps allocated for Dest rlDest = dvmCompilerEvalLoc(cUnit, rlDest, kAnyReg, false); loadValueDirect(cUnit, rlSrc, rlDest.lowReg); } // Dest is now live and dirty (until/if we flush it to home location) dvmCompilerMarkLive(cUnit, rlDest.lowReg, rlDest.sRegLow); dvmCompilerMarkDirty(cUnit, rlDest.lowReg); if (rlDest.location == kLocRetval) { storeBaseDisp(cUnit, rGLUE, offsetof(InterpState, retval), rlDest.lowReg, kWord); dvmCompilerClobber(cUnit, rlDest.lowReg); } else { dvmCompilerResetDefLoc(cUnit, rlDest); if (dvmCompilerLiveOut(cUnit, rlDest.sRegLow)) { defStart = (LIR *)cUnit->lastLIRInsn; int vReg = dvmCompilerS2VReg(cUnit, rlDest.sRegLow); storeBaseDisp(cUnit, rFP, vReg << 2, rlDest.lowReg, kWord); dvmCompilerMarkClean(cUnit, rlDest.lowReg); defEnd = (LIR *)cUnit->lastLIRInsn; dvmCompilerMarkDef(cUnit, rlDest, defStart, defEnd); } } }
/* * Load a Dalvik register pair into a physical register[s]. Take care when * using this routine, as it doesn't perform any bookkeeping regarding * register liveness. That is the responsibility of the caller. */ static void loadValueDirectWide(CompilationUnit *cUnit, RegLocation rlSrc, int regLo, int regHi) { rlSrc = dvmCompilerUpdateLocWide(cUnit, rlSrc); if (rlSrc.location == kLocPhysReg) { genRegCopyWide(cUnit, regLo, regHi, rlSrc.lowReg, rlSrc.highReg); } else if (rlSrc.location == kLocRetval) { loadBaseDispWide(cUnit, NULL, rGLUE, 8, regLo, regHi, INVALID_SREG); } else { assert(rlSrc.location == kLocDalvikFrame); loadBaseDispWide(cUnit, NULL, rFP, dvmCompilerS2VReg(cUnit, rlSrc.sRegLow) << 2, regLo, regHi, INVALID_SREG); } }
/* * Take the address of a Dalvik register and store it into rDest. * Clobber any live values associated either with the Dalvik value * or the target register and lock the target fixed register. */ static void loadValueAddressDirect(CompilationUnit *cUnit, RegLocation rlSrc, int rDest) { rlSrc = rlSrc.wide ? dvmCompilerUpdateLocWide(cUnit, rlSrc) : dvmCompilerUpdateLoc(cUnit, rlSrc); if (rlSrc.location == kLocPhysReg) { if (rlSrc.wide) { dvmCompilerFlushRegWideForV5TEVFP(cUnit, rlSrc.lowReg, rlSrc.highReg); } else { dvmCompilerFlushRegForV5TEVFP(cUnit, rlSrc.lowReg); } } dvmCompilerClobber(cUnit, rDest); dvmCompilerLockTemp(cUnit, rDest); opRegRegImm(cUnit, kOpAdd, rDest, rFP, dvmCompilerS2VReg(cUnit, rlSrc.sRegLow) << 2); }
static void storeValue(CompilationUnit *cUnit, RegLocation rlDest, RegLocation rlSrc) { LOG("rlDest.location is %d\nrlSrc.location is %d\n", rlDest.location, rlSrc.location); LIR *defStart; LIR *defEnd; assert(!rlDest.wide); assert(!rlSrc.wide); //eric //dvmCompilerKillNullCheckedLoc(cUnit, rlDest); rlSrc = dvmCompilerUpdateLoc(cUnit, rlSrc); //eric:if the register is DalvikFrame, so change it to physical rlDest = dvmCompilerUpdateLoc(cUnit, rlDest); LOG(">>>>>>>>>>>>>sRegLow is %d<<<<<<<<<<<<\n", rlDest.sRegLow); if (rlSrc.location == kLocPhysReg) { LOG(">>>>>>>>>>>>>>>The function is %s<<<<<<<<<<<<<<<<<\n", __func__); LOG(">>>>>>>>>>>>>>>the Src reg is phy<<<<<<<<<<<<<<<<<\n"); if (dvmCompilerIsLive(cUnit, rlSrc.lowReg) || (rlDest.location == kLocPhysReg)) { // Src is live or Dest has assigned reg. rlDest = dvmCompilerEvalLoc(cUnit, rlDest, kAnyReg, false); genRegCopy(cUnit, rlDest.lowReg, rlSrc.lowReg); } else { // Just re-assign the registers. Dest gets Src's regs rlDest.lowReg = rlSrc.lowReg; dvmCompilerClobber(cUnit, rlSrc.lowReg); } } else { LOG(">>>>>>>>>>>>>>>The function is %s<<<<<<<<<<<<<<<<<\n", __func__); LOG("the Src reg is not phy\n"); // Load Src either into promoted Dest or temps allocated for Dest rlDest = dvmCompilerEvalLoc(cUnit, rlDest, kAnyReg, false); loadValueDirect(cUnit, rlSrc, rlDest.lowReg); } LOG(">>>>>>>>>>>>>sRegLow is %d<<<<<<<<<<<<\n", rlDest.sRegLow); // Dest is now live and dirty (until/if we flush it to home location) dvmCompilerMarkLive(cUnit, rlDest.lowReg, rlDest.sRegLow); dvmCompilerMarkDirty(cUnit, rlDest.lowReg); if (rlDest.location == kLocRetval) { //eric //storeBaseDisp(cUnit, rGLUE, offsetof(InterpState, retval), rlDest.lowReg, kWord); storeBaseDisp(cUnit, rGLUE, 8, rlDest.lowReg, kWord); dvmCompilerClobber(cUnit, rlDest.lowReg); } else { dvmCompilerResetDefLoc(cUnit, rlDest); //if (dvmCompilerLiveOut(cUnit, rlDest.sRegLow)) { if (true) { //eric // defStart = (LIR *)cUnit->lastLIRInsn; LOG(">>>>>>>>>>>>>sRegLow is %d<<<<<<<<<<<<\n", rlDest.sRegLow); int vReg = dvmCompilerS2VReg(cUnit, rlDest.sRegLow); LOG(">>>>>>>>>>>>>vReg is v%d<<<<<<<<<<<<<\n", vReg); storeBaseDisp(cUnit, rFP, vReg << 2, rlDest.lowReg, kWord); // storeBaseDisp(cUnit, rFP, 20, rlDest.lowReg, kWord); dvmCompilerMarkClean(cUnit, rlDest.lowReg); // defEnd = (LIR *)cUnit->lastLIRInsn; // dvmCompilerMarkDef(cUnit, rlDest, defStart, defEnd); } } }