Merge "More debugger support." into dalvik-dev
diff --git a/src/compiler/codegen/arm/MethodCodegenDriver.cc b/src/compiler/codegen/arm/MethodCodegenDriver.cc
index f57094f..366a6d3 100644
--- a/src/compiler/codegen/arm/MethodCodegenDriver.cc
+++ b/src/compiler/codegen/arm/MethodCodegenDriver.cc
@@ -1807,27 +1807,37 @@
     int lastArgReg = r3;
     int startVReg = cUnit->method->NumRegisters() -
         cUnit->method->NumIns();
+    /*
+     * Arguments passed in registers should be flushed
+     * to their backing locations in the frame for now.
+     * Also, we need to do initial assignment for promoted
+     * arguments.  NOTE: an older version of dx had an issue
+     * in which it would reuse static method argument registers.
+     * This could result in the same Dalvik virtual register
+     * being promoted to both core and fp regs.  In those
+     * cases, copy argument to both.  This will be uncommon
+     * enough that it isn't worth attempting to optimize.
+     */
     for (int i = 0; i < cUnit->method->NumIns(); i++) {
         PromotionMap vMap = cUnit->promotionMap[startVReg + i];
-        // For arguments only, should have at most one promotion kind
-        DCHECK(!((vMap.coreLocation == kLocPhysReg) &&
-                 (vMap.fpLocation == kLocPhysReg)));
         if (i <= (lastArgReg - firstArgReg)) {
-            // If arriving in register, copy or flush
+            // If arriving in register
             if (vMap.coreLocation == kLocPhysReg) {
                 genRegCopy(cUnit, vMap.coreReg, firstArgReg + i);
-            } else if (vMap.fpLocation == kLocPhysReg) {
+            }
+            if (vMap.fpLocation == kLocPhysReg) {
                 genRegCopy(cUnit, vMap.fpReg, firstArgReg + i);
             }
             // Also put a copy in memory in case we're partially promoted
             storeBaseDisp(cUnit, rSP, oatSRegOffset(cUnit, startVReg + i),
                           firstArgReg + i, kWord);
         } else {
-            // If arriving in frame, initialize promoted target regs
+            // If arriving in frame & promoted
             if (vMap.coreLocation == kLocPhysReg) {
                 loadWordDisp(cUnit, rSP, oatSRegOffset(cUnit, startVReg + i),
                              vMap.coreReg);
-            } else if (vMap.fpLocation == kLocPhysReg) {
+            }
+            if (vMap.fpLocation == kLocPhysReg) {
                 loadWordDisp(cUnit, rSP, oatSRegOffset(cUnit, startVReg + i),
                              vMap.fpReg);
             }