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
diff --git a/src/compiler/codegen/RallocUtil.cc b/src/compiler/codegen/RallocUtil.cc
index 8b84500..8b9ae13 100644
--- a/src/compiler/codegen/RallocUtil.cc
+++ b/src/compiler/codegen/RallocUtil.cc
@@ -220,6 +220,7 @@
             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 @@
             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 45e1b19..350f38c 100644
--- a/src/compiler/codegen/arm/ArchUtility.cc
+++ b/src/compiler/codegen/arm/ArchUtility.cc
@@ -450,13 +450,15 @@
 
     }
 
-    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 @@
         LOG(INFO) << buf;
     }
     LOG(INFO) << "    };\n\n";
+#endif
 
     // Dump mapping table
     if (cUnit->mappingTable.size() > 0) {
@@ -495,4 +498,6 @@
         }
         LOG(INFO) <<"    };\n\n";
     }
+
+    // Dump vmap table
 }
diff --git a/src/compiler/codegen/arm/ArmRallocUtil.cc b/src/compiler/codegen/arm/ArmRallocUtil.cc
index 030131f..0908c6d 100644
--- a/src/compiler/codegen/arm/ArmRallocUtil.cc
+++ b/src/compiler/codegen/arm/ArmRallocUtil.cc
@@ -260,6 +260,21 @@
             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)