quick_entrypoints_mips.S revision 79fe539587d4c09244172d0168eeed0ec9770466
10f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes/*
20f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Copyright (C) 2012 The Android Open Source Project
30f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes *
40f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
50f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * you may not use this file except in compliance with the License.
60f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * You may obtain a copy of the License at
70f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes *
80f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
90f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes *
100f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Unless required by applicable law or agreed to in writing, software
110f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
120f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * See the License for the specific language governing permissions and
140f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * limitations under the License.
150f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes */
160f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes
175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee#include "asm_support.h"
185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
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
2757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /* Cache alignment for function entry */
28d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao.macro ENTRY name
29d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .type \name, %function
30d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .global \name
3157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    .balign 16
32d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao\name:
33d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_startproc
34d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao.endm
35d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao
36d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao.macro END name
37d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_endproc
38d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .size \name, .-\name
3957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.endm
4057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
4112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    /* Generates $gp for function calls */
4212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao.macro GENERATE_GLOBAL_POINTER
4312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    .cpload $t9
4412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao.endm
4512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao
465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kSaveAll)
49fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao     * callee-save: $s0-$s8 + $ra, 10 total + 4 words
505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
5157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.macro SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
52fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    addiu  $sp, $sp, -64
53d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset 64
54fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $ra, 60($sp)
55d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 31, 60
56fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $s8, 56($sp)
57d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 30, 56
58fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $s7, 52($sp)
59d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 23, 52
60fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $s6, 48($sp)
61d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 22, 48
62fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $s5, 44($sp)
63d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 21, 44
64fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $s4, 40($sp)
65d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 20, 40
66fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $s3, 36($sp)
67d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 19, 36
68fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $s2, 32($sp)
69d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 18, 32
70fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $s1, 28($sp)
71d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 17, 28
72fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $s0, 24($sp)
73d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 16, 24
74fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    # 2 words for alignment, 4 open words for args $a0-$a3, bottom will hold Method*
755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC.
805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Does not include rSUSPEND or rSELF
81fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao     * callee-save: $s2-$s8 + $ra, 8 total + 4 words + extra args + gp
825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_ONLY_CALLEE_SAVE_FRAME
844eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, -64
85d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset 64
864eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $ra, 60($sp)
87d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 31, 60
884eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $s8, 56($sp)
89d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 30, 56
904eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $s7, 52($sp)
91d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 23, 52
924eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $s6, 48($sp)
93d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 22, 48
944eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $s5, 44($sp)
95d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 21, 44
964eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $s4, 40($sp)
97d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 20, 40
984eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $s3, 36($sp)
99d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 19, 36
1004eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $s2, 32($sp)
101d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 18, 32
102fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    sw     $gp, 28($sp)
103d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 28, 28
104fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    # 3 words for alignment and extra args, 4 open words for args $a0-$a3, bottom will hold Method*
1055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
108fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    lw     $gp, 28($sp)
1094eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $ra, 60($sp)
1104eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, 64
111d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -64
1125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
1154eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $ra, 60($sp)
1167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
1174eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, 64
118d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -64
1195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
1235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC.
124fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao     * $a1-$a3, $s2-$s8, $ra, 11 total + Method*
1255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
1270703060875166106af3d490c6c264611aea67ec8jeffhao    addiu  $sp, $sp, -48
128d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset 48
1297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $ra, 44($sp)
130d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 31, 44
1317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s8, 40($sp)
132d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 30, 40
1337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s7, 36($sp)
134d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 23, 36
1357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s6, 32($sp)
136d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 22, 32
1377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s5, 28($sp)
138d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 21, 28
1397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s4, 24($sp)
140d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 20, 24
1417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s3, 20($sp)
142d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 19, 20
1437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $s2, 16($sp)
144d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 18, 16
1457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a3, 12($sp)
146d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 7, 12
1477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a2, 8($sp)
148d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 6, 8
1497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a1, 4($sp)
150d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 5, 4
151fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    # bottom will hold Method*
1525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
1557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $ra, 44($sp)           # restore $ra
1567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a1, 4($sp)            # restore non-callee save $a1
1577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a2, 8($sp)            # restore non-callee save $a2
1587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $a3, 12($sp)           # restore non-callee save $a3
1597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu  $sp, $sp, 48           # strip frame
160d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -48
1615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending
1655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception is Thread::Current()->exception_
1665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro DELIVER_PENDING_EXCEPTION
1688161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME     # save callee saves for throw
1698161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move    $a0, rSELF                   # pass Thread::Current
1708161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la      $t9, artDeliverPendingExceptionFromCode
1718161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr      $t9                          # artDeliverPendingExceptionFromCode(Thread*, $sp)
1728161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move    $a1, $sp                     # pass $sp
1735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NO_EXCEPTION
1767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
1775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
1788161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    bnez   $t0, 1f                       # success if no exception is pending
1795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
1815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
1835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
1845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_ZERO
1875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
1887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $v0, 1f                       # success?
1895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra                           # return on success
1915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
1925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
1935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
1945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NONZERO
1975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
1987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    beqz   $v0, 1f                       # success?
1995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra                           # return on success
2015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
2035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
2045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * On entry $a0 is uint32_t* gprs_ and $a1 is uint32_t* fprs_
2085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * FIXME: just guessing about the shape of the jmpbuf.  Where will pc be?
2095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
210d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_do_long_jump
2117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f0, 0($a1)
2127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f1, 4($a1)
2137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f2, 8($a1)
2147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f3, 12($a1)
2157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f4, 16($a1)
2167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f5, 20($a1)
2177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f6, 24($a1)
2187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f7, 28($a1)
2197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f8, 32($a1)
2207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f9, 36($a1)
2217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f10, 40($a1)
2227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f11, 44($a1)
2237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f12, 48($a1)
2247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f13, 52($a1)
2257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f14, 56($a1)
2267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f15, 60($a1)
2277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f16, 64($a1)
2287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f17, 68($a1)
2297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f18, 72($a1)
2307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f19, 76($a1)
2317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f20, 80($a1)
2327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f21, 84($a1)
2337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f22, 88($a1)
2347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f23, 92($a1)
2357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f24, 96($a1)
2367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f25, 100($a1)
2377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f26, 104($a1)
2387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f27, 108($a1)
2397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f28, 112($a1)
2407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f29, 116($a1)
2417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f30, 120($a1)
2427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f31, 124($a1)
2437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $at, 4($a0)
2447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v0, 8($a0)
2457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v1, 12($a0)
2467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a1, 20($a0)
2477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a2, 24($a0)
2487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a3, 28($a0)
2497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, 32($a0)
2507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t1, 36($a0)
2517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t2, 40($a0)
2527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t3, 44($a0)
2537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t4, 48($a0)
2547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t5, 52($a0)
2557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t6, 56($a0)
2567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t7, 60($a0)
2577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s0, 64($a0)
2587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s1, 68($a0)
2597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s2, 72($a0)
2607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s3, 76($a0)
2617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s4, 80($a0)
2627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s5, 84($a0)
2637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s6, 88($a0)
2647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s7, 92($a0)
2657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t8, 96($a0)
2667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t9, 100($a0)
2677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $k0, 104($a0)
2687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $k1, 108($a0)
2697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $gp, 112($a0)
2707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $sp, 116($a0)
2717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $fp, 120($a0)
2727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $ra, 124($a0)
2737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a0, 16($a0)
2747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v0, $zero          # clear result registers r0 and r1
2757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra                 # do long jump
2767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v1, $zero
277d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_do_long_jump
2785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code, saves most registers (forms basis of long jump context) and passes
2815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at
2825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the thread. On entry r0 holds Throwable*
2835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
284d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deliver_exception_from_code
28512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
28657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
2878161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, rSELF                 # pass Thread::Current
2888161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artDeliverExceptionFromCode
2898161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artDeliverExceptionFromCode(Throwable*, Thread*, $sp)
2908161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a2, $sp                   # pass $sp
291d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deliver_exception_from_code
2925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver a NullPointerException
2955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
296d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNullPointerExceptionFromCode
297d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_throw_null_pointer_exception_from_code
29812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
29957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3008161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a0, rSELF                 # pass Thread::Current
3018161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNullPointerExceptionFromCode
3028161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowNullPointerExceptionFromCode(Thread*, $sp)
3038161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, $sp                   # pass $sp
304d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_throw_null_pointer_exception_from_code
3055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArithmeticException
3085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
309d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowDivZeroFromCode
310d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_throw_div_zero_from_code
31112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
31257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a0, rSELF                 # pass Thread::Current
3148161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowDivZeroFromCode
3158161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowDivZeroFromCode(Thread*, $sp)
3167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a1, $sp                   # pass $sp
317d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_throw_div_zero_from_code
3185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException
3215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
322d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowArrayBoundsFromCode
323d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_throw_array_bounds_from_code
32412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
32557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3268161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a2, rSELF                 # pass Thread::Current
3278161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowArrayBoundsFromCode
3288161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowArrayBoundsFromCode(index, limit, Thread*, $sp)
3298161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a3, $sp                   # pass $sp
330d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_throw_array_bounds_from_code
3315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
33257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
33357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a StackOverflowError.
33457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
335d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowStackOverflowFromCode
336d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_throw_stack_overflow_from_code
33712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
33857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3398161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a0, rSELF                 # pass Thread::Current
3408161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowStackOverflowFromCode
3418161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowStackOverflowFromCode(Thread*, $sp)
3428161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, $sp                   # pass $sp
343d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_throw_stack_overflow_from_code
3445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
34557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
34657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a NoSuchMethodError.
34757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
348d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNoSuchMethodFromCode
349d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_throw_no_such_method_from_code
35012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
35157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3528161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, rSELF                 # pass Thread::Current
3538161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNoSuchMethodFromCode
3548161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowNoSuchMethodFromCode(method_idx, Thread*, $sp)
3558161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a2, $sp                   # pass $sp
356d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_throw_no_such_method_from_code
3575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * All generated callsites for interface invokes and invocation slow paths will load arguments
3607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain
3615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the method_idx.  This wrapper will save arg1-arg3, load the caller's Method*, align the
3625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * stack and call the appropriate C helper.
3637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1.
3645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
3657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting
3667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * of the target Method* in $v0 and method->code_ in $v1.
3675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
368fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao     * If unsuccessful, the helper will return NULL/NULL. There will be a pending exception in the
3695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * thread and we branch to another stub to deliver it.
3705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
3715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On success this wrapper will restore arguments and *jump* to the target, leaving the lr
3725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * pointing back to the original caller.
3735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
3745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name
3755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern \cxx_name
376d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY \c_name
37712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
3787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME  # save callee saves in case allocation triggers GC
3797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw    $a2, 48($sp)                    # pass caller Method*
380fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move  $t0, $sp                        # save $sp
38158df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, -32                   # make space for extra args
38258df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset 32
3837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move  $a3, rSELF                      # pass Thread::Current
38458df32711162823647356afe25ae2cde04133563Jeff Hao    sw    $gp, 20($sp)                    # save $gp
385d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 28, 12
3867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal   \cxx_name                       # (method_idx, this, caller, Thread*, $sp)
387fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw    $t0, 16($sp)                    # pass $sp
38858df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $gp, 20($sp)                    # restore $gp
38958df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, 32                    # release out args
39058df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset -32
391fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move  $a0, $v0                        # save target Method*
39230a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    move  $t9, $v1                        # save $v0->code_
3935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
394fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    beqz  $v0, 1f
3955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
39630a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    jr    $t9
3975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
3985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
3995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
400d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND \c_name
4015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
4025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4038dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline
4048dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck
4055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4068dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck
4078dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck
4088dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck
4098dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck
4105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
41179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    /*
41258df32711162823647356afe25ae2cde04133563Jeff Hao     * Portable resolution trampoline.
41358df32711162823647356afe25ae2cde04133563Jeff Hao     */
41479fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    .extern artPortableResolutionTrampoline
41558df32711162823647356afe25ae2cde04133563Jeff HaoENTRY art_portable_resolution_trampoline
41658df32711162823647356afe25ae2cde04133563Jeff Hao    GENERATE_GLOBAL_POINTER
41758df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, -32          # leave room for $a0, $a1, $a2, $a3, and $ra
41858df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset 32
41958df32711162823647356afe25ae2cde04133563Jeff Hao    sw     $ra, 16($sp)
42058df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_rel_offset 31, 16
42158df32711162823647356afe25ae2cde04133563Jeff Hao    sw     $a3, 12($sp)
42258df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_rel_offset 7, 12
42358df32711162823647356afe25ae2cde04133563Jeff Hao    sw     $a2, 8($sp)
42458df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_rel_offset 6, 8
42558df32711162823647356afe25ae2cde04133563Jeff Hao    sw     $a1, 4($sp)
42658df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_rel_offset 5, 4
42758df32711162823647356afe25ae2cde04133563Jeff Hao    sw     $a0, 0($sp)
42858df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_rel_offset 4, 0
42958df32711162823647356afe25ae2cde04133563Jeff Hao    move  $a2, $s1              # pass Thread::Current()
43058df32711162823647356afe25ae2cde04133563Jeff Hao    jal   artPortableResolutionTrampoline  # (method_idx, sp, Thread*)
43158df32711162823647356afe25ae2cde04133563Jeff Hao    move  $a1, $sp              # pass stack pointer
43258df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $a0, 0($sp)           # restore registers from stack
43358df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $a1, 4($sp)
43458df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $a2, 8($sp)
43558df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $a3, 12($sp)
43658df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $ra, 16($sp)
43758df32711162823647356afe25ae2cde04133563Jeff Hao    beq   $v0, $zero, resolve_fail
43858df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, 32          # restore the stack
43958df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset -32
44058df32711162823647356afe25ae2cde04133563Jeff Hao    jr    $t9                   # leaf call to method's code
44158df32711162823647356afe25ae2cde04133563Jeff Hao    move  $t9, $v0              # put method code result in $t9
44258df32711162823647356afe25ae2cde04133563Jeff Haoresolve_fail:
44358df32711162823647356afe25ae2cde04133563Jeff Hao    jr    $ra
44458df32711162823647356afe25ae2cde04133563Jeff Hao    nop
44558df32711162823647356afe25ae2cde04133563Jeff HaoEND art_portable_resolution_trampoline
44658df32711162823647356afe25ae2cde04133563Jeff Hao
44779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    /*
44858df32711162823647356afe25ae2cde04133563Jeff Hao     * Quick resolution trampoline.
44958df32711162823647356afe25ae2cde04133563Jeff Hao     */
45079fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    .extern artQuickResolutionTrampoline
45158df32711162823647356afe25ae2cde04133563Jeff HaoENTRY art_quick_resolution_trampoline
45258df32711162823647356afe25ae2cde04133563Jeff Hao    GENERATE_GLOBAL_POINTER
45358df32711162823647356afe25ae2cde04133563Jeff Hao    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
45458df32711162823647356afe25ae2cde04133563Jeff Hao    move  $a2, $s1              # pass Thread::Current()
45558df32711162823647356afe25ae2cde04133563Jeff Hao    jal   artQuickResolutionTrampoline  # (method_idx, sp, Thread*)
45658df32711162823647356afe25ae2cde04133563Jeff Hao    move  $a1, $sp              # pass stack pointer
45758df32711162823647356afe25ae2cde04133563Jeff Hao    move  $t9, $v0              # put method code result in $t9
45858df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $a0, 0($sp)           # restore registers from stack
45958df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $a1, 4($sp)
46058df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $a2, 8($sp)
46158df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $a3, 12($sp)
46258df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $s2, 16($sp)
46358df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $s3, 20($sp)
46458df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $s4, 24($sp)
46558df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $s5, 28($sp)
46658df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $s6, 32($sp)
46758df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $s7, 36($sp)
46858df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $fp, 40($sp)
46958df32711162823647356afe25ae2cde04133563Jeff Hao    lw    $ra, 44($sp)
47058df32711162823647356afe25ae2cde04133563Jeff Hao    jr    $t9                   # leaf call to method's code
47158df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, 48          # restore the stack
47258df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset -48
47358df32711162823647356afe25ae2cde04133563Jeff HaoEND art_quick_resolution_trampoline
47458df32711162823647356afe25ae2cde04133563Jeff Hao
4755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
4766474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao     * Common invocation stub for portable and quick.
4775d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     * On entry:
4785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a0 = method pointer
4795d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a1 = argument array or NULL for no argument methods
4805d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a2 = size of argument array in bytes
4815d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a3 = (managed) thread pointer
4826474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao     *   [sp + 16] = JValue* result
4836474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao     *   [sp + 20] = result type char
4845d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     */
48579fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    .type art_portable_invoke_stub, %function
48679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    .global art_portable_invoke_stub
4876474d190d5604898354ebf767f1944b6e3e9b445Jeff Haoart_portable_invoke_stub:
4885d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoENTRY art_quick_invoke_stub
4895d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    GENERATE_GLOBAL_POINTER
4905d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $a0, 0($sp)           # save out a0
4915d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # spill s0, s1, fp, ra
4925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset 16
4935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $ra, 12($sp)
4945d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 31, 12
4955d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $fp, 8($sp)
4965d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 30, 8
4975d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s1, 4($sp)
4985d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 17, 4
4995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s0, 0($sp)
5005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 16, 0
5015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $fp, $sp              # save sp in fp
5025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_def_cfa_register 30
5035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $s1, $a3              # move managed thread pointer into s1
5045d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $s0, $zero, SUSPEND_CHECK_INTERVAL  # reset s0 to suspend check interval
5055d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $t0, $a2, 16          # create space for method pointer in frame
5065d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    srl   $t0, $t0, 3           # shift the frame size right 3
5075d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sll   $t0, $t0, 3           # shift the frame size left 3 to align to 16 bytes
5085d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    subu  $sp, $sp, $t0         # reserve stack space for argument array
5095d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $a0, $sp, 4           # pass stack pointer + method ptr as dest for memcpy
5105d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jal   memcpy                # (dest, src, bytes)
5115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # make space for argument slots for memcpy
5125d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16          # restore stack after memcpy
5135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a0, 16($fp)          # restore method*
5145d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a1, 4($sp)           # copy arg value for a1
5155d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a2, 8($sp)           # copy arg value for a2
5165d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a3, 12($sp)          # copy arg value for a3
5175d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $t9, METHOD_CODE_OFFSET($a0)  # get pointer to the code
5185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jalr  $t9                   # call the method
5195d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $zero, 0($sp)         # store NULL for method* at bottom of frame
5205d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $sp, $fp              # restore the stack
5215d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s0, 0($sp)
5225d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s1, 4($sp)
5235d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $fp, 8($sp)
5245d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $ra, 12($sp)
5255d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16
5265d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset -16
5275d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $t0, 16($sp)          # get result pointer
5286474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    lw    $t1, 20($sp)          # get result type char
5296474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t2, 68               # put char 'D' into t2
5306474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t2, 1f          # branch if result type char == 'D'
5316474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t3, 70               # put char 'F' into t3
5326474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t3, 1f          # branch if result type char == 'F'
5335d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v0, 0($t0)           # store the result
5346474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    jr    $ra
5355d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v1, 4($t0)           # store the other half of the result
5366474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao1:
53719ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao    s.s   $f0, 0($t0)           # store floating point result
5385d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jr    $ra
53919ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao    s.s   $f1, 4($t0)           # store other half of floating point result
5405d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoEND art_quick_invoke_stub
5416474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    .size art_portable_invoke_stub, .-art_portable_invoke_stub
5425d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao
5435d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    /*
5445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry point of native methods when JNI bug compatibility is enabled.
5455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
546d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artWorkAroundAppJniBugs
547d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_work_around_app_jni_bugs
54812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
5497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # save registers that may contain arguments and LR that will be crushed by a call
5507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu    $sp, $sp, -32
551d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset 32
552fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw       $ra, 28($sp)
553d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 31, 28
554fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw       $a3, 24($sp)
555d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 7, 28
5567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw       $a2, 20($sp)
557d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 6, 28
558fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw       $a1, 16($sp)
559d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 5, 28
560fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw       $a0, 12($sp)
561d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 4, 28
5627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move     $a0, rSELF       # pass Thread::Current
5637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal      artWorkAroundAppJniBugs  # (Thread*, $sp)
5647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move     $a1, $sp         # pass $sp
56530a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    move     $t9, $v0         # save target address
566fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    lw       $a0, 12($sp)
567fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    lw       $a1, 16($sp)
5687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw       $a2, 20($sp)
569fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    lw       $a3, 24($sp)
570fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    lw       $ra, 28($sp)
57130a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    jr       $t9              # tail call into JNI routine
5727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu    $sp, $sp, 32
573d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -32
574d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_work_around_app_jni_bugs
5755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on
5785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * failure.
5795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
580d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artHandleFillArrayDataFromCode
581d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_handle_fill_data_from_code
58212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
5837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
5847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
5857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artHandleFillArrayDataFromCode     # (Array*, const DexFile::Payload*, Thread*, $sp)
5867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
587fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    RETURN_IF_ZERO
588d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_handle_fill_data_from_code
5895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
59157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code that calls artLockObjectFromCode, may block for GC.
5925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
593d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artLockObjectFromCode
594d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_lock_object_from_code
59512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
5967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME      # save callee saves in case we block
5977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                    # pass Thread::Current
5987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artLockObjectFromCode         # (Object* obj, Thread*, $sp)
5997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, $sp                      # pass $sp
6005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
601d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_lock_object_from_code
6025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
6045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure.
6055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
606d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artUnlockObjectFromCode
607d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_unlock_object_from_code
60812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
6097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
6107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                # pass Thread::Current
6117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artUnlockObjectFromCode   # (Object* obj, Thread*, $sp)
6127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, $sp                  # pass $sp
6135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
614d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_unlock_object_from_code
6155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
6175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure.
6185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
619d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artCheckCastFromCode
620d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_check_cast_from_code
62112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
6227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
6237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
6247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artCheckCastFromCode      # (Class* a, Class* b, Thread*, $sp)
6257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
6265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
627d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_check_cast_from_code
6285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
6305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artCanPutArrayElementFromCode and delivers exception on
6315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * failure.
6325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
633d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artCanPutArrayElementFromCode
634d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_can_put_array_element_from_code
63512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
6367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case exception allocation triggers GC
6377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                     # pass Thread::Current
6387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artCanPutArrayElementFromCode  # (Object* element, Class* array_class, Thread*, $sp)
6397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                       # pass $sp
6405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
641d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_can_put_array_element_from_code
6425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
6445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when uninitialized static storage, this stub will run the class
6455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * initializer and deliver the exception on error. On success the static storage base is
6465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * returned.
6475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
648d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeStaticStorageFromCode
649d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_initialize_static_storage_from_code
65012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
6517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME            # save callee saves in case of GC
6527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                          # pass Thread::Current
6537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
6545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeStaticStorageFromCode
6557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                            # pass $sp
6565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
657d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_initialize_static_storage_from_code
6585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
66057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code when dex cache misses for a type_idx.
6615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
662d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeTypeFromCode
663d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_initialize_type_from_code
66412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
6657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
6667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
6677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
6685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeFromCode
6697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
6705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
671d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_initialize_type_from_code
6725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
6745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when type_idx needs to be checked for access and dex cache may also
67557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * miss.
6765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
677d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeTypeAndVerifyAccessFromCode
678d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_initialize_type_and_verify_access_from_code
67912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
6807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
6817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
6827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
6835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeAndVerifyAccessFromCode
6847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
6855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
686d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_initialize_type_and_verify_access_from_code
6875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
68957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 32-bit primitive value.
6905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
691d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32StaticFromCode
692d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_get32_static_from_code
69312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
6947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
6954eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
6967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
697fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet32StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
6987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
6995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
700d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_get32_static_from_code
7015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
70357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 64-bit primitive value.
7045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
705d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64StaticFromCode
706d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_get64_static_from_code
70712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7094eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
7107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
711fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet64StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
7127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
7135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
714d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_get64_static_from_code
7155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
71757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load an object reference.
7185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
719d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjStaticFromCode
720d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_get_obj_static_from_code
72112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7234eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
7247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
725fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGetObjStaticFromCode       # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
7267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
7275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
728d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_get_obj_static_from_code
7295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
73157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 32-bit primitive value.
7325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
733d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32InstanceFromCode
734d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_get32_instance_from_code
73512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7374eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
7387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
739fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet32InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
7404eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
7415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
742d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_get32_instance_from_code
7435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
74557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 64-bit primitive value.
7465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
747d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64InstanceFromCode
748d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_get64_instance_from_code
74912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7514eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
7527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
753fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet64InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
7544eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
7555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
756d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_get64_instance_from_code
7575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
75957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load an object reference.
7605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
761d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjInstanceFromCode
762d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_get_obj_instance_from_code
76312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7654eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
7667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
767fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGetObjInstanceFromCode     # (field_idx, Object*, referrer, Thread*, $sp)
7684eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
7695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
770d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_get_obj_instance_from_code
7715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
77357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 32-bit primitive value.
7745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
775d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32StaticFromCode
776d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_set32_static_from_code
77712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7794eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
7807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
781fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSet32StaticFromCode        # (field_idx, new_val, referrer, Thread*, $sp)
7824eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
7835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
784d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_set32_static_from_code
7855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
78757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 64-bit primitive value.
7885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
789d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32StaticFromCode
790d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_set64_static_from_code
79112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7934eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
794fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
7957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artSet64StaticFromCode        # (field_idx, referrer, new_val, Thread*, $sp)
7964eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
7975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
798d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_set64_static_from_code
7995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
80157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store an object reference.
8025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
803d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjStaticFromCode
804d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_set_obj_static_from_code
80512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8074eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
8087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
809fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSetObjStaticFromCode       # (field_idx, new_val, referrer, Thread*, $sp)
8104eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
812d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_set_obj_static_from_code
8135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
81557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 32-bit primitive value.
8165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
817d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32InstanceFromCode
818d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_set32_instance_from_code
81912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8214eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a3, 64($sp)                  # pass referrer's Method*
822fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
8237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artSet32InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*, $sp)
8244eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
8255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
826d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_set32_instance_from_code
8275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
82957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 64-bit primitive value.
8305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
831d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32InstanceFromCode
832d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_set64_instance_from_code
83312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
835fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
836fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSet64InstanceFromCode      # (field_idx, Object*, new_val, Thread*, $sp)
8374eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
8385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
839d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_set64_instance_from_code
8405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
84257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store an object reference.
8435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
844d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjInstanceFromCode
845d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_set_obj_instance_from_code
84612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8484eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a3, 64($sp)                  # pass referrer's Method*
849fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
850fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSetObjInstanceFromCode     # (field_idx, Object*, new_val, referrer, Thread*, $sp)
8514eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
8525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
853d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_set_obj_instance_from_code
8545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
8565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code to resolve a string, this stub will allocate a String and deliver an
8575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception on error. On success the String is returned. R0 holds the referring method,
8585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * R1 holds the string index. The fast path check for hit in strings cache has already been
8595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * performed.
8605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
861d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artResolveStringFromCode
862d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_resolve_string_from_code
86312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
8657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
8667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*, $sp)
8675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artResolveStringFromCode
8687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
869fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    RETURN_IF_NONZERO
870d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_resolve_string_from_code
8715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
87357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to allocate an object.
8745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
875d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artAllocObjectFromCode
876d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_alloc_object_from_code
87712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
8797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
8807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artAllocObjectFromCode    # (uint32_t type_idx, Method* method, Thread*, $sp)
8817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
8825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
883d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_alloc_object_from_code
8845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
8865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to allocate an object when the caller doesn't know whether it has
88757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * access to the created type.
8885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
889d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artAllocObjectFromCodeWithAccessCheck
890d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_alloc_object_from_code_with_access_check
89112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
8937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
8947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artAllocObjectFromCodeWithAccessCheck  # (uint32_t type_idx, Method* method, Thread*, $sp)
8957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
8965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
897d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_alloc_object_from_code_with_access_check
8985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
90057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to allocate an array.
9015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
902d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artAllocArrayFromCode
903d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_alloc_array_from_code
90412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
9057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
9067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, rSELF                # pass Thread::Current
9077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t component_count, Thread*, $sp)
9085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artAllocArrayFromCode
9094eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw      $sp, 16($sp)              # pass $sp
9105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
911d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_alloc_array_from_code
9125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
9145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to allocate an array when the caller doesn't know whether it has
91557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * access to the created type.
9165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
917d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artAllocArrayFromCodeWithAccessCheck
918d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_alloc_array_from_code_with_access_check
91912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
9207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
9217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, rSELF                # pass Thread::Current
9227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artAllocArrayFromCodeWithAccessCheck(type_idx, method, component_count, Thread*, $sp)
9235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artAllocArrayFromCodeWithAccessCheck
9244eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw      $sp, 16($sp)              # pass $sp
9255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
926d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_alloc_array_from_code_with_access_check
9275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
92957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY.
9305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
931d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artCheckAndAllocArrayFromCode
932d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_check_and_alloc_array_from_code
93312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
9347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
9357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, rSELF                # pass Thread::Current
9367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artCheckAndAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t count, Thread* , $sp)
9375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artCheckAndAllocArrayFromCode
9384eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw      $sp, 16($sp)              # pass $sp
9395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
940d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_check_and_alloc_array_from_code
9415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
94357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY.
9445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
945d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artCheckAndAllocArrayFromCodeWithAccessCheck
946d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_check_and_alloc_array_from_code_with_access_check
94712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
9487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
949fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move    $a3, rSELF                # pass Thread::Current
9507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artCheckAndAllocArrayFromCodeWithAccessCheck(type_idx, method, count, Thread* , $sp)
9515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artCheckAndAllocArrayFromCodeWithAccessCheck
9524eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw      $sp, 16($sp)              # pass $sp
9535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NONZERO
954d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_check_and_alloc_array_from_code_with_access_check
9555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
95757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code when the value in rSUSPEND has been decremented to 0.
9585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
959d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artTestSuspendFromCode
960d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_test_suspend
96112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
962474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers    lh     $a0, THREAD_FLAGS_OFFSET(rSELF)
9637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $a0, 1f
9647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addi  rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL   # reset rSUSPEND to SUSPEND_CHECK_INTERVAL
9657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
9665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
9675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
9687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a0, rSELF
9697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME          # save callee saves for stack crawl
9707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artTestSuspendFromCode             # (Thread*, $sp)
9717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a1, $sp
9725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
973d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_test_suspend
9745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9755fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    .extern artPortableProxyInvokeHandler
9765fa60c3db4208df407113b5a69d295a9c93d53b1Jeff HaoENTRY art_portable_proxy_invoke_handler
9775fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    GENERATE_GLOBAL_POINTER
9785fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
9795fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    sw      $a0, 0($sp)            # place proxy method at bottom of frame
9805fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    move    $a2, rSELF             # pass Thread::Current
9815fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    jal     artPortableProxyInvokeHandler  # (Method* proxy method, receiver, Thread*, SP)
9825fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    move    $a3, $sp               # pass $sp
9835fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    lw      $ra, 44($sp)           # restore $ra
9845fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    jr      $ra
9855fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    addiu   $sp, $sp, 48           # pop frame
9865fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    .cfi_adjust_cfa_offset -48
9875fa60c3db4208df407113b5a69d295a9c93d53b1Jeff HaoEND art_portable_proxy_invoke_handler
9885fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao
9895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
9905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code that is attempting to call a method on a proxy class. On entry
99157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * r0 holds the proxy method; r1, r2 and r3 may contain arguments.
9925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
9935fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    .extern artQuickProxyInvokeHandler
994d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_proxy_invoke_handler
99512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
9965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
9977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw      $a0, 0($sp)            # place proxy method at bottom of frame
9987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF             # pass Thread::Current
9995fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    jal     artQuickProxyInvokeHandler  # (Method* proxy method, receiver, Thread*, SP)
1000af6e67a4816d2593586115b89faa659225363246Ian Rogers    move    $a3, $sp               # pass $sp
10017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
10027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $ra, 44($sp)           # restore $ra
10037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez    $t0, 1f
10047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addiu   $sp, $sp, 48           # pop frame
1005d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -48
10067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
10075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
10085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
10095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
1010d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_proxy_invoke_handler
10115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
10127db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    .extern artInterpreterEntry
1013d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_interpreter_entry
10147db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    GENERATE_GLOBAL_POINTER
10157db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
10167db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    sw      $a0, 0($sp)            # place proxy method at bottom of frame
10177db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    move    $a1, rSELF             # pass Thread::Current
10187db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    jal     artInterpreterEntry    # (Method* method, Thread*, SP)
10197db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    move    $a2, $sp               # pass $sp
10207db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
10217db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    lw      $ra, 44($sp)           # restore $ra
10227db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    bnez    $t0, 1f
10237db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    addiu   $sp, $sp, 48           # pop frame
1024d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -48
10257db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    jr      $ra
10267db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    nop
10277db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers1:
10287db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    DELIVER_PENDING_EXCEPTION
1029d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_interpreter_entry
10307db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers
10315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1032725a957985171d712d5c048cc3d00ff14968784bjeffhao     * Routine that intercepts method calls and returns.
10335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1034d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodEntryFromCode
1035d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodExitFromCode
1036d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_instrumentation_entry_from_code
103712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
103862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
103912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $sp       # remember bottom of caller's frame
104062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, -32  # space for args, pad (3 words), arguments (5 words)
104162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset 32
104262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $a0, 28($sp)   # save arg0
104362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $ra, 16($sp)   # pass $ra
104462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a3, $t0       # pass $sp
104562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artInstrumentationMethodEntryFromCode  # (Method*, Object*, Thread*, SP, LR)
104662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, rSELF     # pass Thread::Current
10478161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move     $t9, $v0       # $t9 holds reference to code
104862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $a0, 28($sp)   # restore arg0
104962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, 32   # remove args
105062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset -32
105162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
10528161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jalr     $t9            # call method
105362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    nop
1054d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_instrumentation_entry_from_code
10555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* intentional fallthrough */
1056d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .global art_quick_instrumentation_exit_from_code
10578dbb708c7dc05c786329eb5c3fff3194ab6472acLogan Chienart_quick_instrumentation_exit_from_code:
1058d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_startproc
105912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    addiu    $t9, $ra, 4    # put current address into $t9 to rebuild $gp
106012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
106112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $sp       # remember bottom of caller's frame
106262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    SETUP_REF_ONLY_CALLEE_SAVE_FRAME
106362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, -48  # save return values and set up args
106462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset 48
106562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $v0, 32($sp)
1066d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 2, 0
106762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $v1, 36($sp)
1068d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 3, 4
106962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f0, 40($sp)
107062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f1, 44($sp)
107162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f0, 16($sp)   # pass fpr result
107262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f1, 20($sp)
107362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, $v0       # pass gpr result
107462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a3, $v1
107512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $a1, $t0       # pass $sp
107662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artInstrumentationMethodExitFromCode  # (Thread*, SP, gpr_res, fpr_res)
107712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $a0, rSELF     # pass Thread::Current
107812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $v0       # set aside returned link register
107912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $ra, $v1       # set link register for deoptimization
108062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $v0, 32($sp)   # restore return values
108162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $v1, 36($sp)
108262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    l.s      $f0, 40($sp)
108362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    l.s      $f1, 44($sp)
108412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    jr       $t0            # return
108562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, 112  # 48 bytes of args + 64 bytes of callee save frame
108662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset -112
10874aac9e12b33bdefaedcfbeabf479e27b68ac2a85Brian CarlstromEND art_quick_instrumentation_exit_from_code
10885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
108912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    /*
109062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization
109162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * will long jump to the upcall with a special exception of -1.
109212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao     */
1093d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artDeoptimize
1094d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artEnterInterpreterFromDeoptimize
1095d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deoptimize
109612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
109714dd5a82ad85a28612bf86e755ff929d767cea4cJeff Hao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
109862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a0, rSELF     # pass Thread::current
109962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artDeoptimize  # artDeoptimize(Thread*, SP)
110012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao                            # Returns caller method's frame size.
110162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a1, $sp       # pass $sp
1102d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deoptimize
110312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao
11045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
110579fe539587d4c09244172d0168eeed0ec9770466Jeff Hao     * Portable abstract method error stub. $a0 contains method* on entry. SP unused in portable.
110679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao     */
110779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    .extern artThrowAbstractMethodErrorFromCode
110879fe539587d4c09244172d0168eeed0ec9770466Jeff HaoENTRY art_portable_abstract_method_error_stub
110979fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    GENERATE_GLOBAL_POINTER
111079fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    la       $t9, artThrowAbstractMethodErrorFromCode
111179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    jr       $t9            # (Method*, Thread*, SP)
111279fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    move     $a1, $s1       # pass Thread::Current
111379fe539587d4c09244172d0168eeed0ec9770466Jeff HaoEND art_portable_abstract_method_error_stub
111479fe539587d4c09244172d0168eeed0ec9770466Jeff Hao
111579fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    /*
111679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao     * Quick abstract method error stub. $a0 contains method* on entry.
111779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao     */
111879fe539587d4c09244172d0168eeed0ec9770466Jeff HaoENTRY art_quick_abstract_method_error_stub
111979fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    GENERATE_GLOBAL_POINTER
112079fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
112179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    move     $a1, $s1       # pass Thread::Current
112279fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    la       $t9, artThrowAbstractMethodErrorFromCode
112379fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    jr       $t9            # (Method*, Thread*, SP)
112479fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    move     $a2, $sp       # pass SP
112579fe539587d4c09244172d0168eeed0ec9770466Jeff HaoEND art_quick_abstract_method_error_stub
112679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao
112779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    /*
112879fe539587d4c09244172d0168eeed0ec9770466Jeff Hao     * Jni dlsym lookup stub.
112979fe539587d4c09244172d0168eeed0ec9770466Jeff Hao     */
113079fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    .extern artFindNativeMethod
113179fe539587d4c09244172d0168eeed0ec9770466Jeff HaoENTRY art_jni_dlsym_lookup_stub
113279fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    GENERATE_GLOBAL_POINTER
113379fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    addiu $sp, $sp, -32          # leave room for $a0, $a1, $a2, $a3, and $ra
113479fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    .cfi_adjust_cfa_offset 32
113579fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    sw     $ra, 16($sp)
113679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    .cfi_rel_offset 31, 16
113779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    sw     $a3, 12($sp)
113879fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    .cfi_rel_offset 7, 12
113979fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    sw     $a2, 8($sp)
114079fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    .cfi_rel_offset 6, 8
114179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    sw     $a1, 4($sp)
114279fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    .cfi_rel_offset 5, 4
114379fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    sw     $a0, 0($sp)
114479fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    .cfi_rel_offset 4, 0
114579fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    jal   artFindNativeMethod   # (Thread*)
114679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    move  $a0, $s1              # pass Thread::Current()
114779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    lw    $a0, 0($sp)           # restore registers from stack
114879fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    lw    $a1, 4($sp)
114979fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    lw    $a2, 8($sp)
115079fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    lw    $a3, 12($sp)
115179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    lw    $ra, 16($sp)
115279fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    beq   $v0, $zero, no_native_code_found
115379fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    addiu $sp, $sp, 32          # restore the stack
115479fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    .cfi_adjust_cfa_offset -32
115579fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    jr    $t9                   # leaf call to method's code
115679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    move  $t9, $v0              # put method code result in $t9
115779fe539587d4c09244172d0168eeed0ec9770466Jeff Haono_native_code_found:
115879fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    jr    $ra
115979fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    nop
116079fe539587d4c09244172d0168eeed0ec9770466Jeff HaoEND art_jni_dlsym_lookup_stub
116179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao
116279fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    /*
11635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
11645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
11655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
11665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
11675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
11687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
11697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
11707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
11715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1172d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shl_long
11735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* shl-long vAA, vBB, vCC */
11747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v0, $a0, $a2                    #  rlo<- alo << (shift&31)
11757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $v1, $a2                         #  rhi<- 31-shift  (shift is 5b)
11767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, 1
11777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, $v1                         #  alo<- alo >> (32-(shift&31))
11787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v1, $a1, $a2                    #  rhi<- ahi << (shift&31)
11797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v1, $a0                         #  rhi<- rhi | alo
11807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift< shift & 0x20
11817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $v0, $a2                    #  rhi<- rlo (if shift&0x20)
11827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1183fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    movn    $v0, $zero, $a2                  #  rlo<- 0  (if shift&0x20)
1184d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shl_long
11855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
11865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
11875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
11885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
11895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
11905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
11915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
11927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
11937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
11947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
11955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1196d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .global art_quick_shr_long
1197d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shr_long
11987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
11997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
12007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $a3, $a1, 31                     #  $a3<- sign(ah)
12017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
12027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
12037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
12047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
12057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
12067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
12077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
12087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $a3, $a2                    #  rhi<- sign(ahi) (if shift&0x20)
1209d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shr_long
12105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
12115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
12125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
12135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
12145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
12155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
12165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
12175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r0: low word
12185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r1: high word
12195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r2: shift count
12205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
12215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* ushr-long vAA, vBB, vCC */
1222d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .global art_quick_ushr_long
1223d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_ushr_long
1224fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    srl     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
12257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
12267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
12277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
12287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
12297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
12307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
12317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
12327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1233fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    movn    $v1, $zero, $a2                  #  rhi<- 0 (if shift&0x20)
1234d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_ushr_long
12357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao
1236d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_indexof
12377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr $ra
12380703060875166106af3d490c6c264611aea67ec8jeffhao    nop
1239d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_indexof
12407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao
1241d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_string_compareto
12427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr $ra
12430703060875166106af3d490c6c264611aea67ec8jeffhao    nop
1244d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_string_compareto
1245