More MIPS fixes. Fibonacci and ExceptionTest work.

In this change:
- Fixed compilation of div-int and instance-of
- Fixed VERIFY_OBJECT to compile again
- Added stack space for passing extra function arguments for
  REF_ONLY_CALLEE_SAVE functions
- Fixed AbstractMethodErrorStub to match stack layout

Change-Id: I3d4540a3285a0acf49522ffc6f01d04b888bb8ef
diff --git a/src/compiler/codegen/GenCommon.cc b/src/compiler/codegen/GenCommon.cc
index c1d4661..21f824d 100644
--- a/src/compiler/codegen/GenCommon.cc
+++ b/src/compiler/codegen/GenCommon.cc
@@ -1321,6 +1321,10 @@
     }
   }
   /* rARG0 is ref, rARG2 is class. If ref==null, use directly as bool result */
+  RegLocation rlResult = oatGetReturn(cUnit, false);
+#if defined(TARGET_MIPS)
+  opRegCopy(cUnit, rlResult.lowReg, r_ZERO);    // store false result for if branch is taken
+#endif
   LIR* branch1 = opCmpImmBranch(cUnit, kCondEq, rARG0, 0, NULL);
   /* load object->klass_ */
   DCHECK_EQ(Object::ClassOffset().Int32Value(), 0);
@@ -1339,7 +1343,7 @@
   oatFreeTemp(cUnit, rTgt);
 #else
   /* Uses branchovers */
-  loadConstant(cUnit, rARG0, 1);     // assume true
+  loadConstant(cUnit, rlResult.lowReg, 1);     // assume true
   LIR* branchover = opCmpBranch(cUnit, kCondEq, rARG1, rARG2, NULL);
 #if !defined(TARGET_X86)
   int rTgt = loadHelper(cUnit,
@@ -1356,7 +1360,6 @@
   oatClobberCalleeSave(cUnit);
   /* branch targets here */
   LIR* target = newLIR0(cUnit, kPseudoTargetLabel);
-  RegLocation rlResult = oatGetReturn(cUnit, false);
   storeValue(cUnit, rlDest, rlResult);
   branch1->target = target;
 #if !defined(TARGET_ARM)
@@ -1884,9 +1887,10 @@
     storeValue(cUnit, rlDest, rlResult);
   } else {
 #if defined(TARGET_MIPS)
+    rlSrc1 = loadValue(cUnit, rlSrc1, kCoreReg);
     rlSrc2 = loadValue(cUnit, rlSrc2, kCoreReg);
     if (checkZero) {
-        genNullCheck(cUnit, rlSrc2.sRegLow, rlSrc2.lowReg, 0);
+        genImmedCheck(cUnit, kCondEq, rlSrc2.lowReg, 0, kThrowDivZero);
     }
     newLIR4(cUnit, kMipsDiv, r_HI, r_LO, rlSrc1.lowReg, rlSrc2.lowReg);
     rlResult = oatEvalLoc(cUnit, rlDest, kCoreReg, true);
@@ -1918,8 +1922,8 @@
       rlResult = oatGetReturn(cUnit, false);
     else
       rlResult = oatGetReturnAlt(cUnit);
-    storeValue(cUnit, rlDest, rlResult);
 #endif
+    storeValue(cUnit, rlDest, rlResult);
   }
   return false;
 }
diff --git a/src/heap.cc b/src/heap.cc
index 84030ba..c6f2395 100644
--- a/src/heap.cc
+++ b/src/heap.cc
@@ -517,8 +517,7 @@
 
 #if VERIFY_OBJECT_ENABLED
 void Heap::VerifyObject(const Object* obj) {
-  if (obj == NULL || this == NULL || !verify_objects_ || Runtime::Current()->IsShuttingDown() ||
-      Thread::Current() == NULL ||
+  if (obj == NULL || this == NULL || !verify_objects_ || Thread::Current() == NULL ||
       Runtime::Current()->GetThreadList()->GetLockOwner() == Thread::Current()->GetTid()) {
     return;
   }
diff --git a/src/oat/runtime/mips/runtime_support_mips.S b/src/oat/runtime/mips/runtime_support_mips.S
index cbf895a..574ebcc 100644
--- a/src/oat/runtime/mips/runtime_support_mips.S
+++ b/src/oat/runtime/mips/runtime_support_mips.S
@@ -53,30 +53,30 @@
      * Macro that sets up the callee save frame to conform with
      * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC.
      * Does not include rSUSPEND or rSELF
-     * callee-save: $s2-$s8 + $ra, 8 total + 4 words
+     * callee-save: $s2-$s8 + $ra, 8 total + 4 words + extra args
      */
 .macro SETUP_REF_ONLY_CALLEE_SAVE_FRAME
-    addiu  $sp, $sp, -48
-    sw     $ra, 44($sp)
-    sw     $s8, 40($sp)
-    sw     $s7, 36($sp)
-    sw     $s6, 32($sp)
-    sw     $s5, 28($sp)
-    sw     $s4, 24($sp)
-    sw     $s3, 20($sp)
-    sw     $s2, 16($sp)
-    # 4 open words for args $a0-$a3, bottom will hold Method*
+    addiu  $sp, $sp, -64
+    sw     $ra, 60($sp)
+    sw     $s8, 56($sp)
+    sw     $s7, 52($sp)
+    sw     $s6, 48($sp)
+    sw     $s5, 44($sp)
+    sw     $s4, 40($sp)
+    sw     $s3, 36($sp)
+    sw     $s2, 32($sp)
+    # 4 word for alignment and extra args, 4 open words for args $a0-$a3, bottom will hold Method*
 .endm
 
 .macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
-    lw     $ra, 44($sp)
-    addiu  $sp, $sp, 48
+    lw     $ra, 60($sp)
+    addiu  $sp, $sp, 64
 .endm
 
 .macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
-    lw     $ra, 44($sp)
+    lw     $ra, 60($sp)
     jr     $ra
-    addiu  $sp, $sp, 48
+    addiu  $sp, $sp, 64
 .endm
 
     /*
@@ -531,7 +531,7 @@
 art_get32_static_from_code:
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
-    lw     $a1, 48($sp)                  # pass referrer's Method*
+    lw     $a1, 64($sp)                  # pass referrer's Method*
     move   $a2, rSELF                    # pass Thread::Current
     jal    artGet32StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
     move   $a3, $sp                      # pass $sp
@@ -546,7 +546,7 @@
 art_get64_static_from_code:
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
-    lw     $a1, 48($sp)                  # pass referrer's Method*
+    lw     $a1, 64($sp)                  # pass referrer's Method*
     move   $a2, rSELF                    # pass Thread::Current
     jal    artGet64StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
     move   $a3, $sp                      # pass $sp
@@ -561,7 +561,7 @@
 art_get_obj_static_from_code:
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
-    lw     $a1, 48($sp)                  # pass referrer's Method*
+    lw     $a1, 64($sp)                  # pass referrer's Method*
     move   $a2, rSELF                    # pass Thread::Current
     jal    artGetObjStaticFromCode       # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
     move   $a3, $sp                      # pass $sp
@@ -576,13 +576,10 @@
 art_get32_instance_from_code:
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
-    lw     $a2, 48($sp)                  # pass referrer's Method*
-    move   $t0, $sp                      # save $sp
-    addiu  $sp, $sp, -16                 # make space for extra args
+    lw     $a2, 64($sp)                  # pass referrer's Method*
     move   $a3, rSELF                    # pass Thread::Current
     jal    artGet32InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
-    sw     $t0, 16($sp)                  # pass $sp
-    addiu  $sp, $sp, 16                  # release out args
+    sw     $sp, 16($sp)                  # pass $sp
     RETURN_IF_NO_EXCEPTION
 
     .global art_get64_instance_from_code
@@ -594,13 +591,10 @@
 art_get64_instance_from_code:
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
-    lw     $a2, 48($sp)                  # pass referrer's Method*
-    move   $t0, $sp                      # save $sp
-    addiu  $sp, $sp, -16                 # make space for extra args
+    lw     $a2, 64($sp)                  # pass referrer's Method*
     move   $a3, rSELF                    # pass Thread::Current
     jal    artGet64InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
-    sw     $t0, 16($sp)                  # pass $sp
-    addiu  $sp, $sp, 16                  # release out args
+    sw     $sp, 16($sp)                  # pass $sp
     RETURN_IF_NO_EXCEPTION
 
     .global art_get_obj_instance_from_code
@@ -612,13 +606,10 @@
 art_get_obj_instance_from_code:
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
-    lw     $a2, 48($sp)                  # pass referrer's Method*
-    move   $t0, $sp                      # save $sp
-    addiu  $sp, $sp, -16                 # make space for extra args
+    lw     $a2, 64($sp)                  # pass referrer's Method*
     move   $a3, rSELF                    # pass Thread::Current
     jal    artGetObjInstanceFromCode     # (field_idx, Object*, referrer, Thread*, $sp)
-    sw     $t0, 16($sp)                  # pass $sp
-    addiu  $sp, $sp, 16                  # release out args
+    sw     $sp, 16($sp)                  # pass $sp
     RETURN_IF_NO_EXCEPTION
 
     .global art_set32_static_from_code
@@ -630,13 +621,10 @@
 art_set32_static_from_code:
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
-    lw     $a2, 48($sp)                  # pass referrer's Method*
-    move   $t0, $sp                      # save $sp
-    addiu  $sp, $sp, -16                 # make space for extra args
+    lw     $a2, 64($sp)                  # pass referrer's Method*
     move   $a3, rSELF                    # pass Thread::Current
     jal    artSet32StaticFromCode        # (field_idx, new_val, referrer, Thread*, $sp)
-    sw     $t0, 16($sp)                  # pass $sp
-    addiu  $sp, $sp, 16                  # release out args
+    sw     $sp, 16($sp)                  # pass $sp
     RETURN_IF_ZERO
 
     .global art_set64_static_from_code
@@ -648,13 +636,10 @@
 art_set64_static_from_code:
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
-    lw     $a1, 48($sp)                  # pass referrer's Method*
-    move   $t0, $sp                      # save $sp
-    addiu  $sp, $sp, -16                 # make space for extra args
+    lw     $a1, 64($sp)                  # pass referrer's Method*
     sw     rSELF, 16($sp)                # pass Thread::Current
     jal    artSet64StaticFromCode        # (field_idx, referrer, new_val, Thread*, $sp)
-    sw     $t0, 20($sp)                  # pass $sp
-    addiu  $sp, $sp, 16                  # release out args
+    sw     $sp, 20($sp)                  # pass $sp
     RETURN_IF_ZERO
 
     .global art_set_obj_static_from_code
@@ -666,13 +651,10 @@
 art_set_obj_static_from_code:
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
-    lw     $a2, 48($sp)                  # pass referrer's Method*
-    move   $t0, $sp                      # save $sp
-    addiu  $sp, $sp, -16                 # make space for extra args
+    lw     $a2, 64($sp)                  # pass referrer's Method*
     move   $a3, rSELF                    # pass Thread::Current
     jal    artSetObjStaticFromCode       # (field_idx, new_val, referrer, Thread*, $sp)
-    sw     $t0, 16($sp)                  # pass $sp
-    addiu  $sp, $sp, 16                  # release out args
+    sw     $sp, 16($sp)                  # pass $sp
     RETURN_IF_ZERO
 
     .global art_set32_instance_from_code
@@ -684,13 +666,10 @@
 art_set32_instance_from_code:
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
-    lw     $a3, 48($sp)                  # pass referrer's Method*
-    move   $t0, $sp                      # save $sp
-    addiu  $sp, $sp, -16                 # make space for extra args
+    lw     $a3, 64($sp)                  # pass referrer's Method*
     sw     rSELF, 16($sp)                # pass Thread::Current
     jal    artSet32InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*, $sp)
-    sw     $t0, 20($sp)                  # pass $sp
-    addiu  $sp, $sp, 16                  # release out args
+    sw     $sp, 20($sp)                  # pass $sp
     RETURN_IF_ZERO
 
     .global art_set64_instance_from_code
@@ -702,12 +681,9 @@
 art_set64_instance_from_code:
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
-    move   $t0, $sp                      # save $sp
-    addiu  $sp, $sp, -16                 # make space for extra args
     sw     rSELF, 16($sp)                # pass Thread::Current
     jal    artSet64InstanceFromCode      # (field_idx, Object*, new_val, Thread*, $sp)
-    sw     $t0, 20($sp)                  # pass $sp
-    addiu  $sp, $sp, 16                  # release out args
+    sw     $sp, 20($sp)                  # pass $sp
     RETURN_IF_ZERO
 
     .global art_set_obj_instance_from_code
@@ -719,13 +695,10 @@
 art_set_obj_instance_from_code:
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
-    lw     $a3, 48($sp)                  # pass referrer's Method*
-    move   $t0, $sp                      # save $sp
-    addiu  $sp, $sp, -16                 # make space for extra args
+    lw     $a3, 64($sp)                  # pass referrer's Method*
     sw     rSELF, 16($sp)                # pass Thread::Current
     jal    artSetObjInstanceFromCode     # (field_idx, Object*, new_val, referrer, Thread*, $sp)
-    sw     $t0, 20($sp)                  # pass $sp
-    addiu  $sp, $sp, 16                  # release out args
+    sw     $sp, 20($sp)                  # pass $sp
     RETURN_IF_ZERO
 
     .global art_resolve_string_from_code
@@ -785,12 +758,9 @@
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
     move    $a3, rSELF                # pass Thread::Current
-    move    $t0, $sp                  # save $sp
-    addiu   $sp, $sp, -16             # make space for extra args
     # artAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t component_count, Thread*, $sp)
     jal     artAllocArrayFromCode
-    sw      $t0, 16($sp)              # pass $sp
-    addiu   $sp, $sp, 16              # release out args
+    sw      $sp, 16($sp)              # pass $sp
     RETURN_IF_NONZERO
 
     .global art_alloc_array_from_code_with_access_check
@@ -804,12 +774,9 @@
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
     move    $a3, rSELF                # pass Thread::Current
-    move    $t0, $sp                  # save $sp
-    addiu   $sp, $sp, -16             # make space for extra args
     # artAllocArrayFromCodeWithAccessCheck(type_idx, method, component_count, Thread*, $sp)
     jal     artAllocArrayFromCodeWithAccessCheck
-    sw      $t0, 16($sp)              # pass $sp
-    addiu   $sp, $sp, 16              # release out args
+    sw      $sp, 16($sp)              # pass $sp
     RETURN_IF_NONZERO
 
     .global art_check_and_alloc_array_from_code
@@ -822,12 +789,9 @@
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
     move    $a3, rSELF                # pass Thread::Current
-    move    $t0, $sp                  # save $sp
-    addiu   $sp, $sp, -16             # make space for extra args
     # artCheckAndAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t count, Thread* , $sp)
     jal     artCheckAndAllocArrayFromCode
-    sw      $t0, 16($sp)              # pass $sp
-    addiu   $sp, $sp, 16              # release out args
+    sw      $sp, 16($sp)              # pass $sp
     RETURN_IF_NONZERO
 
     .global art_check_and_alloc_array_from_code_with_access_check
@@ -840,12 +804,9 @@
     .cpload $25
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
     move    $a3, rSELF                # pass Thread::Current
-    move    $t0, $sp                  # save $sp
-    addiu   $sp, $sp, -16             # make space for extra args
     # artCheckAndAllocArrayFromCodeWithAccessCheck(type_idx, method, count, Thread* , $sp)
     jal     artCheckAndAllocArrayFromCodeWithAccessCheck
-    sw      $t0, 16($sp)              # pass $sp
-    addiu   $sp, $sp, 16              # release out args
+    sw      $sp, 16($sp)              # pass $sp
     RETURN_IF_NONZERO
 
     .global art_test_suspend
diff --git a/src/oat/runtime/mips/stub_mips.cc b/src/oat/runtime/mips/stub_mips.cc
index 9fd65c8..9c940a1 100644
--- a/src/oat/runtime/mips/stub_mips.cc
+++ b/src/oat/runtime/mips/stub_mips.cc
@@ -126,15 +126,17 @@
   UniquePtr<MipsAssembler> assembler(static_cast<MipsAssembler*>(Assembler::Create(kMips)));
 #if !defined(ART_USE_LLVM_COMPILER)
   // Save callee saves and ready frame for exception delivery
-  __ AddConstant(SP, SP, -48);
-  __ StoreToOffset(kStoreWord, RA, SP, 44);
-  __ StoreToOffset(kStoreWord, FP, SP, 40);
-  __ StoreToOffset(kStoreWord, S7, SP, 36);
-  __ StoreToOffset(kStoreWord, S6, SP, 32);
-  __ StoreToOffset(kStoreWord, S5, SP, 28);
-  __ StoreToOffset(kStoreWord, S4, SP, 24);
-  __ StoreToOffset(kStoreWord, S3, SP, 20);
-  __ StoreToOffset(kStoreWord, S2, SP, 16);
+  __ AddConstant(SP, SP, -64);
+  __ StoreToOffset(kStoreWord, RA, SP, 60);
+  __ StoreToOffset(kStoreWord, FP, SP, 56);
+  __ StoreToOffset(kStoreWord, S7, SP, 52);
+  __ StoreToOffset(kStoreWord, S6, SP, 48);
+  __ StoreToOffset(kStoreWord, S5, SP, 44);
+  __ StoreToOffset(kStoreWord, S4, SP, 40);
+  __ StoreToOffset(kStoreWord, S3, SP, 36);
+  __ StoreToOffset(kStoreWord, S2, SP, 32);
+  __ StoreToOffset(kStoreWord, S1, SP, 28);
+  __ StoreToOffset(kStoreWord, S0, SP, 24);
 
   // A0 is the Method* already
   __ Move(A1, S1);  // Pass Thread::Current() in A1
diff --git a/src/runtime.cc b/src/runtime.cc
index 4b7338b..3a5c41c 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -1105,7 +1105,7 @@
     uint32_t core_spills = ref_spills | (type == kRefsAndArgs ? arg_spills : 0) |
                            (type == kSaveAll ? all_spills : 0) | (1 << art::mips::RA);
     size_t frame_size = RoundUp((__builtin_popcount(core_spills) /* gprs */ +
-                                 (type == kRefsAndArgs ? 0 : 3) /* always reserve arg space */ +
+                                 (type == kRefsAndArgs ? 0 : 5) /* reserve arg space */ +
                                  1 /* Method* */) * kPointerSize, kStackAlignment);
     method->SetFrameSizeInBytes(frame_size);
     method->SetCoreSpillMask(core_spills);
diff --git a/src/thread.cc b/src/thread.cc
index 6daeadf..cea919f 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -2013,9 +2013,9 @@
 
 void Thread::VerifyStack() {
   UniquePtr<Context> context(Context::Create());
-  RootCallbackVisitor visitorToCallback(visitor, arg);
+  RootCallbackVisitor visitorToCallback(VerifyObject, Runtime::Current()->GetHeap());
   ReferenceMapVisitor<RootCallbackVisitor> mapper(GetManagedStack(), GetTraceStack(), context.get(),
-                                                  VerifyObject, Runtime::Current()->GetHeap());
+                                                  visitorToCallback);
   mapper.WalkStack();
 }
 #endif