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/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