/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "asm_support.h"

    .balign 4

    /* Deliver the given exception */
    .extern artDeliverExceptionFromCode
    /* Deliver an exception pending on a thread */
    .extern artDeliverPendingException

    /* Cache alignment for function entry */
.macro ALIGN_FUNCTION_ENTRY
    .balign 16
.endm

    /*
     * Macro that sets up the callee save frame to conform with
     * Runtime::CreateCalleeSaveMethod(kSaveAll)
     * callee-save: s0-s8 + ra, 10 total + 2 words
     */
.macro SETUP_SAVE_ALL_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)
    sw     s1, 12(sp)
    sw     s0, 8(sp)
    @ 2 open words, bottom will hold Method*
.endm

    /*
     * 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
     */
.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, bottom will hold Method*
.endm

.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
    lw     ra, 44(sp)
    addiu  sp, sp, 48
.endm

.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
    lw     ra, 44(sp)
    jr     ra
    addiu  sp, sp, 48
.endm

    /*
     * Macro that sets up the callee save frame to conform with
     * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC.
     * a1-a3, s2-s8, ra, 11 total + 1
     */
.macro SETUP_REF_AND_ARGS_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)
    sw     a3, 12(sp)
    sw     a2, 8(sp)
    sw     a1, 4(sp)
    @ 1 open word, bottom will hold Method*
.endm

.macro RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
    lw     ra, 44(sp)           @ restore ra
    lw     a1, 4(sp)            @ restore non-callee save a1
    lw     a2, 8(sp)            @ restore non-callee save a2
    lw     a3, 12(sp)           @ restore non-callee save a3
    addiu  sp, sp, 48           @ strip frame
.endm

    /*
     * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending
     * exception is Thread::Current()->exception_
     */
.macro DELIVER_PENDING_EXCEPTION
    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME            @ save callee saves for throw
    move    a0, rSELF                           @ pass Thread::Current
    b       artDeliverPendingExceptionFromCode  @ artDeliverPendingExceptionFromCode(Thread*, SP)
    move    a1, sp                              @ pass SP
.endm

.macro RETURN_IF_NO_EXCEPTION
    lw     t0, THREAD_EXCEPTION_OFFSET(rSELF) @ load Thread::Current()->exception_
    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
    bnez   t0, 1f                        @ success if no exception is pending
    nop
    jr     ra
    nop
1:
    DELIVER_PENDING_EXCEPTION
.endm

.macro RETURN_IF_ZERO
    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
    bnez   v0, 1f                       @ success?
    nop
    jr     ra                           @ return on success
    nop
1:
    DELIVER_PENDING_EXCEPTION
.endm

.macro RETURN_IF_NONZERO
    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
    beqz   v0, 1f                       @ success?
    nop
    jr     ra                           @ return on success
    nop
1:
    DELIVER_PENDING_EXCEPTION
.endm

    .global art_update_debugger
    .extern artUpdateDebuggerFromCode
    /*
     * On entry, a0 and a1 must be preserved, a2 is dex PC
     */
    ALIGN_FUNCTION_ENTRY
art_update_debugger:
    move    a3, a0         @ stash away a0 so that it's saved as if it were an argument
    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
    move    a0, a2         @ arg0 is dex PC
    move    a1, rSELF      @ arg1 is Thread*
    move    a2, sp         @ arg2 is sp
    jal     artUpdateDebuggerFromCode      @ artUpdateDebuggerFromCode(int32_t, Thread*, Method**)
    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
    jr      ra
    move    a0, a3         @ restore original a0

    .global art_do_long_jump
    /*
     * On entry a0 is uint32_t* gprs_ and a1 is uint32_t* fprs_
     * FIXME: just guessing about the shape of the jmpbuf.  Where will pc be?
     */
    ALIGN_FUNCTION_ENTRY
art_do_long_jump:
    l.s     f0, 0(a1)
    l.s     f1, 4(a1)
    l.s     f2, 8(a1)
    l.s     f3, 12(a1)
    l.s     f4, 16(a1)
    l.s     f5, 20(a1)
    l.s     f6, 24(a1)
    l.s     f7, 28(a1)
    l.s     f8, 32(a1)
    l.s     f9, 36(a1)
    l.s     f10, 40(a1)
    l.s     f11, 44(a1)
    l.s     f12, 48(a1)
    l.s     f13, 52(a1)
    l.s     f14, 56(a1)
    l.s     f15, 60(a1)
    l.s     f16, 64(a1)
    l.s     f17, 68(a1)
    l.s     f18, 72(a1)
    l.s     f19, 76(a1)
    l.s     f20, 80(a1)
    l.s     f21, 84(a1)
    l.s     f22, 88(a1)
    l.s     f23, 92(a1)
    l.s     f24, 96(a1)
    l.s     f25, 100(a1)
    l.s     f26, 104(a1)
    l.s     f27, 108(a1)
    l.s     f28, 112(a1)
    l.s     f29, 116(a1)
    l.s     f30, 120(a1)
    l.s     f31, 124(a1)
    lw      at, 4(a0)
    lw      v0, 8(a0)
    lw      v1, 12(a0)
    lw      a1, 20(a0)
    lw      a2, 24(a0)
    lw      a3, 28(a0)
    lw      t0, 32(a0)
    lw      t1, 36(a0)
    lw      t2, 40(a0)
    lw      t3, 44(a0)
    lw      t4, 48(a0)
    lw      t5, 52(a0)
    lw      t6, 56(a0)
    lw      t7, 60(a0)
    lw      s0, 64(a0)
    lw      s1, 68(a0)
    lw      s2, 72(a0)
    lw      s3, 76(a0)
    lw      s4, 80(a0)
    lw      s5, 84(a0)
    lw      s6, 88(a0)
    lw      s7, 92(a0)
    lw      t8, 96(a0)
    lw      t9, 100(a0)
    lw      k0, 104(a0)
    lw      k1, 108(a0)
    lw      gp, 112(a0)
    lw      sp, 116(a0)
    lw      fp, 120(a0)
    lw      ra, 124(a0)
    lw      a0, 16(a0)
    move    v0, rzero           @ clear result registers r0 and r1
    jr      ra               @ do long jump
    move    v1, rzero

    .global art_deliver_exception_from_code
    /*
     * Called by managed code, saves most registers (forms basis of long jump context) and passes
     * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at
     * the bottom of the thread. On entry r0 holds Throwable*
     */
    ALIGN_FUNCTION_ENTRY
art_deliver_exception_from_code:
    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
    move a1, rSELF                      @ pass Thread::Current
    b    artDeliverExceptionFromCode    @ artDeliverExceptionFromCode(Throwable*, Thread*, SP)
    move a2, sp                         @ pass SP

    .global art_throw_null_pointer_exception_from_code
    .extern artThrowNullPointerExceptionFromCode
    /*
     * Called by managed code to create and deliver a NullPointerException
     */
    ALIGN_FUNCTION_ENTRY
art_throw_null_pointer_exception_from_code:
    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
    move a0, rSELF                            @ pass Thread::Current
    b   artThrowNullPointerExceptionFromCode  @ artThrowNullPointerExceptionFromCode(Thread*, SP)
    move a1, sp                               @ pass SP

    .global art_throw_div_zero_from_code
    .extern artThrowDivZeroFromCode
    /*
     * Called by managed code to create and deliver an ArithmeticException
     */
    ALIGN_FUNCTION_ENTRY
art_throw_div_zero_from_code:
    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
    move a0, rSELF                  @ pass Thread::Current
    b   artThrowDivZeroFromCode     @ artThrowDivZeroFromCode(Thread*, SP)
    move a1, sp                     @ pass SP

    .global art_throw_array_bounds_from_code
    .extern artThrowArrayBoundsFromCode
    /*
     * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException
     */
    ALIGN_FUNCTION_ENTRY
art_throw_array_bounds_from_code:
    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
    move a2, rSELF                   @ pass Thread::Current
    b   artThrowArrayBoundsFromCode  @ artThrowArrayBoundsFromCode(index, limit, Thread*, SP)
    move a3, sp                      @ pass SP

    .global art_throw_stack_overflow_from_code
    .extern artThrowStackOverflowFromCode
    /*
     * Called by managed code to create and deliver a StackOverflowError.
     */
    ALIGN_FUNCTION_ENTRY
art_throw_stack_overflow_from_code:
    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
    move a1, rSELF                     @ pass Thread::Current
    b   artThrowStackOverflowFromCode  @ artThrowStackOverflowFromCode(method, Thread*, SP)
    move a2, sp                        @ pass SP

    .global art_throw_neg_array_size_from_code
    .extern artThrowNegArraySizeFromCode
    /*
     * Called by managed code to create and deliver a NegativeArraySizeException.
     */
    ALIGN_FUNCTION_ENTRY
art_throw_neg_array_size_from_code:
    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
    move a1, rSELF                        @ pass Thread::Current
    b   artThrowNegArraySizeFromCode      @ artThrowNegArraySizeFromCode(size, Thread*, SP)
    move a2, sp                           @ pass SP

    .global art_throw_no_such_method_from_code
    .extern artThrowNoSuchMethodFromCode
    /*
     * Called by managed code to create and deliver a NoSuchMethodError.
     */
    ALIGN_FUNCTION_ENTRY
art_throw_no_such_method_from_code:
    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
    move a1, rSELF                        @ pass Thread::Current
    b   artThrowNoSuchMethodFromCode      @ artThrowNoSuchMethodFromCode(method_idx, Thread*, SP)
    move a2, sp                           @ pass SP

    .global art_throw_verification_error_from_code
    .extern artThrowVerificationErrorFromCode
    /*
     * Called by managed code to create and deliver verification errors.
     */
    ALIGN_FUNCTION_ENTRY
art_throw_verification_error_from_code:
    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
    move a2, rSELF                            @ pass Thread::Current
    b   artThrowVerificationErrorFromCode     @ artThrowVerificationErrorFromCode(kind, ref, Thread*, SP)
    move a3, sp                               @ pass SP

    /*
     * All generated callsites for interface invokes and invocation slow paths will load arguments
     * as usual - except instead of loading arg0/a0 with the target Method*, arg0/a0 will contain
     * the method_idx.  This wrapper will save arg1-arg3, load the caller's Method*, align the
     * stack and call the appropriate C helper.
     * NOTE: "this" is first visable argument of the target, and so can be found in arg1/a1.
     *
     * The helper will attempt to locate the target and return a 64-bit result in v0/v1 consisting
     * of the target Method* in v0 and method->code_ in v1.
     *
     * If unsuccessful, the helper will return NULL/NULL. There will bea pending exception in the
     * thread and we branch to another stub to deliver it.
     *
     * On success this wrapper will restore arguments and *jump* to the target, leaving the lr
     * pointing back to the original caller.
     */
.macro INVOKE_TRAMPOLINE c_name, cxx_name
    .global \c_name
    .extern \cxx_name
\c_name:
    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME  @ save callee saves in case allocation triggers GC
    lw    a2, 48(sp)                      @ pass caller Method*
    move  a3, rSELF                       @ pass Thread::Current
    sw    sp, 0(sp)                       @ pass SP
    jal   \cxx_name                       @ (method_idx, this, caller, Thread*, SP)
    move   t0, v1                         @ save v0->code_
    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
    bnez   v0, 1f
    nop
    jr     t0
    nop
1:
    DELIVER_PENDING_EXCEPTION
.endm

INVOKE_TRAMPOLINE art_invoke_interface_trampoline, artInvokeInterfaceTrampoline
INVOKE_TRAMPOLINE art_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck

INVOKE_TRAMPOLINE art_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck
INVOKE_TRAMPOLINE art_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck
INVOKE_TRAMPOLINE art_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck
INVOKE_TRAMPOLINE art_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck

    .global art_work_around_app_jni_bugs
    .extern artWorkAroundAppJniBugs
    /*
     * Entry point of native methods when JNI bug compatibility is enabled.
     */
    ALIGN_FUNCTION_ENTRY
art_work_around_app_jni_bugs:
    @ save registers that may contain arguments and LR that will be crushed by a call
    addiu    sp, sp, -32
    sw       a0, 28(sp)
    sw       a1, 24(sp)
    sw       a2, 20(sp)
    sw       a3, 16(sp)
    sw       ra, 12(sp)
    move     a0, rSELF       @ pass Thread::Current
    jal      artWorkAroundAppJniBugs  @ (Thread*, SP)
    move     a1, sp          @ pass SP
    move     t0, v0          @ save target address
    lw       a0, 28(sp)
    lw       a1, 24(sp)
    lw       a2, 20(sp)
    lw       a3, 16(sp)
    lw       ra, 12(sp)
    jr       t0              @ tail call into JNI routine
    addiu    sp, sp, 32

    .global art_handle_fill_data_from_code
    .extern artHandleFillArrayDataFromCode
    /*
     * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on
     * failure.
     */
    ALIGN_FUNCTION_ENTRY
art_handle_fill_data_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  @ save callee saves in case exception allocation triggers GC
    move    a2, rSELF                          @ pass Thread::Current
    jal     artHandleFillArrayDataFromCode     @ (Array*, const DexFile::Payload*, Thread*, SP)
    move    a3, sp                             @ pass SP
    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
    bnez    v0, 1f                             @ success?
    nop
    jr      ra                                 @ return on success
    nop
1:
    DELIVER_PENDING_EXCEPTION

    .global art_lock_object_from_code
    .extern artLockObjectFromCode
    /*
     * Entry from managed code that calls artLockObjectFromCode, may block for GC.
     */
    ALIGN_FUNCTION_ENTRY
art_lock_object_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME      @ save callee saves in case we block
    move    a1, rSELF                     @ pass Thread::Current
    jal     artLockObjectFromCode         @ (Object* obj, Thread*, SP)
    move    a2, sp                        @ pass SP
    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN

    .global art_unlock_object_from_code
    .extern artUnlockObjectFromCode
    /*
     * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure.
     */
    ALIGN_FUNCTION_ENTRY
art_unlock_object_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  @ save callee saves in case exception allocation triggers GC
    move    a1, rSELF                 @ pass Thread::Current
    jal     artUnlockObjectFromCode   @ (Object* obj, Thread*, SP)
    move    a2, sp                    @ pass SP
    RETURN_IF_ZERO

    .global art_check_cast_from_code
    .extern artCheckCastFromCode
    /*
     * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure.
     */
    ALIGN_FUNCTION_ENTRY
art_check_cast_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  @ save callee saves in case exception allocation triggers GC
    move    a2, rSELF                 @ pass Thread::Current
    jal     artCheckCastFromCode      @ (Class* a, Class* b, Thread*, SP)
    move    a3, sp                    @ pass SP
    RETURN_IF_ZERO

    .global art_can_put_array_element_from_code
    .extern artCanPutArrayElementFromCode
    /*
     * Entry from managed code that calls artCanPutArrayElementFromCode and delivers exception on
     * failure.
     */
    ALIGN_FUNCTION_ENTRY
art_can_put_array_element_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME    @ save callee saves in case exception allocation triggers GC
    move    a2, rSELF                      @ pass Thread::Current
    jal     artCanPutArrayElementFromCode  @ (Object* element, Class* array_class, Thread*, SP)
    move    a3, sp                         @ pass SP
    RETURN_IF_ZERO

    .global art_initialize_static_storage_from_code
    .extern artInitializeStaticStorageFromCode
    /*
     * Entry from managed code when uninitialized static storage, this stub will run the class
     * initializer and deliver the exception on error. On success the static storage base is
     * returned.
     */
    ALIGN_FUNCTION_ENTRY
art_initialize_static_storage_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME            @ save callee saves in case of GC
    move    a2, rSELF                           @ pass Thread::Current
    @ artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*, SP)
    jal     artInitializeStaticStorageFromCode
    move    a3, sp                              @ pass SP
    RETURN_IF_NONZERO

    .global art_initialize_type_from_code
    .extern artInitializeTypeFromCode
    /*
     * Entry from managed code when dex cache misses for a type_idx.
     */
    ALIGN_FUNCTION_ENTRY
art_initialize_type_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME           @ save callee saves in case of GC
    move    a2, rSELF                          @ pass Thread::Current
    @ artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, SP)
    jal     artInitializeTypeFromCode
    move    a3, sp                             @ pass SP
    RETURN_IF_NONZERO

    .global art_initialize_type_and_verify_access_from_code
    .extern artInitializeTypeAndVerifyAccessFromCode
    /*
     * Entry from managed code when type_idx needs to be checked for access and dex cache may also
     * miss.
     */
    ALIGN_FUNCTION_ENTRY
art_initialize_type_and_verify_access_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME           @ save callee saves in case of GC
    move    a2, rSELF                           @ pass Thread::Current
    @ artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, SP)
    jal     artInitializeTypeAndVerifyAccessFromCode
    move    a3, sp                              @ pass SP
    RETURN_IF_NONZERO

    .global art_get32_static_from_code
    .extern artGet32StaticFromCode
    /*
     * Called by managed code to resolve a static field and load a 32-bit primitive value.
     */
    ALIGN_FUNCTION_ENTRY
art_get32_static_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     @ save callee saves in case of GC
    lw     a1, 48(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
    RETURN_IF_NO_EXCEPTION

    .global art_get64_static_from_code
    .extern artGet64StaticFromCode
    /*
     * Called by managed code to resolve a static field and load a 64-bit primitive value.
     */
    ALIGN_FUNCTION_ENTRY
art_get64_static_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     @ save callee saves in case of GC
    lw     a1, 48(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
    RETURN_IF_NO_EXCEPTION

    .global art_get_obj_static_from_code
    .extern artGetObjStaticFromCode
    /*
     * Called by managed code to resolve a static field and load an object reference.
     */
    ALIGN_FUNCTION_ENTRY
art_get_obj_static_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     @ save callee saves in case of GC
    lw     a1, 48(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
    RETURN_IF_NO_EXCEPTION

    .global art_get32_instance_from_code
    .extern artGet32InstanceFromCode
    /*
     * Called by managed code to resolve an instance field and load a 32-bit primitive value.
     */
    ALIGN_FUNCTION_ENTRY
art_get32_instance_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     @ save callee saves in case of GC
    lw     a2, 48(sp)                    @ pass referrer's Method*
    move   a3, rSELF                     @ pass Thread::Current
    jal     artGet32InstanceFromCode     @ (field_idx, Object*, referrer, Thread*, SP)
    sw     sp, 0(sp)                     @ pass SP
    RETURN_IF_NO_EXCEPTION

    .global art_get64_instance_from_code
    .extern artGet64InstanceFromCode
    /*
     * Called by managed code to resolve an instance field and load a 64-bit primitive value.
     */
    ALIGN_FUNCTION_ENTRY
art_get64_instance_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     @ save callee saves in case of GC
    lw     a2, 48(sp)                    @ pass referrer's Method*
    move   a3, rSELF                     @ pass Thread::Current
    jal     artGet64InstanceFromCode     @ (field_idx, Object*, referrer, Thread*, SP)
    sw     sp, 0(sp)                     @ pass SP
    RETURN_IF_NO_EXCEPTION

    .global art_get_obj_instance_from_code
    .extern artGetObjInstanceFromCode
    /*
     * Called by managed code to resolve an instance field and load an object reference.
     */
    ALIGN_FUNCTION_ENTRY
art_get_obj_instance_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     @ save callee saves in case of GC
    lw     a2, 48(sp)                    @ pass referrer's Method*
    move   a3, rSELF                     @ pass Thread::Current
    jal     artGetObjInstanceFromCode    @ (field_idx, Object*, referrer, Thread*, SP)
    sw     sp, 0(sp)                     @ pass SP
    RETURN_IF_NO_EXCEPTION

    .global art_set32_static_from_code
    .extern artSet32StaticFromCode
    /*
     * Called by managed code to resolve a static field and store a 32-bit primitive value.
     */
    ALIGN_FUNCTION_ENTRY
art_set32_static_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     @ save callee saves in case of GC
    lw     a2, 48(sp)                    @ pass referrer's Method*
    move   a3, rSELF                     @ pass Thread::Current
    jal     artSet32StaticFromCode       @ (field_idx, new_val, referrer, Thread*, SP)
    sw     sp, 0(sp)                     @ pass SP
    RETURN_IF_ZERO

    .global art_set64_static_from_code
    .extern artSet32StaticFromCode
    /*
     * Called by managed code to resolve a static field and store a 64-bit primitive value.
     */
    ALIGN_FUNCTION_ENTRY
art_set64_static_from_code:
    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
    addui  sp, sp, -16
    sw     rSELF, 0(sp)                  @ pass Thread::Current and sp
    jal    artSet64StaticFromCode        @ (field_idx, referrer, new_val, Thread*, SP)
    sw     t0, 4(sp)
    addui  sp, #16                       @ release out args
    RETURN_IF_ZERO

    .global art_set_obj_static_from_code
    .extern artSetObjStaticFromCode
    /*
     * Called by managed code to resolve a static field and store an object reference.
     */
    ALIGN_FUNCTION_ENTRY
art_set_obj_static_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     @ save callee saves in case of GC
    lw     a2, 48(sp)                    @ pass referrer's Method*
    move   a3, rSELF                     @ pass Thread::Current
    jal     artSetObjStaticFromCode      @ (field_idx, new_val, referrer, Thread*, SP)
    sw     sp, 0(sp)                     @ pass SP
    RETURN_IF_ZERO

    .global art_set32_instance_from_code
    .extern artSet32InstanceFromCode
    /*
     * Called by managed code to resolve an instance field and store a 32-bit primitive value.
     */
    ALIGN_FUNCTION_ENTRY
art_set32_instance_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     @ save callee saves in case of GC
    lw     a4, 48(sp)                    @ pass referrer's Method*
    move   t0, sp                        @ save SP
    addui  sp, sp, -16
    sw     rSELF, 0(sp)                  @ pass Thread::Current and sp
    jal    artSet32InstanceFromCode      @ (field_idx, Object*, new_val, referrer, Thread*, SP)
    sw     t0, 4(sp)
    addiu  sp, sp, 16                    @ release out args
    RETURN_IF_ZERO

    .global art_set64_instance_from_code
    .extern artSet32InstanceFromCode
    /*
     * Called by managed code to resolve an instance field and store a 64-bit primitive value.
     */
    ALIGN_FUNCTION_ENTRY
art_set64_instance_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     @ save callee saves in case of GC
    move   t0, sp                        @ save SP
    addui  sp, sp, -16
    sw     rSELF, 0(sp)                  @ pass Thread::Current and sp
    jal     artSet64InstanceFromCode     @ (field_idx, Object*, new_val, Thread*, SP)
    sw     t0, 4(sp)
    addiu  sp, sp, 16                    @ release out args
    RETURN_IF_ZERO

    .global art_set_obj_instance_from_code
    .extern artSetObjInstanceFromCode
    /*
     * Called by managed code to resolve an instance field and store an object reference.
     */
    ALIGN_FUNCTION_ENTRY
art_set_obj_instance_from_code:
    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
    addui  sp, sp, -16
    sw     rSELF, 0(sp)                  @ pass Thread::Current and sp
    jal     artSetObjInstanceFromCode    @ (field_idx, Object*, new_val, referrer, Thread*, SP)
    sw     t0, 4(sp)
    addiu  sp, sp, 16                    @ release out args
    RETURN_IF_ZERO

    .global art_resolve_string_from_code
    .extern artResolveStringFromCode
    /*
     * Entry from managed code to resolve a string, this stub will allocate a String and deliver an
     * exception on error. On success the String is returned. R0 holds the referring method,
     * R1 holds the string index. The fast path check for hit in strings cache has already been
     * performed.
     */
    ALIGN_FUNCTION_ENTRY
art_resolve_string_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  @ save callee saves in case of GC
    move    a2, rSELF                 @ pass Thread::Current
    @ artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*, SP)
    jal     artResolveStringFromCode
    move    a3, sp                    @ pass SP
    RETURN_IF_ZERO

    .global art_alloc_object_from_code
    .extern artAllocObjectFromCode
    /*
     * Called by managed code to allocate an object.
     */
    ALIGN_FUNCTION_ENTRY
art_alloc_object_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  @ save callee saves in case of GC
    move    a2, rSELF                 @ pass Thread::Current
    jal     artAllocObjectFromCode    @ (uint32_t type_idx, Method* method, Thread*, SP)
    move    a3, sp                    @ pass SP
    RETURN_IF_NONZERO

    .global art_alloc_object_from_code_with_access_check
    .extern artAllocObjectFromCodeWithAccessCheck
    /*
     * Called by managed code to allocate an object when the caller doesn't know whether it has
     * access to the created type.
     */
    ALIGN_FUNCTION_ENTRY
art_alloc_object_from_code_with_access_check:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  @ save callee saves in case of GC
    move    a2, rSELF                 @ pass Thread::Current
    jal     artAllocObjectFromCodeWithAccessCheck  @ (uint32_t type_idx, Method* method, Thread*, SP)
    move    a3, sp                    @ pass SP
    RETURN_IF_NONZERO

    .global art_alloc_array_from_code
    .extern artAllocArrayFromCode
    /*
     * Called by managed code to allocate an array.
     */
    ALIGN_FUNCTION_ENTRY
art_alloc_array_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  @ save callee saves in case of GC
    move    a3, r9                    @ pass Thread::Current
    @ artAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t component_count, Thread*, SP)
    jal     artAllocArrayFromCode
    sw    sp, 0(sp)                   @ pass SP
    RETURN_IF_NONZERO

    .global art_alloc_array_from_code_with_access_check
    .extern artAllocArrayFromCodeWithAccessCheck
    /*
     * Called by managed code to allocate an array when the caller doesn't know whether it has
     * access to the created type.
     */
    ALIGN_FUNCTION_ENTRY
art_alloc_array_from_code_with_access_check:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  @ save callee saves in case of GC
    move    a3, rSELF                 @ pass Thread::Current
    @ artAllocArrayFromCodeWithAccessCheck(type_idx, method, component_count, Thread*, SP)
    jal     artAllocArrayFromCodeWithAccessCheck
    sw      sp, 0(sp)                 @ pass SP
    RETURN_IF_NONZERO

    .global art_check_and_alloc_array_from_code
    .extern artCheckAndAllocArrayFromCode
    /*
     * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY.
     */
    ALIGN_FUNCTION_ENTRY
art_check_and_alloc_array_from_code:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  @ save callee saves in case of GC
    move    a3, rSELF                 @ pass Thread::Current
    @ artCheckAndAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t count, Thread* , SP)
    jal     artCheckAndAllocArrayFromCode
    sw      sp, 0(sp)                 @ pass SP
    RETURN_IF_NONZERO

    .global art_check_and_alloc_array_from_code_with_access_check
    .extern artCheckAndAllocArrayFromCodeWithAccessCheck
    /*
     * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY.
     */
    ALIGN_FUNCTION_ENTRY
art_check_and_alloc_array_from_code_with_access_check:
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  @ save callee saves in case of GC
    move   a3, rSELF                  @ pass Thread::Current
    @ artCheckAndAllocArrayFromCodeWithAccessCheck(type_idx, method, count, Thread* , SP)
    jal     artCheckAndAllocArrayFromCodeWithAccessCheck
    sw     sp, 0(sp)                  @ pass SP
    RETURN_IF_NONZERO

    .global art_test_suspend
    .extern artTestSuspendFromCode
    /*
     * Called by managed code when the value in rSUSPEND has been decremented to 0.
     */
    ALIGN_FUNCTION_ENTRY
art_test_suspend:
    lw     a0, THREAD_SUSPEND_COUNT_OFFSET(rSELF)
    bnez   a0, 1f
    move   rSUSPEND, SUSPEND_CHECK_INTERVAL   @ reset rSUSPEND to SUSPEND_CHECK_INTERVAL
    jr     ra
    nop
1:
    move   a0, rSELF
    SETUP_REF_ONLY_CALLEE_SAVE_FRAME          @ save callee saves for stack crawl
    jal    artTestSuspendFromCode             @ (Thread*, SP)
    move   a1, sp
    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN

    .global art_proxy_invoke_handler
    .extern artProxyInvokeHandler
    /*
     * Called by managed code that is attempting to call a method on a proxy class. On entry
     * r0 holds the proxy method; r1, r2 and r3 may contain arguments.
     */
    ALIGN_FUNCTION_ENTRY
art_proxy_invoke_handler:
    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
    sw      a0, 0(sp)             @ place proxy method at bottom of frame
    move    a2, rSELF             @ pass Thread::Current
    jalr    artProxyInvokeHandler @ (Method* proxy method, receiver, Thread*, args...)
    addui   a3, sp, 12            @ pointer to r2/r3/LR/caller's Method**/out-args as second arg
    lw      t0, THREAD_EXCEPTION_OFFSET(rSELF) @ load Thread::Current()->exception_
@FIXME - offsets here are probably wrong
    lw      ra, 44(sp)            @ restore ra
    lw      v0, 12(sp)
    lw      v1, 14(sp)
    bnez    r0, 1f
    addui   sp, sp, 48            @ pop frame
    jr      ra
    nop
1:
    DELIVER_PENDING_EXCEPTION

    .global art_trace_entry_from_code
    .extern artTraceMethodEntryFromCode
    /*
     * Routine that intercepts method calls
     */
    ALIGN_FUNCTION_ENTRY
art_trace_entry_from_code:
    addui    sp, sp, -16
    sw       a0, 0(sp)
    sw       a1, 4(sp)
    sw       a2, 8(sp)
    sw       a3, 12(sp)
    move     a2, ra       @ pass ra
    jalr     artTraceMethodEntryFromCode  @ (Method*, Thread*, LR)
    move     a1, rSELF    @ pass Thread::Current
    move     t0, v0       @ t0 holds reference to code
    lw       a0, 0(sp)
    lw       a1, 4(sp)
    lw       a2, 8(sp)
    lw       a3, 12(sp)
    jalr     t0           @ call method
    addui    sp, sp, 16
    /* intentional fallthrough */

    .global art_trace_exit_from_code
    .extern artTraceMethodExitFromCode
    /*
     * Routine that intercepts method returns
     */
    ALIGN_FUNCTION_ENTRY
art_trace_exit_from_code:
    addui    sp, sp, -16
    sw       v0, 0(sp)
    jalr     artTraceMethodExitFromCode  @ ()
    sw       v1, 4(sp)
    move     ra, v0         @ restore link register
    lw       v0, 0(sp)
    lw       v1, 4(sp)
    jr       ra             @ return
    addui    sp, sp, 16

    .global art_shl_long
    /*
     * Long integer shift.  This is different from the generic 32/64-bit
     * binary operations because vAA/vBB are 64-bit but vCC (the shift
     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
     * 6 bits.
     * On entry:
     *   a0: low word
     *   a1: high word
     *   a2: shift count
     */
    ALIGN_FUNCTION_ENTRY
art_shl_long:
    /* shl-long vAA, vBB, vCC */
    sll     v0, a0, a2                     @  rlo<- alo << (shift&31)
    not     v1, a2                         @  rhi<- 31-shift  (shift is 5b)
    srl     a0, 1
    srl     a0, v1                         @  alo<- alo >> (32-(shift&31))
    sll     v1, a1, a2                     @  rhi<- ahi << (shift&31)
    or      v1, a0                         @  rhi<- rhi | alo
    andi    a2, 0x20                       @  shift< shift & 0x20
    movn    v1, v0, a2                     @  rhi<- rlo (if shift&0x20)
    jr      ra
    movn    v0, zero, a2                   @  rlo<- 0  (if shift&0x20)

    .global art_shr_long
    /*
     * Long integer shift.  This is different from the generic 32/64-bit
     * binary operations because vAA/vBB are 64-bit but vCC (the shift
     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
     * 6 bits.
     * On entry:
     *   a0: low word
     *   a1: high word
     *   a2: shift count
     */
    ALIGN_FUNCTION_ENTRY
art_shr_long:
    sra     v1, a1, a2                     @  rhi<- ahi >> (shift&31)
    srl     v0, a0, a2                     @  rlo<- alo >> (shift&31)
    sra     a3, a1, 31                     @  a3<- sign(ah)
    not     a0, a2                         @  alo<- 31-shift (shift is 5b)
    sll     a1, 1
    sll     a1, a0                         @  ahi<- ahi << (32-(shift&31))
    or      v0, a1                         @  rlo<- rlo | ahi
    andi    a2, 0x20                       @  shift & 0x20
    movn    v0, v1, a2                     @  rlo<- rhi (if shift&0x20)
    jr      ra
    movn    v1, a3, a2                     @  rhi<- sign(ahi) (if shift&0x20)

    .global art_ushr_long
    /*
     * Long integer shift.  This is different from the generic 32/64-bit
     * binary operations because vAA/vBB are 64-bit but vCC (the shift
     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
     * 6 bits.
     * On entry:
     *   r0: low word
     *   r1: high word
     *   r2: shift count
     */
    /* ushr-long vAA, vBB, vCC */
    ALIGN_FUNCTION_ENTRY
art_ushr_long:
    sra     v1, a1, a2                     @  rhi<- ahi >> (shift&31)
    srl     v0, a0, a2                     @  rlo<- alo >> (shift&31)
    sra     a3, a1, 31                     @  a3<- sign(ah)
    not     a0, a2                         @  alo<- 31-shift (shift is 5b)
    sll     a1, 1
    sll     a1, a0                         @  ahi<- ahi << (32-(shift&31))
    or      v0, a1                         @  rlo<- rlo | ahi
    andi    a2, 0x20                       @  shift & 0x20
    movn    v0, v1, a2                     @  rlo<- rhi (if shift&0x20)
    jr      ra
    movn    v1, a3, a2                     @  rhi<- sign(ahi) (if shift&0x20)
