/* * Similar to loadValueDirect, but clobbers and allocates the target * registers. Should be used when loading to a fixed registers (for example, * loading arguments to an out of line call. */ static void loadValueDirectWideFixed(CompilationUnit *cUnit, RegLocation rlSrc, int regLo, int regHi) { dvmCompilerClobber(cUnit, regLo); dvmCompilerClobber(cUnit, regHi); dvmCompilerMarkInUse(cUnit, regLo); dvmCompilerMarkInUse(cUnit, regHi); loadValueDirectWide(cUnit, rlSrc, regLo, regHi); }
extern RegLocation dvmCompilerGetReturnWide(CompilationUnit *cUnit) { RegLocation res = LOC_C_RETURN_WIDE; dvmCompilerClobber(cUnit, r0); dvmCompilerClobber(cUnit, r1); dvmCompilerMarkInUse(cUnit, r0); dvmCompilerMarkInUse(cUnit, r1); dvmCompilerMarkPair(cUnit, res.lowReg, res.highReg); return res; }
/* * Load a class pointer value into a fixed or temp register. Target * register is clobbered, and marked inUse. */ static ArmLIR *loadClassPointer(CompilationUnit *cUnit, int rDest, int value) { ArmLIR *res; cUnit->hasClassLiterals = true; if (dvmCompilerIsTemp(cUnit, rDest)) { dvmCompilerClobber(cUnit, rDest); dvmCompilerMarkInUse(cUnit, rDest); } ArmLIR *dataTarget = scanLiteralPool(cUnit->classPointerList, value, 0); if (dataTarget == NULL) { dataTarget = addWordData(cUnit, &cUnit->classPointerList, value); /* Counts the number of class pointers in this translation */ cUnit->numClassPointers++; } ArmLIR *loadPcRel = (ArmLIR *) dvmCompilerNew(sizeof(ArmLIR), true); loadPcRel->opcode = kThumbLdrPcRel; loadPcRel->generic.target = (LIR *) dataTarget; loadPcRel->operands[0] = rDest; setupResourceMasks(loadPcRel); setMemRefType(loadPcRel, true, kLiteral); loadPcRel->aliasInfo = dataTarget->operands[0]; res = loadPcRel; dvmCompilerAppendLIR(cUnit, (LIR *) loadPcRel); return res; }
extern RegLocation dvmCompilerGetReturn(CompilationUnit *cUnit) { RegLocation res = LOC_C_RETURN; dvmCompilerClobber(cUnit, r0); dvmCompilerMarkInUse(cUnit, r0); return res; }
/* * Load an immediate value into a fixed or temp register. Target * register is clobbered, and marked inUse. */ static ArmLIR *loadConstant(CompilationUnit *cUnit, int rDest, int value) { if (dvmCompilerIsTemp(cUnit, rDest)) { dvmCompilerClobber(cUnit, rDest); dvmCompilerMarkInUse(cUnit, rDest); } return loadConstantNoClobber(cUnit, rDest, value); }
extern RegLocation dvmCompilerGetReturnAlt(CompilationUnit *cUnit) { RegLocation res = LOC_C_RETURN; res.lowReg = r1; dvmCompilerClobber(cUnit, r1); dvmCompilerMarkInUse(cUnit, r1); return res; }