From c41e5b5ae1befe2c602d55de1dbc04d1914f4a6c Mon Sep 17 00:00:00 2001 From: buzbee Date: Fri, 23 Sep 2011 12:46:19 -0700 Subject: Add tables to map between callee saves and vregs Also added function to return sp-relative offset for Dalvik virtual registers using Method* [Note: must be matched with corresponding libcore change to reflect new field in Method] Change-Id: Id739908c6232ce60763d8199bc05111e960da46e --- src/compiler/codegen/RallocUtil.cc | 2 ++ src/compiler/codegen/arm/ArchUtility.cc | 7 ++++++- src/compiler/codegen/arm/ArmRallocUtil.cc | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) (limited to 'src/compiler/codegen') diff --git a/src/compiler/codegen/RallocUtil.cc b/src/compiler/codegen/RallocUtil.cc index 8b8450011b..8b9ae1333e 100644 --- a/src/compiler/codegen/RallocUtil.cc +++ b/src/compiler/codegen/RallocUtil.cc @@ -220,6 +220,7 @@ extern int oatAllocPreservedCoreReg(CompilationUnit* cUnit, int sReg) res = coreRegs[i].reg; coreRegs[i].inUse = true; cUnit->coreSpillMask |= (1 << res); + cUnit->coreVmapTable.push_back(sReg); cUnit->numSpills++; cUnit->regLocation[sReg].location = kLocPhysReg; cUnit->regLocation[sReg].lowReg = res; @@ -245,6 +246,7 @@ static int allocPreservedSingle(CompilationUnit* cUnit, int sReg, bool even) res = FPRegs[i].reg; FPRegs[i].inUse = true; cUnit->fpSpillMask |= (1 << (res & FP_REG_MASK)); + cUnit->fpVmapTable.push_back(sReg); cUnit->numSpills++; cUnit->numFPSpills++; cUnit->regLocation[sReg].fpLocation = kLocPhysReg; diff --git a/src/compiler/codegen/arm/ArchUtility.cc b/src/compiler/codegen/arm/ArchUtility.cc index 45e1b19ee7..350f38caeb 100644 --- a/src/compiler/codegen/arm/ArchUtility.cc +++ b/src/compiler/codegen/arm/ArchUtility.cc @@ -450,13 +450,15 @@ void oatCodegenDump(CompilationUnit* cUnit) } - int linebreak = 0; std::string signature = method->GetSignature()->ToModifiedUtf8(); std::string name = method->GetName()->ToModifiedUtf8(); std::string descriptor = method->GetDeclaringClass()->GetDescriptor()-> ToModifiedUtf8(); char buf[256]; +#if 0 + int linebreak = 0; + //TODO: delete when we're sure it's no longer necessary LOG(INFO) << "*/"; sprintf(buf,"\n u1 %s%s_%s_code[] = {", descriptor.c_str(), name.c_str(), signature.c_str()); @@ -477,6 +479,7 @@ void oatCodegenDump(CompilationUnit* cUnit) LOG(INFO) << buf; } LOG(INFO) << " };\n\n"; +#endif // Dump mapping table if (cUnit->mappingTable.size() > 0) { @@ -495,4 +498,6 @@ void oatCodegenDump(CompilationUnit* cUnit) } LOG(INFO) <<" };\n\n"; } + + // Dump vmap table } diff --git a/src/compiler/codegen/arm/ArmRallocUtil.cc b/src/compiler/codegen/arm/ArmRallocUtil.cc index 030131f41c..0908c6d429 100644 --- a/src/compiler/codegen/arm/ArmRallocUtil.cc +++ b/src/compiler/codegen/arm/ArmRallocUtil.cc @@ -260,6 +260,21 @@ extern int oatVRegOffset(CompilationUnit* cUnit, int reg) cUnit->insOffset + ((reg - cUnit->numRegs) << 2); } +/* Return sp-relative offset in bytes using Method* */ +extern int oatVRegOffsetFromMethod(Method* method, int reg) +{ + int numIns = method->NumIns(); + int numRegs = method->NumRegisters() - numIns; + int numOuts = method->NumOuts(); + int numSpills = __builtin_popcount(method->GetCoreSpillMask()) + + __builtin_popcount(method->GetFpSpillMask()); + int numPadding = (STACK_ALIGN_WORDS - + (numSpills + numRegs + numOuts + 2)) & (STACK_ALIGN_WORDS-1); + int regsOffset = (numOuts + numPadding + 1) * 4; + int insOffset = method->GetFrameSizeInBytes() + 4; + return (reg < numRegs) ? regsOffset + (reg << 2) : + insOffset + ((reg - numRegs) << 2); +} /* Clobber all regs that might be used by an external C call */ extern void oatClobberCallRegs(CompilationUnit *cUnit) -- cgit v1.2.3-59-g8ed1b