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