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
177655f29fabc0a12765de828914a18314382e5a35Ian Rogers#include "asm_support_mips.S"
185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
190703060875166106af3d490c6c264611aea67ec8jeffhao    .set noreorder
205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .balign 4
215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* Deliver the given exception */
235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artDeliverExceptionFromCode
245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* Deliver an exception pending on a thread */
258161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    .extern artDeliverPendingExceptionFromCode
265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kSaveAll)
301f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao     * callee-save: $s0-$s8 + $gp + $ra, 11 total + 1 word padding + 4 open words for args
315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
3257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.macro SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
33fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    addiu  $sp, $sp, -64
34d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset 64
35fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $ra, 60($sp)
36d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 31, 60
37fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $s8, 56($sp)
38d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 30, 56
391f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $gp, 52($sp)
401f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 28, 52
411f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s7, 48($sp)
421f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 23, 48
431f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s6, 44($sp)
441f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 22, 44
451f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s5, 40($sp)
461f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 21, 40
471f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s4, 36($sp)
481f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 20, 36
491f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s3, 32($sp)
501f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 19, 32
511f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s2, 28($sp)
521f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 18, 28
531f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s1, 24($sp)
541f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 17, 24
551f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s0, 20($sp)
561f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 16, 20
571f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    # 1 word for alignment, 4 open words for args $a0-$a3, bottom will hold Method*
585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC.
635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Does not include rSUSPEND or rSELF
641f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao     * callee-save: $s2-$s8 + $gp + $ra, 9 total + 3 words padding + 4 open words for args
655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_ONLY_CALLEE_SAVE_FRAME
674eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, -64
68d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset 64
694eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $ra, 60($sp)
70d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 31, 60
714eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $s8, 56($sp)
72d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 30, 56
731f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $gp, 52($sp)
741f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 28, 52
751f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s7, 48($sp)
761f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 23, 48
771f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s6, 44($sp)
781f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 22, 44
791f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s5, 40($sp)
801f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 21, 40
811f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s4, 36($sp)
821f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 20, 36
831f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s3, 32($sp)
841f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 19, 32
851f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s2, 28($sp)
861f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 18, 28
87fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    # 3 words for alignment and extra args, 4 open words for args $a0-$a3, bottom will hold Method*
885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
911f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    lw     $gp, 52($sp)
924eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $ra, 60($sp)
934eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, 64
94d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -64
955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
981f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    lw     $gp, 52($sp)
994eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $ra, 60($sp)
1007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
1014eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, 64
102d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -64
1035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
1075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC.
1081f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao     * callee-save: $a1-$a3, $s2-$s8 + $gp + $ra, 12 total + 3 words padding + method*
1095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
1111f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    addiu  $sp, $sp, -64
1121f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_adjust_cfa_offset 64
1131f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $ra, 60($sp)
1141f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 31, 60
1151f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s8, 56($sp)
1161f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 30, 56
1171f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $gp, 52($sp)
1181f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 28, 52
1191f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s7, 48($sp)
1201f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 23, 48
1211f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s6, 44($sp)
1221f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 22, 44
1231f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s5, 40($sp)
1241f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 21, 40
1251f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s4, 36($sp)
1261f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 20, 36
1271f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s3, 32($sp)
1281f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 19, 32
1291f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s2, 28($sp)
1301f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 18, 28
1317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a3, 12($sp)
132d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 7, 12
1337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a2, 8($sp)
134d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 6, 8
1357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a1, 4($sp)
136d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 5, 4
137fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    # bottom will hold Method*
1385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
1411f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    lw     $ra, 60($sp)           # restore $ra
1421f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    lw     $gp, 52($sp)           # restore $gp
1437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a1, 4($sp)            # restore non-callee save $a1
1447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a2, 8($sp)            # restore non-callee save $a2
1457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a3, 12($sp)           # restore non-callee save $a3
146468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    addiu  $sp, $sp, 64           # pop frame
1471f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_adjust_cfa_offset -64
1485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending
1525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception is Thread::Current()->exception_
1535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro DELIVER_PENDING_EXCEPTION
1558161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME     # save callee saves for throw
1568161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move    $a0, rSELF                   # pass Thread::Current
1578161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la      $t9, artDeliverPendingExceptionFromCode
1588161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr      $t9                          # artDeliverPendingExceptionFromCode(Thread*, $sp)
1598161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move    $a1, $sp                     # pass $sp
1605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NO_EXCEPTION
1637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
1645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
1658161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    bnez   $t0, 1f                       # success if no exception is pending
1665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
1685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
1705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
1715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_ZERO
1745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
1757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $v0, 1f                       # success?
1765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra                           # return on success
1785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
1805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
1815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NONZERO
1845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
1857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    beqz   $v0, 1f                       # success?
1865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra                           # return on success
1885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
1905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
1915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * On entry $a0 is uint32_t* gprs_ and $a1 is uint32_t* fprs_
1955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * FIXME: just guessing about the shape of the jmpbuf.  Where will pc be?
1965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
197d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_do_long_jump
1987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f0, 0($a1)
1997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f1, 4($a1)
2007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f2, 8($a1)
2017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f3, 12($a1)
2027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f4, 16($a1)
2037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f5, 20($a1)
2047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f6, 24($a1)
2057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f7, 28($a1)
2067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f8, 32($a1)
2077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f9, 36($a1)
2087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f10, 40($a1)
2097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f11, 44($a1)
2107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f12, 48($a1)
2117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f13, 52($a1)
2127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f14, 56($a1)
2137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f15, 60($a1)
2147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f16, 64($a1)
2157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f17, 68($a1)
2167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f18, 72($a1)
2177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f19, 76($a1)
2187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f20, 80($a1)
2197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f21, 84($a1)
2207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f22, 88($a1)
2217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f23, 92($a1)
2227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f24, 96($a1)
2237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f25, 100($a1)
2247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f26, 104($a1)
2257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f27, 108($a1)
2267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f28, 112($a1)
2277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f29, 116($a1)
2287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f30, 120($a1)
2297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f31, 124($a1)
2307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $at, 4($a0)
2317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v0, 8($a0)
2327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v1, 12($a0)
2337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a1, 20($a0)
2347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a2, 24($a0)
2357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a3, 28($a0)
2367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, 32($a0)
2377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t1, 36($a0)
2387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t2, 40($a0)
2397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t3, 44($a0)
2407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t4, 48($a0)
2417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t5, 52($a0)
2427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t6, 56($a0)
2437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t7, 60($a0)
2447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s0, 64($a0)
2457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s1, 68($a0)
2467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s2, 72($a0)
2477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s3, 76($a0)
2487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s4, 80($a0)
2497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s5, 84($a0)
2507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s6, 88($a0)
2517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s7, 92($a0)
2527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t8, 96($a0)
2537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t9, 100($a0)
2547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $k0, 104($a0)
2557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $k1, 108($a0)
2567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $gp, 112($a0)
2577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $sp, 116($a0)
2587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $fp, 120($a0)
2597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $ra, 124($a0)
2607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a0, 16($a0)
2617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v0, $zero          # clear result registers r0 and r1
2627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra                 # do long jump
2637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v1, $zero
264d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_do_long_jump
2655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code, saves most registers (forms basis of long jump context) and passes
2685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at
2695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the thread. On entry r0 holds Throwable*
2705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
271468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_deliver_exception
27212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
27357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
2748161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, rSELF                 # pass Thread::Current
2758161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artDeliverExceptionFromCode
2768161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artDeliverExceptionFromCode(Throwable*, Thread*, $sp)
2778161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a2, $sp                   # pass $sp
278468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_deliver_exception
2795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver a NullPointerException
2825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
283d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNullPointerExceptionFromCode
284468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_null_pointer_exception
28512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
28657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
2878161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a0, rSELF                 # pass Thread::Current
2888161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNullPointerExceptionFromCode
2898161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowNullPointerExceptionFromCode(Thread*, $sp)
2908161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, $sp                   # pass $sp
291468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_null_pointer_exception
2925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArithmeticException
2955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
296d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowDivZeroFromCode
297468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_div_zero
29812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
29957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a0, rSELF                 # pass Thread::Current
3018161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowDivZeroFromCode
3028161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowDivZeroFromCode(Thread*, $sp)
3037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a1, $sp                   # pass $sp
304468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_div_zero
3055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException
3085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
309d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowArrayBoundsFromCode
310468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_array_bounds
31112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
31257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3138161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a2, rSELF                 # pass Thread::Current
3148161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowArrayBoundsFromCode
3158161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowArrayBoundsFromCode(index, limit, Thread*, $sp)
3168161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a3, $sp                   # pass $sp
317468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_array_bounds
3185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
31957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
32057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a StackOverflowError.
32157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
322d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowStackOverflowFromCode
323468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_stack_overflow
32412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
32557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3268161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a0, rSELF                 # pass Thread::Current
3278161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowStackOverflowFromCode
3288161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowStackOverflowFromCode(Thread*, $sp)
3298161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, $sp                   # pass $sp
330468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_stack_overflow
3315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
33257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
33357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a NoSuchMethodError.
33457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
335d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNoSuchMethodFromCode
336468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_no_such_method
33712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
33857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3398161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, rSELF                 # pass Thread::Current
3408161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNoSuchMethodFromCode
3418161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowNoSuchMethodFromCode(method_idx, Thread*, $sp)
3428161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a2, $sp                   # pass $sp
343468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_no_such_method
3445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * All generated callsites for interface invokes and invocation slow paths will load arguments
3477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain
3485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the method_idx.  This wrapper will save arg1-arg3, load the caller's Method*, align the
3495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * stack and call the appropriate C helper.
3507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1.
3515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
3527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting
3537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * of the target Method* in $v0 and method->code_ in $v1.
3545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
355fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao     * If unsuccessful, the helper will return NULL/NULL. There will be a pending exception in the
3565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * thread and we branch to another stub to deliver it.
3575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
3585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On success this wrapper will restore arguments and *jump* to the target, leaving the lr
3595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * pointing back to the original caller.
3605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
3615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name
3625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern \cxx_name
363d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY \c_name
36412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
3657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME  # save callee saves in case allocation triggers GC
3661f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    lw    $a2, 64($sp)                    # pass caller Method*
367fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move  $t0, $sp                        # save $sp
36858df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, -32                   # make space for extra args
36958df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset 32
3707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move  $a3, rSELF                      # pass Thread::Current
371d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 28, 12
3727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal   \cxx_name                       # (method_idx, this, caller, Thread*, $sp)
373fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw    $t0, 16($sp)                    # pass $sp
37458df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, 32                    # release out args
37558df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset -32
376fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move  $a0, $v0                        # save target Method*
37730a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    move  $t9, $v1                        # save $v0->code_
3785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
379fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    beqz  $v0, 1f
3805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
38130a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    jr    $t9
3825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
3835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
3845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
385d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND \c_name
3865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
3875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3888dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline
3898dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck
3905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3918dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck
3928dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck
3938dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck
3948dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck
3955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
39679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    /*
3976474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao     * Common invocation stub for portable and quick.
3985d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     * On entry:
3995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a0 = method pointer
4005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a1 = argument array or NULL for no argument methods
4015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a2 = size of argument array in bytes
4025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a3 = (managed) thread pointer
4036474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao     *   [sp + 16] = JValue* result
4046474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao     *   [sp + 20] = result type char
4055d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     */
40679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    .type art_portable_invoke_stub, %function
40779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    .global art_portable_invoke_stub
4086474d190d5604898354ebf767f1944b6e3e9b445Jeff Haoart_portable_invoke_stub:
4095d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoENTRY art_quick_invoke_stub
4105d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    GENERATE_GLOBAL_POINTER
4115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $a0, 0($sp)           # save out a0
4125d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # spill s0, s1, fp, ra
4135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset 16
4145d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $ra, 12($sp)
4155d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 31, 12
4165d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $fp, 8($sp)
4175d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 30, 8
4185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s1, 4($sp)
4195d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 17, 4
4205d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s0, 0($sp)
4215d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 16, 0
4225d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $fp, $sp              # save sp in fp
4235d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_def_cfa_register 30
4245d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $s1, $a3              # move managed thread pointer into s1
4255d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $s0, $zero, SUSPEND_CHECK_INTERVAL  # reset s0 to suspend check interval
4265d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $t0, $a2, 16          # create space for method pointer in frame
4275d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    srl   $t0, $t0, 3           # shift the frame size right 3
4285d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sll   $t0, $t0, 3           # shift the frame size left 3 to align to 16 bytes
4295d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    subu  $sp, $sp, $t0         # reserve stack space for argument array
4305d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $a0, $sp, 4           # pass stack pointer + method ptr as dest for memcpy
4315d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jal   memcpy                # (dest, src, bytes)
4325d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # make space for argument slots for memcpy
4335d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16          # restore stack after memcpy
4345d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a0, 16($fp)          # restore method*
4355d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a1, 4($sp)           # copy arg value for a1
4365d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a2, 8($sp)           # copy arg value for a2
4375d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a3, 12($sp)          # copy arg value for a3
4385d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $t9, METHOD_CODE_OFFSET($a0)  # get pointer to the code
4395d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jalr  $t9                   # call the method
4405d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $zero, 0($sp)         # store NULL for method* at bottom of frame
4415d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $sp, $fp              # restore the stack
4425d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s0, 0($sp)
4435d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s1, 4($sp)
4445d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $fp, 8($sp)
4455d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $ra, 12($sp)
4465d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16
4475d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset -16
4485d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $t0, 16($sp)          # get result pointer
4496474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    lw    $t1, 20($sp)          # get result type char
4506474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t2, 68               # put char 'D' into t2
4516474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t2, 1f          # branch if result type char == 'D'
4526474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t3, 70               # put char 'F' into t3
4536474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t3, 1f          # branch if result type char == 'F'
4545d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v0, 0($t0)           # store the result
4556474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    jr    $ra
4565d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v1, 4($t0)           # store the other half of the result
4576474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao1:
45819ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao    s.s   $f0, 0($t0)           # store floating point result
4595d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jr    $ra
46019ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao    s.s   $f1, 4($t0)           # store other half of floating point result
4615d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoEND art_quick_invoke_stub
4626474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    .size art_portable_invoke_stub, .-art_portable_invoke_stub
4635d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao
4645d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    /*
4655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on
4665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * failure.
4675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
468d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artHandleFillArrayDataFromCode
469468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_handle_fill_data
47012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
4717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
4727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
4737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artHandleFillArrayDataFromCode     # (Array*, const DexFile::Payload*, Thread*, $sp)
4747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
475fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    RETURN_IF_ZERO
476468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_handle_fill_data
4775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
47957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code that calls artLockObjectFromCode, may block for GC.
4805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
481d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artLockObjectFromCode
482468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_lock_object
48312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
4847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME      # save callee saves in case we block
4857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                    # pass Thread::Current
4867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artLockObjectFromCode         # (Object* obj, Thread*, $sp)
4877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, $sp                      # pass $sp
4885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
489468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_lock_object
4905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
4925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure.
4935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
494d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artUnlockObjectFromCode
495468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_unlock_object
49612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
4977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
4987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                # pass Thread::Current
4997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artUnlockObjectFromCode   # (Object* obj, Thread*, $sp)
5007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, $sp                  # pass $sp
5015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
502468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_unlock_object
5035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure.
5065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
507d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artCheckCastFromCode
508468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_cast
50912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
5107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
5117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
5127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artCheckCastFromCode      # (Class* a, Class* b, Thread*, $sp)
5137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
5145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
515468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_cast
5165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artCanPutArrayElementFromCode and delivers exception on
5195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * failure.
5205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
521d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artCanPutArrayElementFromCode
522468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_can_put_array_element
52312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
5247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case exception allocation triggers GC
5257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                     # pass Thread::Current
5267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artCanPutArrayElementFromCode  # (Object* element, Class* array_class, Thread*, $sp)
5277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                       # pass $sp
5285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
529468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_can_put_array_element
5305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when uninitialized static storage, this stub will run the class
5335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * initializer and deliver the exception on error. On success the static storage base is
5345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * returned.
5355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
536d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeStaticStorageFromCode
537468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_static_storage
53812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
5397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME            # save callee saves in case of GC
5407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                          # pass Thread::Current
5417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
5425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeStaticStorageFromCode
5437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                            # pass $sp
5445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
545468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_static_storage
5465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
54857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code when dex cache misses for a type_idx.
5495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
550d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeTypeFromCode
551468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type
55212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
5537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
5547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
5557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
5565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeFromCode
5577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
5585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
559468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type
5605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when type_idx needs to be checked for access and dex cache may also
56357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * miss.
5645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
565d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeTypeAndVerifyAccessFromCode
566468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type_and_verify_access
56712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
5687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
5697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
5707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
5715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeAndVerifyAccessFromCode
5727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
5735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
574468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type_and_verify_access
5755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
57757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 32-bit primitive value.
5785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
579d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32StaticFromCode
580468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_static
58112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
5827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
5834eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
5847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
585fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet32StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
5867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
5875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
588468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_static
5895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
59157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 64-bit primitive value.
5925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
593d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64StaticFromCode
594468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_static
59512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
5967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
5974eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
5987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
599fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet64StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
6007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
6015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
602468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_static
6035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
60557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load an object reference.
6065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
607d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjStaticFromCode
608468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_static
60912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
6107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
6114eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
6127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
613fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGetObjStaticFromCode       # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
6147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
6155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
616468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_static
6175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
61957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 32-bit primitive value.
6205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
621d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32InstanceFromCode
622468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_instance
62312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
6247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
6254eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
6267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
627fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet32InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
6284eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
6295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
630468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_instance
6315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
63357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 64-bit primitive value.
6345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
635d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64InstanceFromCode
636468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_instance
63712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
6387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
6394eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
6407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
641fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet64InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
6424eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
6435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
644468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_instance
6455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
64757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load an object reference.
6485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
649d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjInstanceFromCode
650468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_instance
65112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
6527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
6534eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
6547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
655fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGetObjInstanceFromCode     # (field_idx, Object*, referrer, Thread*, $sp)
6564eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
6575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
658468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_instance
6595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
66157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 32-bit primitive value.
6625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
663d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32StaticFromCode
664468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_static
66512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
6667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
6674eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
6687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
669fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSet32StaticFromCode        # (field_idx, new_val, referrer, Thread*, $sp)
6704eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
6715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
672468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_static
6735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
67557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 64-bit primitive value.
6765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
677d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32StaticFromCode
678468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_static
67912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
6807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
6814eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
682fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
6837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artSet64StaticFromCode        # (field_idx, referrer, new_val, Thread*, $sp)
6844eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
6855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
686468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_static
6875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
68957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store an object reference.
6905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
691d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjStaticFromCode
692468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_static
69312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
6947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
6954eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
6967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
697fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSetObjStaticFromCode       # (field_idx, new_val, referrer, Thread*, $sp)
6984eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
6995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
700468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_static
7015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
70357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 32-bit primitive value.
7045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
705d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32InstanceFromCode
706468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_instance
70712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7094eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a3, 64($sp)                  # pass referrer's Method*
710fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
7117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artSet32InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*, $sp)
7124eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
7135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
714468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_instance
7155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
71757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 64-bit primitive value.
7185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
719d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32InstanceFromCode
720468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_instance
72112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
723fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
724fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSet64InstanceFromCode      # (field_idx, Object*, new_val, Thread*, $sp)
7254eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
7265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
727468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_instance
7285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
73057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store an object reference.
7315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
732d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjInstanceFromCode
733468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_instance
73412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7364eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a3, 64($sp)                  # pass referrer's Method*
737fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
738fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSetObjInstanceFromCode     # (field_idx, Object*, new_val, referrer, Thread*, $sp)
7394eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
7405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
741468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_instance
7425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
7445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code to resolve a string, this stub will allocate a String and deliver an
7455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception on error. On success the String is returned. R0 holds the referring method,
7465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * R1 holds the string index. The fast path check for hit in strings cache has already been
7475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * performed.
7485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
749d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artResolveStringFromCode
750468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolve_string
75112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
7537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
7547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*, $sp)
7555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artResolveStringFromCode
7567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
757fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    RETURN_IF_NONZERO
758468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolve_string
7595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
76157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to allocate an object.
7625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
763d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artAllocObjectFromCode
764468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_alloc_object
76512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
7677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
7687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artAllocObjectFromCode    # (uint32_t type_idx, Method* method, Thread*, $sp)
7697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
7705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
771468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_alloc_object
7725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
7745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to allocate an object when the caller doesn't know whether it has
77557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * access to the created type.
7765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
777d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artAllocObjectFromCodeWithAccessCheck
778468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_alloc_object_with_access_check
77912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
7817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
7827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artAllocObjectFromCodeWithAccessCheck  # (uint32_t type_idx, Method* method, Thread*, $sp)
7837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
7845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
785468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_alloc_object_with_access_check
7865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
78857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to allocate an array.
7895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
790d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artAllocArrayFromCode
791468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_alloc_array
79212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
7947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, rSELF                # pass Thread::Current
7957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t component_count, Thread*, $sp)
7965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artAllocArrayFromCode
7974eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw      $sp, 16($sp)              # pass $sp
7985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
799468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_alloc_array
8005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
8025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to allocate an array when the caller doesn't know whether it has
80357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * access to the created type.
8045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
805d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artAllocArrayFromCodeWithAccessCheck
806468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_alloc_array_with_access_check
80712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
8097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, rSELF                # pass Thread::Current
8107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artAllocArrayFromCodeWithAccessCheck(type_idx, method, component_count, Thread*, $sp)
8115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artAllocArrayFromCodeWithAccessCheck
8124eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw      $sp, 16($sp)              # pass $sp
8135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
814468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_alloc_array_with_access_check
8155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
81757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY.
8185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
819d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artCheckAndAllocArrayFromCode
820468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_and_alloc_array
82112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
8237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, rSELF                # pass Thread::Current
8247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artCheckAndAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t count, Thread* , $sp)
8255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artCheckAndAllocArrayFromCode
8264eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw      $sp, 16($sp)              # pass $sp
8275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
828468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_and_alloc_array
8295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
83157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY.
8325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
833d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artCheckAndAllocArrayFromCodeWithAccessCheck
834468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_and_alloc_array_with_access_check
83512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
837fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move    $a3, rSELF                # pass Thread::Current
8387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artCheckAndAllocArrayFromCodeWithAccessCheck(type_idx, method, count, Thread* , $sp)
8395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artCheckAndAllocArrayFromCodeWithAccessCheck
8404eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw      $sp, 16($sp)              # pass $sp
8415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
842468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_and_alloc_array_with_access_check
8435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
84557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code when the value in rSUSPEND has been decremented to 0.
8465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
847d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artTestSuspendFromCode
848d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_test_suspend
84912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
850474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers    lh     $a0, THREAD_FLAGS_OFFSET(rSELF)
8517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $a0, 1f
8527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addi  rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL   # reset rSUSPEND to SUSPEND_CHECK_INTERVAL
8537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
8545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
8555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
8567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a0, rSELF
8577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME          # save callee saves for stack crawl
8587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artTestSuspendFromCode             # (Thread*, $sp)
8597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a1, $sp
8605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
861d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_test_suspend
8625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
8645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code that is attempting to call a method on a proxy class. On entry
86557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * r0 holds the proxy method; r1, r2 and r3 may contain arguments.
8665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
8675fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    .extern artQuickProxyInvokeHandler
868d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_proxy_invoke_handler
86912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
8717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw      $a0, 0($sp)            # place proxy method at bottom of frame
8727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF             # pass Thread::Current
8735fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    jal     artQuickProxyInvokeHandler  # (Method* proxy method, receiver, Thread*, SP)
874af6e67a4816d2593586115b89faa659225363246Ian Rogers    move    $a3, $sp               # pass $sp
8757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
8761f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    lw      $gp, 52($sp)           # restore $gp
8771f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    lw      $ra, 60($sp)           # restore $ra
8787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez    $t0, 1f
8791f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    addiu   $sp, $sp, 64           # pop frame
8801f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_adjust_cfa_offset -64
8817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
8825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
8835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
8845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
885d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_proxy_invoke_handler
8865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
887468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .extern artQuickResolutionTrampoline
888468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolution_trampoline
889468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    GENERATE_GLOBAL_POINTER
890468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
891468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    move    $a2, rSELF             # pass Thread::Current
892eb1efc4575e93543ed459c7ee5c6c36109e69b5fIan Rogers    jal     artQuickResolutionTrampoline  # (Method* called, receiver, Thread*, SP)
893468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    move    $a3, $sp               # pass $sp
894468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    lw      $gp, 52($sp)           # restore $gp
895468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    lw      $ra, 60($sp)           # restore $ra
896468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    beqz    $v0, 1f
897468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    lw      $a0, 0($sp)            # load resolved method to $a0
898468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    lw      $a1, 4($sp)            # restore non-callee save $a1
899468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    lw      $a2, 8($sp)            # restore non-callee save $a2
900468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    lw      $a3, 12($sp)           # restore non-callee save $a3
901eb1efc4575e93543ed459c7ee5c6c36109e69b5fIan Rogers    move    $t9, $v0               # code pointer must be in $t9 to generate the global pointer
902468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    jr      $v0                    # tail call to method
903468532ea115657709bc32ee498e701a4c71762d4Ian Rogers1:
904468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    addiu   $sp, $sp, 64           # pop frame
905468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .cfi_adjust_cfa_offset -64
906468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    DELIVER_PENDING_EXCEPTION
907468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolution_trampoline
908468532ea115657709bc32ee498e701a4c71762d4Ian Rogers
909468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .extern artQuickToInterpreterBridge
910468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_to_interpreter_bridge
9117db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    GENERATE_GLOBAL_POINTER
9127db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
9137db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    move    $a1, rSELF             # pass Thread::Current
914468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    jal     artQuickToInterpreterBridge    # (Method* method, Thread*, SP)
9157db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    move    $a2, $sp               # pass $sp
9167db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
9171f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    lw      $gp, 52($sp)           # restore $gp
9181f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    lw      $ra, 60($sp)           # restore $ra
9197db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    bnez    $t0, 1f
9201f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    addiu   $sp, $sp, 64           # pop frame
9211f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_adjust_cfa_offset -64
9227db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    jr      $ra
9237db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    nop
9247db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers1:
9257db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    DELIVER_PENDING_EXCEPTION
926468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_to_interpreter_bridge
9277db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers
9285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
929725a957985171d712d5c048cc3d00ff14968784bjeffhao     * Routine that intercepts method calls and returns.
9305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
931d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodEntryFromCode
932d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodExitFromCode
933468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_instrumentation_entry
93412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
93562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
93612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $sp       # remember bottom of caller's frame
93762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, -32  # space for args, pad (3 words), arguments (5 words)
93862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset 32
93962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $a0, 28($sp)   # save arg0
94062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $ra, 16($sp)   # pass $ra
94162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a3, $t0       # pass $sp
94262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artInstrumentationMethodEntryFromCode  # (Method*, Object*, Thread*, SP, LR)
94362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, rSELF     # pass Thread::Current
9448161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move     $t9, $v0       # $t9 holds reference to code
94562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $a0, 28($sp)   # restore arg0
94662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, 32   # remove args
94762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset -32
94862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
9498161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jalr     $t9            # call method
95062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    nop
951468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_entry
9525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* intentional fallthrough */
953468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .global art_quick_instrumentation_exit
954468532ea115657709bc32ee498e701a4c71762d4Ian Rogersart_quick_instrumentation_exit:
955d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_startproc
95612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    addiu    $t9, $ra, 4    # put current address into $t9 to rebuild $gp
95712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
95812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $sp       # remember bottom of caller's frame
95962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    SETUP_REF_ONLY_CALLEE_SAVE_FRAME
96062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, -48  # save return values and set up args
96162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset 48
96262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $v0, 32($sp)
963d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 2, 0
96462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $v1, 36($sp)
965d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 3, 4
96662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f0, 40($sp)
96762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f1, 44($sp)
96862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f0, 16($sp)   # pass fpr result
96962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f1, 20($sp)
97062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, $v0       # pass gpr result
97162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a3, $v1
97212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $a1, $t0       # pass $sp
97362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artInstrumentationMethodExitFromCode  # (Thread*, SP, gpr_res, fpr_res)
97412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $a0, rSELF     # pass Thread::Current
97512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $v0       # set aside returned link register
97612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $ra, $v1       # set link register for deoptimization
97762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $v0, 32($sp)   # restore return values
97862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $v1, 36($sp)
97962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    l.s      $f0, 40($sp)
98062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    l.s      $f1, 44($sp)
98112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    jr       $t0            # return
98262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, 112  # 48 bytes of args + 64 bytes of callee save frame
98362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset -112
984468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_exit
9855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
98612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    /*
98762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization
98862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * will long jump to the upcall with a special exception of -1.
98912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao     */
990d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artDeoptimize
991d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artEnterInterpreterFromDeoptimize
992d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deoptimize
99312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
99414dd5a82ad85a28612bf86e755ff929d767cea4cJeff Hao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
99562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a0, rSELF     # pass Thread::current
99662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artDeoptimize  # artDeoptimize(Thread*, SP)
99712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao                            # Returns caller method's frame size.
99862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a1, $sp       # pass $sp
999d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deoptimize
100012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao
10015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
10025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
10035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
10045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
10055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
10065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
10077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
10087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
10097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
10105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1011d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shl_long
10125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* shl-long vAA, vBB, vCC */
10137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v0, $a0, $a2                    #  rlo<- alo << (shift&31)
10147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $v1, $a2                         #  rhi<- 31-shift  (shift is 5b)
10157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, 1
10167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, $v1                         #  alo<- alo >> (32-(shift&31))
10177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v1, $a1, $a2                    #  rhi<- ahi << (shift&31)
10187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v1, $a0                         #  rhi<- rhi | alo
10197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift< shift & 0x20
10207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $v0, $a2                    #  rhi<- rlo (if shift&0x20)
10217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1022fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    movn    $v0, $zero, $a2                  #  rlo<- 0  (if shift&0x20)
1023d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shl_long
10245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
10255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
10265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
10275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
10285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
10295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
10305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
10317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
10327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
10337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
10345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1035d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .global art_quick_shr_long
1036d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shr_long
10377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
10387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
10397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $a3, $a1, 31                     #  $a3<- sign(ah)
10407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
10417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
10427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
10437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
10447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
10457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
10467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
10477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $a3, $a2                    #  rhi<- sign(ahi) (if shift&0x20)
1048d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shr_long
10495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
10505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
10515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
10525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
10535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
10545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
10555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
10565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r0: low word
10575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r1: high word
10585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r2: shift count
10595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
10605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* ushr-long vAA, vBB, vCC */
1061d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .global art_quick_ushr_long
1062d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_ushr_long
1063fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    srl     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
10647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
10657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
10667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
10677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
10687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
10697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
10707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
10717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1072fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    movn    $v1, $zero, $a2                  #  rhi<- 0 (if shift&0x20)
1073d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_ushr_long
10747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao
1075d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_indexof
10767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr $ra
10770703060875166106af3d490c6c264611aea67ec8jeffhao    nop
1078d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_indexof
10797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao
1080d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_string_compareto
10817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr $ra
10820703060875166106af3d490c6c264611aea67ec8jeffhao    nop
1083d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_string_compareto
1084