Merge "More MIPS fixes. Many run-test tests pass." into dalvik-dev
diff --git a/src/compiler/codegen/GenCommon.cc b/src/compiler/codegen/GenCommon.cc
index 21f824d..7305271 100644
--- a/src/compiler/codegen/GenCommon.cc
+++ b/src/compiler/codegen/GenCommon.cc
@@ -216,18 +216,26 @@
   int rTgt = loadHelper(cUnit, helperOffset);
 #endif
   if (arg0.wide == 0) {
-    loadValueDirectFixed(cUnit, arg0, rARG0);
+    loadValueDirectFixed(cUnit, arg0, arg0.fp ? rFARG0 : rARG0);
     if (arg1.wide == 0) {
+#if defined(TARGET_MIPS)
+      loadValueDirectFixed(cUnit, arg1, arg1.fp ? rFARG2 : rARG1);
+#else
       loadValueDirectFixed(cUnit, arg1, rARG1);
+#endif
     } else {
+#if defined(TARGET_MIPS)
+      loadValueDirectWideFixed(cUnit, arg1, arg1.fp ? rFARG2 : rARG1, arg1.fp ? rFARG3 : rARG2);
+#else
       loadValueDirectWideFixed(cUnit, arg1, rARG1, rARG2);
+#endif
     }
   } else {
-    loadValueDirectWideFixed(cUnit, arg0, rARG0, rARG1);
+    loadValueDirectWideFixed(cUnit, arg0, arg0.fp ? rFARG0 : rARG0, arg0.fp ? rFARG1 : rARG1);
     if (arg1.wide == 0) {
-      loadValueDirectFixed(cUnit, arg1, rARG2);
+      loadValueDirectFixed(cUnit, arg1, arg1.fp ? rFARG2 : rARG2);
     } else {
-      loadValueDirectWideFixed(cUnit, arg1, rARG2, rARG3);
+      loadValueDirectWideFixed(cUnit, arg1, arg1.fp ? rFARG2 : rARG2, arg1.fp ? rFARG3 : rARG3);
     }
   }
   oatClobberCalleeSave(cUnit);
@@ -1400,7 +1408,7 @@
       // InitializeTypeFromCode(idx, method)
       callRuntimeHelperImmReg(cUnit, ENTRYPOINT_OFFSET(pInitializeTypeFromCode), type_idx, rARG1,
                               true);
-      opRegCopy(cUnit, classReg, rARG0); // Align usage with fast path
+      opRegCopy(cUnit, classReg, rRET0); // Align usage with fast path
       // Rejoin code paths
       LIR* hopTarget = newLIR0(cUnit, kPseudoTargetLabel);
       hopBranch->target = (LIR*)hopTarget;
@@ -2363,9 +2371,9 @@
    */
   oatFlushAllRegs(cUnit);   /* Send everything to home location */
   if (rlSrc.wide) {
-    loadValueDirectWideFixed(cUnit, rlSrc, rARG0, rARG1);
+    loadValueDirectWideFixed(cUnit, rlSrc, rlSrc.fp ? rFARG0 : rARG0, rlSrc.fp ? rFARG1 : rARG1);
   } else {
-    loadValueDirectFixed(cUnit, rlSrc, rARG0);
+    loadValueDirectFixed(cUnit, rlSrc, rlSrc.fp ? rFARG0 : rARG0);
   }
   callRuntimeHelperRegLocation(cUnit, funcOffset, rlSrc, false);
   if (rlDest.wide) {
diff --git a/src/compiler/codegen/arm/ArmLIR.h b/src/compiler/codegen/arm/ArmLIR.h
index a40df20..1da567e 100644
--- a/src/compiler/codegen/arm/ArmLIR.h
+++ b/src/compiler/codegen/arm/ArmLIR.h
@@ -251,6 +251,10 @@
 #define rARG1 r1
 #define rARG2 r2
 #define rARG3 r3
+#define rFARG0 r0
+#define rFARG1 r1
+#define rFARG2 r2
+#define rFARG3 r3
 #define rRET0 r0
 #define rRET1 r1
 #define rINVOKE_TGT rLR
diff --git a/src/compiler/codegen/mips/FP/MipsFP.cc b/src/compiler/codegen/mips/FP/MipsFP.cc
index 437f1ed..990c71f 100644
--- a/src/compiler/codegen/mips/FP/MipsFP.cc
+++ b/src/compiler/codegen/mips/FP/MipsFP.cc
@@ -197,11 +197,11 @@
   oatFlushAllRegs(cUnit);
   oatLockCallTemps(cUnit);
   if (wide) {
-    loadValueDirectWideFixed(cUnit, rlSrc1, r_FARG0, r_FARG1);
-    loadValueDirectWideFixed(cUnit, rlSrc2, r_FARG2, r_FARG3);
+    loadValueDirectWideFixed(cUnit, rlSrc1, rFARG0, rFARG1);
+    loadValueDirectWideFixed(cUnit, rlSrc2, rFARG2, rFARG3);
   } else {
-    loadValueDirectFixed(cUnit, rlSrc1, r_FARG0);
-    loadValueDirectFixed(cUnit, rlSrc2, r_FARG2);
+    loadValueDirectFixed(cUnit, rlSrc1, rFARG0);
+    loadValueDirectFixed(cUnit, rlSrc2, rFARG2);
   }
   int rTgt = loadHelper(cUnit, offset);
   // NOTE: not a safepoint
diff --git a/src/compiler/codegen/mips/MipsLIR.h b/src/compiler/codegen/mips/MipsLIR.h
index 5077c9f..4b7da55 100644
--- a/src/compiler/codegen/mips/MipsLIR.h
+++ b/src/compiler/codegen/mips/MipsLIR.h
@@ -301,6 +301,10 @@
 #define rARG1 r_ARG1
 #define rARG2 r_ARG2
 #define rARG3 r_ARG3
+#define rFARG0 r_FARG0
+#define rFARG1 r_FARG1
+#define rFARG2 r_FARG2
+#define rFARG3 r_FARG3
 #define rRET0 r_RESULT0
 #define rRET1 r_RESULT1
 #define rINVOKE_TGT r_T9
diff --git a/src/compiler/codegen/x86/X86LIR.h b/src/compiler/codegen/x86/X86LIR.h
index d3e3da8..8ad014a 100644
--- a/src/compiler/codegen/x86/X86LIR.h
+++ b/src/compiler/codegen/x86/X86LIR.h
@@ -238,6 +238,10 @@
 #define rARG1 rCX
 #define rARG2 rDX
 #define rARG3 rBX
+#define rFARG0 rAX
+#define rFARG1 rCX
+#define rFARG2 rDX
+#define rFARG3 rBX
 #define rRET0 rAX
 #define rRET1 rDX
 #define rINVOKE_TGT rAX
diff --git a/src/oat/runtime/mips/runtime_support_mips.S b/src/oat/runtime/mips/runtime_support_mips.S
index eafd380..349e802 100644
--- a/src/oat/runtime/mips/runtime_support_mips.S
+++ b/src/oat/runtime/mips/runtime_support_mips.S
@@ -353,11 +353,11 @@
     sw    $t0, 16($sp)                    # pass $sp
     addiu $sp, $sp, 16                    # release out args
     move  $a0, $v0                        # save target Method*
-    move  $t0, $v1                        # save $v0->code_
+    move  $t9, $v1                        # save $v0->code_
     RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
     beqz  $v0, 1f
     nop
-    jr    $t0
+    jr    $t9
     nop
 1:
     DELIVER_PENDING_EXCEPTION
@@ -389,13 +389,13 @@
     move     $a0, rSELF       # pass Thread::Current
     jal      artWorkAroundAppJniBugs  # (Thread*, $sp)
     move     $a1, $sp         # pass $sp
-    move     $t0, $v0         # save target address
+    move     $t9, $v0         # save target address
     lw       $a0, 12($sp)
     lw       $a1, 16($sp)
     lw       $a2, 20($sp)
     lw       $a3, 24($sp)
     lw       $ra, 28($sp)
-    jr       $t0              # tail call into JNI routine
+    jr       $t9              # tail call into JNI routine
     addiu    $sp, $sp, 32
 
     .global art_handle_fill_data_from_code
diff --git a/src/oat/runtime/support_proxy.cc b/src/oat/runtime/support_proxy.cc
index 3d0c1c8..7ece784 100644
--- a/src/oat/runtime/support_proxy.cc
+++ b/src/oat/runtime/support_proxy.cc
@@ -30,8 +30,8 @@
 #define ARG2_OFFSET_IN_WORDS 11 // offset to 3rd arg; skip callee saves, LR, Method* and out arg spills for OUT0 to OUT2
 #elif defined(__mips__)
 #define SP_OFFSET_IN_BYTES 8
-#define FRAME_SIZE_IN_BYTES 32u
-#define ARG2_OFFSET_IN_WORDS 8 // offset to 3rd arg; skip callee saves, LR, Method* and out arg spills for OUT0 to OUT2
+#define FRAME_SIZE_IN_BYTES 48u
+#define ARG2_OFFSET_IN_WORDS 12 // offset to 3rd arg; skip callee saves, LR, Method* and out arg spills for OUT0 to OUT2
 #elif defined(__i386__)
 #define SP_OFFSET_IN_BYTES 8
 #define FRAME_SIZE_IN_BYTES 32u