quick_entrypoints_mips.S revision 474b6da273c7ce6df50a4e51eb9929a77e1611c3
10f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes/*
20f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Copyright (C) 2012 The Android Open Source Project
30f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes *
40f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
50f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * you may not use this file except in compliance with the License.
60f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * You may obtain a copy of the License at
70f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes *
80f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
90f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes *
100f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Unless required by applicable law or agreed to in writing, software
110f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
120f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * See the License for the specific language governing permissions and
140f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * limitations under the License.
150f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes */
160f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes
175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee#include "asm_support.h"
185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .balign 4
205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* Deliver the given exception */
225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artDeliverExceptionFromCode
235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* Deliver an exception pending on a thread */
245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artDeliverPendingException
255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /* Cache alignment for function entry */
2757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.macro ALIGN_FUNCTION_ENTRY
2857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    .balign 16
2957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.endm
3057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kSaveAll)
347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * callee-save: $s0-$s8 + $ra, 10 total + 2 words
355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
3657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.macro SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu  $sp, $sp, 48
387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $ra, 44($sp)
397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s8, 40($sp)
407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s7, 36($sp)
417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s6, 32($sp)
427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s5, 28($sp)
437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s4, 24($sp)
447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s3, 20($sp)
457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s2, 16($sp)
467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s1, 12($sp)
477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s0, 8($sp)
487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # 2 open words, bottom will hold Method*
495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC.
545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Does not include rSUSPEND or rSELF
557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * callee-save: $s2-$s8 + $ra, 8 total + 4 words
565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_ONLY_CALLEE_SAVE_FRAME
587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu  $sp, $sp, 48
597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $ra, 44($sp)
607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s8, 40($sp)
617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s7, 36($sp)
627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s6, 32($sp)
637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s5, 28($sp)
647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s4, 24($sp)
657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s3, 20($sp)
667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s2, 16($sp)
677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # 4 open words, bottom will hold Method*
685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $ra, 44($sp)
727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu  $sp, $sp, 48
735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $ra, 44($sp)
777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu  $sp, $sp, 48
795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC.
847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * $a1-$a3, $s2-$s8, $ra, 11 total + 1
855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu  $sp, $sp, 48
887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $ra, 44($sp)
897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s8, 40($sp)
907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s7, 36($sp)
917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s6, 32($sp)
927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s5, 28($sp)
937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s4, 24($sp)
947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s3, 20($sp)
957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s2, 16($sp)
967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a3, 12($sp)
977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a2, 8($sp)
987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a1, 4($sp)
997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # 1 open word, bottom will hold Method*
1005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
1037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $ra, 44($sp)           # restore $ra
1047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a1, 4($sp)            # restore non-callee save $a1
1057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a2, 8($sp)            # restore non-callee save $a2
1067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a3, 12($sp)           # restore non-callee save $a3
1077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu  $sp, $sp, 48           # strip frame
1085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending
1125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception is Thread::Current()->exception_
1135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro DELIVER_PENDING_EXCEPTION
1157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME            # save callee saves for throw
1167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a0, rSELF                          # pass Thread::Current
1177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artDeliverPendingExceptionFromCode  # artDeliverPendingExceptionFromCode(Thread*, $sp)
1187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, $sp                            # pass $sp
1195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NO_EXCEPTION
1227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
1235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
1247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $t0, 1f                        # success if no exception is pending
1255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
1275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
1295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
1305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_ZERO
1335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
1347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $v0, 1f                       # success?
1355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra                           # return on success
1375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
1395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
1405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NONZERO
1435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
1447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    beqz   $v0, 1f                       # success?
1455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra                           # return on success
1475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
1495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
1505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_update_debugger
1535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artUpdateDebuggerFromCode
1545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * On entry, $a0 and $a1 must be preserved, $a2 is dex PC
1565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
15757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
1585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_update_debugger:
1597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $a0        # stash away $a0 so that it's saved as if it were an argument
1605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
1617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a0, $a2        # arg0 is dex PC
1627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF      # arg1 is Thread*
1637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, $sp        # arg2 is $sp
1647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artUpdateDebuggerFromCode      # artUpdateDebuggerFromCode(int32_t, Thread*, Method**)
1655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
1667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a0, $a3        # restore original $a0
1685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_do_long_jump
1705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * On entry $a0 is uint32_t* gprs_ and $a1 is uint32_t* fprs_
1725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * FIXME: just guessing about the shape of the jmpbuf.  Where will pc be?
1735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
17457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
1755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_do_long_jump:
1767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f0, 0($a1)
1777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f1, 4($a1)
1787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f2, 8($a1)
1797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f3, 12($a1)
1807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f4, 16($a1)
1817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f5, 20($a1)
1827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f6, 24($a1)
1837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f7, 28($a1)
1847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f8, 32($a1)
1857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f9, 36($a1)
1867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f10, 40($a1)
1877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f11, 44($a1)
1887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f12, 48($a1)
1897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f13, 52($a1)
1907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f14, 56($a1)
1917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f15, 60($a1)
1927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f16, 64($a1)
1937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f17, 68($a1)
1947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f18, 72($a1)
1957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f19, 76($a1)
1967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f20, 80($a1)
1977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f21, 84($a1)
1987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f22, 88($a1)
1997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f23, 92($a1)
2007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f24, 96($a1)
2017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f25, 100($a1)
2027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f26, 104($a1)
2037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f27, 108($a1)
2047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f28, 112($a1)
2057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f29, 116($a1)
2067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f30, 120($a1)
2077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f31, 124($a1)
2087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $at, 4($a0)
2097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v0, 8($a0)
2107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v1, 12($a0)
2117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a1, 20($a0)
2127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a2, 24($a0)
2137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a3, 28($a0)
2147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, 32($a0)
2157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t1, 36($a0)
2167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t2, 40($a0)
2177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t3, 44($a0)
2187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t4, 48($a0)
2197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t5, 52($a0)
2207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t6, 56($a0)
2217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t7, 60($a0)
2227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s0, 64($a0)
2237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s1, 68($a0)
2247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s2, 72($a0)
2257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s3, 76($a0)
2267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s4, 80($a0)
2277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s5, 84($a0)
2287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s6, 88($a0)
2297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s7, 92($a0)
2307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t8, 96($a0)
2317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t9, 100($a0)
2327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $k0, 104($a0)
2337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $k1, 108($a0)
2347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $gp, 112($a0)
2357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $sp, 116($a0)
2367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $fp, 120($a0)
2377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $ra, 124($a0)
2387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a0, 16($a0)
2397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v0, $zero          # clear result registers r0 and r1
2407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra                 # do long jump
2417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v1, $zero
2425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_deliver_exception_from_code
2445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code, saves most registers (forms basis of long jump context) and passes
2465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at
2475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the thread. On entry r0 holds Throwable*
2485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
24957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
2505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_deliver_exception_from_code:
25157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
2527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a1, rSELF                     # pass Thread::Current
2537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal  artDeliverExceptionFromCode    # artDeliverExceptionFromCode(Throwable*, Thread*, $sp)
2547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a2, $sp                       # pass $sp
2555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_throw_null_pointer_exception_from_code
2575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artThrowNullPointerExceptionFromCode
2585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver a NullPointerException
2605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
26157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
2625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_throw_null_pointer_exception_from_code:
26357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
2647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a0, rSELF                           # pass Thread::Current
2657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal  artThrowNullPointerExceptionFromCode  # artThrowNullPointerExceptionFromCode(Thread*, $sp)
2667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a1, $sp                             # pass $sp
2675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_throw_div_zero_from_code
2695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artThrowDivZeroFromCode
2705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArithmeticException
2725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
27357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
2745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_throw_div_zero_from_code:
27557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
2767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a0, rSELF                 # pass Thread::Current
2777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal  artThrowDivZeroFromCode     # artThrowDivZeroFromCode(Thread*, $sp)
2787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a1, $sp                   # pass $sp
2795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_throw_array_bounds_from_code
2815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artThrowArrayBoundsFromCode
2825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException
2845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
28557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
2865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_throw_array_bounds_from_code:
28757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
2887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a2, rSELF                  # pass Thread::Current
2897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal artThrowArrayBoundsFromCode  # artThrowArrayBoundsFromCode(index, limit, Thread*, $sp)
2907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a3, $sp                    # pass $sp
2915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_throw_stack_overflow_from_code
2935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artThrowStackOverflowFromCode
29457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
29557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a StackOverflowError.
29657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
29757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
2985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_throw_stack_overflow_from_code:
29957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a1, rSELF                    # pass Thread::Current
3017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal artThrowStackOverflowFromCode  # artThrowStackOverflowFromCode(method, Thread*, $sp)
3027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a2, $sp                      # pass $sp
3035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_throw_no_such_method_from_code
3055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artThrowNoSuchMethodFromCode
30657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
30757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a NoSuchMethodError.
30857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
30957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
3105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_throw_no_such_method_from_code:
31157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a1, rSELF                       # pass Thread::Current
3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal artThrowNoSuchMethodFromCode      # artThrowNoSuchMethodFromCode(method_idx, Thread*, $sp)
3147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a2, $sp                         # pass $sp
3155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * All generated callsites for interface invokes and invocation slow paths will load arguments
3187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain
3195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the method_idx.  This wrapper will save arg1-arg3, load the caller's Method*, align the
3205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * stack and call the appropriate C helper.
3217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1.
3225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
3237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting
3247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * of the target Method* in $v0 and method->code_ in $v1.
3255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
3265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * If unsuccessful, the helper will return NULL/NULL. There will bea pending exception in the
3275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * thread and we branch to another stub to deliver it.
3285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
3295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On success this wrapper will restore arguments and *jump* to the target, leaving the lr
3305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * pointing back to the original caller.
3315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
3325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name
3335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global \c_name
3345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern \cxx_name
3355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee\c_name:
3367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME  # save callee saves in case allocation triggers GC
3377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw    $a2, 48($sp)                    # pass caller Method*
3387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move  $a3, rSELF                      # pass Thread::Current
3397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw    $sp, 0($sp)                     # pass $sp
3407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal   \cxx_name                       # (method_idx, this, caller, Thread*, $sp)
3417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $t0, $v1                       # save $v0->code_
3425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
3437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $v0, 1f
3445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
3457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $t0
3465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
3475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
3485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
3495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
3505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeINVOKE_TRAMPOLINE art_invoke_interface_trampoline, artInvokeInterfaceTrampoline
3525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeINVOKE_TRAMPOLINE art_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck
3535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeINVOKE_TRAMPOLINE art_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck
3555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeINVOKE_TRAMPOLINE art_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck
3565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeINVOKE_TRAMPOLINE art_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck
3575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeINVOKE_TRAMPOLINE art_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck
3585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_work_around_app_jni_bugs
3605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artWorkAroundAppJniBugs
3615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry point of native methods when JNI bug compatibility is enabled.
3635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
36457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
3655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_work_around_app_jni_bugs:
3667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # save registers that may contain arguments and LR that will be crushed by a call
3677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu    $sp, $sp, -32
3687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw       $a0, 28($sp)
3697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw       $a1, 24($sp)
3707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw       $a2, 20($sp)
3717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw       $a3, 16($sp)
3727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw       $ra, 12($sp)
3737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move     $a0, rSELF       # pass Thread::Current
3747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal      artWorkAroundAppJniBugs  # (Thread*, $sp)
3757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move     $a1, $sp         # pass $sp
3767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move     $t0, $v0         # save target address
3777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw       $a0, 28($sp)
3787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw       $a1, 24($sp)
3797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw       $a2, 20($sp)
3807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw       $a3, 16($sp)
3817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw       $ra, 12($sp)
3827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr       $t0              # tail call into JNI routine
3837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu    $sp, $sp, 32
3845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_handle_fill_data_from_code
3865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artHandleFillArrayDataFromCode
3875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on
3895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * failure.
3905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
39157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
3925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_handle_fill_data_from_code:
3937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
3947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
3957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artHandleFillArrayDataFromCode     # (Array*, const DexFile::Payload*, Thread*, $sp)
3967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
3975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
3987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez    $v0, 1f                            # success?
3995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
4007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra                                # return on success
4015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
4025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
4035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
4045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_lock_object_from_code
4065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artLockObjectFromCode
4075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
40857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code that calls artLockObjectFromCode, may block for GC.
4095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
41057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
4115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_lock_object_from_code:
4127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME      # save callee saves in case we block
4137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                    # pass Thread::Current
4147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artLockObjectFromCode         # (Object* obj, Thread*, $sp)
4157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, $sp                      # pass $sp
4165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
4175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_unlock_object_from_code
4195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artUnlockObjectFromCode
4205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
4215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure.
4225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
42357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
4245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_unlock_object_from_code:
4257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
4267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                # pass Thread::Current
4277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artUnlockObjectFromCode   # (Object* obj, Thread*, $sp)
4287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, $sp                  # pass $sp
4295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
4305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_check_cast_from_code
4325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artCheckCastFromCode
4335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
4345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure.
4355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
43657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
4375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_check_cast_from_code:
4387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
4397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
4407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artCheckCastFromCode      # (Class* a, Class* b, Thread*, $sp)
4417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
4425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
4435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_can_put_array_element_from_code
4455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artCanPutArrayElementFromCode
4465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
4475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artCanPutArrayElementFromCode and delivers exception on
4485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * failure.
4495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
45057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
4515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_can_put_array_element_from_code:
4527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case exception allocation triggers GC
4537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                     # pass Thread::Current
4547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artCanPutArrayElementFromCode  # (Object* element, Class* array_class, Thread*, $sp)
4557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                       # pass $sp
4565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
4575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_initialize_static_storage_from_code
4595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artInitializeStaticStorageFromCode
4605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
4615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when uninitialized static storage, this stub will run the class
4625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * initializer and deliver the exception on error. On success the static storage base is
4635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * returned.
4645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
46557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
4665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_initialize_static_storage_from_code:
4677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME            # save callee saves in case of GC
4687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                          # pass Thread::Current
4697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
4705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeStaticStorageFromCode
4717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                            # pass $sp
4725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
4735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_initialize_type_from_code
4755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artInitializeTypeFromCode
4765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
47757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code when dex cache misses for a type_idx.
4785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
47957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
4805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_initialize_type_from_code:
4817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
4827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
4837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
4845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeFromCode
4857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
4865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
4875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_initialize_type_and_verify_access_from_code
4895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artInitializeTypeAndVerifyAccessFromCode
4905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
4915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when type_idx needs to be checked for access and dex cache may also
49257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * miss.
4935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
49457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
4955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_initialize_type_and_verify_access_from_code:
4967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
4977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
4987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
4995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeAndVerifyAccessFromCode
5007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
5015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
5025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_get32_static_from_code
5045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artGet32StaticFromCode
5055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
50657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 32-bit primitive value.
5075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
50857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
5095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_get32_static_from_code:
5107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
5117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a1, 48($sp)                  # pass referrer's Method*
5127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
5137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artGet32StaticFromCode       # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
5147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
5155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
5165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_get64_static_from_code
5185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artGet64StaticFromCode
5195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
52057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 64-bit primitive value.
5215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
52257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
5235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_get64_static_from_code:
5247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
5257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a1, 48($sp)                  # pass referrer's Method*
5267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
5277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artGet64StaticFromCode       # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
5287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
5295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
5305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_get_obj_static_from_code
5325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artGetObjStaticFromCode
5335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
53457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load an object reference.
5355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
53657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
5375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_get_obj_static_from_code:
5387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
5397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a1, 48($sp)                  # pass referrer's Method*
5407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
5417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artGetObjStaticFromCode      # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
5427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
5435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
5445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_get32_instance_from_code
5465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artGet32InstanceFromCode
5475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
54857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 32-bit primitive value.
5495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
55057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
5515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_get32_instance_from_code:
5527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
5537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a2, 48($sp)                  # pass referrer's Method*
5547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
5557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artGet32InstanceFromCode     # (field_idx, Object*, referrer, Thread*, $sp)
5567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $sp, 0($sp)                   # pass $sp
5575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
5585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_get64_instance_from_code
5605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artGet64InstanceFromCode
5615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
56257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 64-bit primitive value.
5635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
56457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
5655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_get64_instance_from_code:
5667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
5677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a2, 48($sp)                  # pass referrer's Method*
5687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
5697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artGet64InstanceFromCode     # (field_idx, Object*, referrer, Thread*, $sp)
5707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $sp, 0($sp)                   # pass $sp
5715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
5725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_get_obj_instance_from_code
5745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artGetObjInstanceFromCode
5755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
57657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load an object reference.
5775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
57857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
5795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_get_obj_instance_from_code:
5807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
5817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a2, 48($sp)                  # pass referrer's Method*
5827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
5837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artGetObjInstanceFromCode    # (field_idx, Object*, referrer, Thread*, $sp)
5847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $sp, 0($sp)                   # pass $sp
5855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
5865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_set32_static_from_code
5885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artSet32StaticFromCode
5895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
59057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 32-bit primitive value.
5915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
59257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
5935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_set32_static_from_code:
5947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
5957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a2, 48($sp)                  # pass referrer's Method*
5967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
5977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artSet32StaticFromCode       # (field_idx, new_val, referrer, Thread*, $sp)
5987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $sp, 0($sp)                   # pass $sp
5995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
6005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_set64_static_from_code
6025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artSet32StaticFromCode
6035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
60457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 64-bit primitive value.
6055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
60657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
6075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_set64_static_from_code:
6087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
6097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a1, 48($sp)                  # pass referrer's Method*
6107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $t0, $sp                      # save $sp
6117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu  $sp, $sp, -16
6127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     rSELF, 0($sp)                 # pass Thread::Current and $sp
6137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artSet64StaticFromCode        # (field_idx, referrer, new_val, Thread*, $sp)
6147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $t0, 4($sp)
6157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu  $sp, #16                      # release out args
6165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
6175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_set_obj_static_from_code
6195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artSetObjStaticFromCode
6205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
62157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store an object reference.
6225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
62357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
6245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_set_obj_static_from_code:
6257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
6267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a2, 48($sp)                  # pass referrer's Method*
6277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
6287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artSetObjStaticFromCode      # (field_idx, new_val, referrer, Thread*, $sp)
6297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $sp, 0($sp)                   # pass $sp
6305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
6315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_set32_instance_from_code
6335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artSet32InstanceFromCode
6345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
63557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 32-bit primitive value.
6365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
63757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
6385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_set32_instance_from_code:
6397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
6407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a3, 48($sp)                  # pass referrer's Method*
6417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $t0, $sp                      # save $sp
6427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu  $sp, $sp, -16
6437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     rSELF, 0($sp)                 # pass Thread::Current and $sp
6447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artSet32InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*, $sp)
6457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $t0, 4($sp)
6467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu  $sp, $sp, 16                  # release out args
6475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
6485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_set64_instance_from_code
6505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artSet32InstanceFromCode
6515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
65257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 64-bit primitive value.
6535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
65457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
6555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_set64_instance_from_code:
6567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
6577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $t0, $sp                      # save $sp
6587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu  $sp, $sp, -16
6597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     rSELF, 0($sp)                 # pass Thread::Current and $sp
6607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artSet64InstanceFromCode     # (field_idx, Object*, new_val, Thread*, $sp)
6617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $t0, 4($sp)
6627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu  $sp, $sp, 16                  # release out args
6635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
6645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_set_obj_instance_from_code
6665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artSetObjInstanceFromCode
6675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
66857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store an object reference.
6695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
67057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
6715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_set_obj_instance_from_code:
6727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
6737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a3, 48($sp)                  # pass referrer's Method*
6747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $t0, $sp                      # save $sp
6757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu  $sp, $sp, -16
6767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     rSELF, 0($sp)                 # pass Thread::Current and $sp
6777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artSetObjInstanceFromCode    # (field_idx, Object*, new_val, referrer, Thread*, $sp)
6787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $t0, 4($sp)
6797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu  $sp, $sp, 16                  # release out args
6805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
6815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_resolve_string_from_code
6835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artResolveStringFromCode
6845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
6855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code to resolve a string, this stub will allocate a String and deliver an
6865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception on error. On success the String is returned. R0 holds the referring method,
6875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * R1 holds the string index. The fast path check for hit in strings cache has already been
6885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * performed.
6895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
69057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
6915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_resolve_string_from_code:
6927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
6937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
6947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*, $sp)
6955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artResolveStringFromCode
6967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
6975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
6985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_alloc_object_from_code
7005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artAllocObjectFromCode
7015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
70257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to allocate an object.
7035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
70457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
7055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_alloc_object_from_code:
7067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
7077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
7087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artAllocObjectFromCode    # (uint32_t type_idx, Method* method, Thread*, $sp)
7097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
7105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
7115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_alloc_object_from_code_with_access_check
7135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artAllocObjectFromCodeWithAccessCheck
7145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
7155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to allocate an object when the caller doesn't know whether it has
71657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * access to the created type.
7175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
71857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
7195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_alloc_object_from_code_with_access_check:
7207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
7217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
7227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artAllocObjectFromCodeWithAccessCheck  # (uint32_t type_idx, Method* method, Thread*, $sp)
7237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
7245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
7255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_alloc_array_from_code
7275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artAllocArrayFromCode
7285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
72957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to allocate an array.
7305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
73157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
7325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_alloc_array_from_code:
7337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
7347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, rSELF                # pass Thread::Current
7357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t component_count, Thread*, $sp)
7365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artAllocArrayFromCode
7377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw    $sp, 0($sp)                 # pass $sp
7385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
7395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_alloc_array_from_code_with_access_check
7415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artAllocArrayFromCodeWithAccessCheck
7425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
7435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to allocate an array when the caller doesn't know whether it has
74457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * access to the created type.
7455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
74657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
7475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_alloc_array_from_code_with_access_check:
7487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
7497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, rSELF                # pass Thread::Current
7507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artAllocArrayFromCodeWithAccessCheck(type_idx, method, component_count, Thread*, $sp)
7515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artAllocArrayFromCodeWithAccessCheck
7527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw      $sp, 0($sp)               # pass $sp
7535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
7545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_check_and_alloc_array_from_code
7565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artCheckAndAllocArrayFromCode
7575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
75857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY.
7595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
76057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
7615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_check_and_alloc_array_from_code:
7627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
7637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, rSELF                # pass Thread::Current
7647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artCheckAndAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t count, Thread* , $sp)
7655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artCheckAndAllocArrayFromCode
7667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw      $sp, 0($sp)               # pass $sp
7675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
7685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_check_and_alloc_array_from_code_with_access_check
7705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artCheckAndAllocArrayFromCodeWithAccessCheck
7715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
77257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY.
7735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
77457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
7755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_check_and_alloc_array_from_code_with_access_check:
7767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
7777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                 # pass Thread::Current
7787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artCheckAndAllocArrayFromCodeWithAccessCheck(type_idx, method, count, Thread* , $sp)
7795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artCheckAndAllocArrayFromCodeWithAccessCheck
7807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $sp, 0($sp)                # pass $sp
7815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
7825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_test_suspend
7845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artTestSuspendFromCode
7855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
78657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code when the value in rSUSPEND has been decremented to 0.
7875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
78857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
7895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_test_suspend:
790474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers    lh     $a0, THREAD_FLAGS_OFFSET(rSELF)
7917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $a0, 1f
7927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addi  rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL   # reset rSUSPEND to SUSPEND_CHECK_INTERVAL
7937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
7945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
7955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
7967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a0, rSELF
7977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME          # save callee saves for stack crawl
7987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artTestSuspendFromCode             # (Thread*, $sp)
7997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a1, $sp
8005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
8015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_proxy_invoke_handler
8035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artProxyInvokeHandler
8045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
8055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code that is attempting to call a method on a proxy class. On entry
80657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * r0 holds the proxy method; r1, r2 and r3 may contain arguments.
8075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
80857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
8095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_proxy_invoke_handler:
8105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
8117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw      $a0, 0($sp)            # place proxy method at bottom of frame
8127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF             # pass Thread::Current
8137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artProxyInvokeHandler  # (Method* proxy method, receiver, Thread*, args...)
8147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu   $a3, $sp, 12           # pointer to r2/r3/LR/caller's Method**/out-args as second arg
8157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
8167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#FIXME - offsets here are probably wrong
8177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $ra, 44($sp)           # restore $ra
8187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v0, 12($sp)
8197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v1, 14($sp)
8207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez    $t0, 1f
8217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu   $sp, $sp, 48           # pop frame
8227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
8235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
8245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
8255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
8265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_trace_entry_from_code
8285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artTraceMethodEntryFromCode
8295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
8305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Routine that intercepts method calls
8315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
83257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
8335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_trace_entry_from_code:
8347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu    $sp, $sp, -16
8357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw       $a0, 0($sp)
8367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw       $a1, 4($sp)
8377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw       $a2, 8($sp)
8387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw       $a3, 12($sp)
8397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move     $a2, $ra       # pass $ra
8407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal      artTraceMethodEntryFromCode  # (Method*, Thread*, LR)
8417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move     $a1, rSELF     # pass Thread::Current
8427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move     $t0, $v0       # $t0 holds reference to code
8437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw       $a0, 0($sp)
8447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw       $a1, 4($sp)
8457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw       $a2, 8($sp)
8467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw       $a3, 12($sp)
8477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jalr     $t0            # call method
8487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu    $sp, $sp, 16
8495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* intentional fallthrough */
8505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_trace_exit_from_code
8525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artTraceMethodExitFromCode
8535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
8545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Routine that intercepts method returns
8555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
85657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
8575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_trace_exit_from_code:
8587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu    $sp, $sp, -16
8597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw       $v0, 0($sp)
8607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal      artTraceMethodExitFromCode  # ()
8617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw       $v1, 4($sp)
8627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move     $ra, $v0         # restore link register
8637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw       $v0, 0($sp)
8647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw       $v1, 4($sp)
8657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr       $ra              # return
8667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu    $sp, $sp, 16
8675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_shl_long
8695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
8705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
8715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
8725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
8735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
8745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
8757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
8767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
8777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
8785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
87957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
88057b86d47b66322693a070185fadfb43cb9c12eabIan Rogersart_shl_long:
8815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* shl-long vAA, vBB, vCC */
8827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v0, $a0, $a2                    #  rlo<- alo << (shift&31)
8837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $v1, $a2                         #  rhi<- 31-shift  (shift is 5b)
8847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, 1
8857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, $v1                         #  alo<- alo >> (32-(shift&31))
8867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v1, $a1, $a2                    #  rhi<- ahi << (shift&31)
8877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v1, $a0                         #  rhi<- rhi | alo
8887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift< shift & 0x20
8897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $v0, $a2                    #  rhi<- rlo (if shift&0x20)
8907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
8917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $zero, $a2                   #  rlo<- 0  (if shift&0x20)
8925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_shr_long
8945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
8955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
8965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
8975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
8985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
8995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
9007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
9017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
9027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
9035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
90457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
90557b86d47b66322693a070185fadfb43cb9c12eabIan Rogersart_shr_long:
9067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
9077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
9087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $a3, $a1, 31                     #  $a3<- sign(ah)
9097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
9107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
9117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
9127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
9137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
9147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
9157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
9167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $a3, $a2                    #  rhi<- sign(ahi) (if shift&0x20)
9175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .global art_ushr_long
9195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
9205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
9215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
9225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
9235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
9245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
9255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r0: low word
9265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r1: high word
9275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r2: shift count
9285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
9295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* ushr-long vAA, vBB, vCC */
93057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    ALIGN_FUNCTION_ENTRY
93157b86d47b66322693a070185fadfb43cb9c12eabIan Rogersart_ushr_long:
9327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
9337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
9347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $a3, $a1, 31                     #  $a3<- sign(ah)
9357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
9367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
9377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
9387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
9397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
9407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
9417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
9427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $a3, $a2                    #  rhi<- sign(ahi) (if shift&0x20)
9437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao
9447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    .global art_indexof
9457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    ALIGN_FUNCTION_ENTRY
9467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoart_indexof:
9477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr $ra
9487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao
9497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    .global art_string_compareto
9507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    ALIGN_FUNCTION_ENTRY
9517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoart_string_compareto:
9527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr $ra
953