quick_entrypoints_mips.S revision 2d7210188805292e463be4bcf7a133b654d7e0ea
10f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes/*
20f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Copyright (C) 2012 The Android Open Source Project
30f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes *
40f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
50f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * you may not use this file except in compliance with the License.
60f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * You may obtain a copy of the License at
70f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes *
80f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
90f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes *
100f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Unless required by applicable law or agreed to in writing, software
110f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
120f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * See the License for the specific language governing permissions and
140f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * limitations under the License.
150f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes */
160f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes
177655f29fabc0a12765de828914a18314382e5a35Ian Rogers#include "asm_support_mips.S"
185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
197410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier#include "arch/quick_alloc_entrypoints.S"
207410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier
210703060875166106af3d490c6c264611aea67ec8jeffhao    .set noreorder
225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .balign 4
235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* Deliver the given exception */
255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern artDeliverExceptionFromCode
265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* Deliver an exception pending on a thread */
278161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    .extern artDeliverPendingExceptionFromCode
285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kSaveAll)
321d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers     * Callee-save: $s0-$s8 + $gp + $ra, 11 total + 1 word padding + 4 open words for args
331d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers     * Clobbers $t0 and $gp
345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
3557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.macro SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
36fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    addiu  $sp, $sp, -64
37d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset 64
385c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
395c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe     // Ugly compile-time check, but we only have the preprocessor.
405c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_SAVE_ALL_CALLEE_SAVE != 64)
415c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "SAVE_ALL_CALLEE_SAVE_FRAME(MIPS) size not as expected."
425c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif
435c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
44fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $ra, 60($sp)
45d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 31, 60
46fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $s8, 56($sp)
47d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 30, 56
481f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $gp, 52($sp)
491f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 28, 52
501f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s7, 48($sp)
511f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 23, 48
521f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s6, 44($sp)
531f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 22, 44
541f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s5, 40($sp)
551f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 21, 40
561f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s4, 36($sp)
571f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 20, 36
581f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s3, 32($sp)
591f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 19, 32
601f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s2, 28($sp)
611f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 18, 28
621f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s1, 24($sp)
631f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 17, 24
641f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s0, 20($sp)
651f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 16, 20
661f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    # 1 word for alignment, 4 open words for args $a0-$a3, bottom will hold Method*
671d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers
684af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, %got(_ZN3art7Runtime9instance_E)($gp)
694af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, 0($t0)
701d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    THIS_LOAD_REQUIRES_READ_BARRIER
714af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET($t0)
721d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $t0, 0($sp)                                # Place Method* at bottom of stack.
731d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF)  # Place sp in Thread::Current()->top_quick_frame.
745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC.
795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Does not include rSUSPEND or rSELF
801f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao     * callee-save: $s2-$s8 + $gp + $ra, 9 total + 3 words padding + 4 open words for args
815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
821d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro SETUP_REFS_ONLY_CALLEE_SAVE_FRAME
834eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, -64
84d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset 64
855c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
865c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe    // Ugly compile-time check, but we only have the preprocessor.
875c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_REFS_ONLY_CALLEE_SAVE != 64)
885c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "REFS_ONLY_CALLEE_SAVE_FRAME(MIPS) size not as expected."
895c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif
905c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
914eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $ra, 60($sp)
92d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 31, 60
934eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $s8, 56($sp)
94d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 30, 56
951f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $gp, 52($sp)
961f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 28, 52
971f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s7, 48($sp)
981f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 23, 48
991f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s6, 44($sp)
1001f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 22, 44
1011f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s5, 40($sp)
1021f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 21, 40
1031f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s4, 36($sp)
1041f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 20, 36
1051f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s3, 32($sp)
1061f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 19, 32
1071f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s2, 28($sp)
1081f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 18, 28
109fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    # 3 words for alignment and extra args, 4 open words for args $a0-$a3, bottom will hold Method*
1101d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers
1114af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, %got(_ZN3art7Runtime9instance_E)($gp)
1124af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, 0($t0)
1131d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    THIS_LOAD_REQUIRES_READ_BARRIER
1144af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET($t0)
1151d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $t0, 0($sp)                                # Place Method* at bottom of stack.
1161d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF)  # Place sp in Thread::Current()->top_quick_frame.
1175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1191d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
1204eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $ra, 60($sp)
121bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
1222a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s8, 56($sp)
123bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
1242a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $gp, 52($sp)
125bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 28
1262a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s7, 48($sp)
127bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 23
1282a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s6, 44($sp)
129bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 22
1302a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s5, 40($sp)
131bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 21
1322a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s4, 36($sp)
133bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 20
1342a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s3, 32($sp)
135bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 19
1362a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s2, 28($sp)
137bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 18
1384eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, 64
139d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -64
1405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1421d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
1434eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $ra, 60($sp)
144bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
1452a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s8, 56($sp)
146bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
1472a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $gp, 52($sp)
148bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 28
1492a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s7, 48($sp)
150bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 23
1512a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s6, 44($sp)
152bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 22
1532a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s5, 40($sp)
154bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 21
1552a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s4, 36($sp)
156bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 20
1572a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s3, 32($sp)
158bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 19
1592a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s2, 28($sp)
160bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 18
1617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
1624eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, 64
163d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -64
1645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
1685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC.
1691f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao     * callee-save: $a1-$a3, $s2-$s8 + $gp + $ra, 12 total + 3 words padding + method*
1705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1711d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME
1721f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    addiu  $sp, $sp, -64
1731f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_adjust_cfa_offset 64
1745c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
1755c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe    // Ugly compile-time check, but we only have the preprocessor.
1765c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE != 64)
1775c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "REFS_AND_ARGS_CALLEE_SAVE_FRAME(MIPS) size not as expected."
1785c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif
1795c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
1801f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $ra, 60($sp)
1811f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 31, 60
1821f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s8, 56($sp)
1831f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 30, 56
1841f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $gp, 52($sp)
1851f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 28, 52
1861f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s7, 48($sp)
1871f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 23, 48
1881f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s6, 44($sp)
1891f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 22, 44
1901f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s5, 40($sp)
1911f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 21, 40
1921f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s4, 36($sp)
1931f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 20, 36
1941f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s3, 32($sp)
1951f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 19, 32
1961f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s2, 28($sp)
1971f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 18, 28
1987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a3, 12($sp)
199d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 7, 12
2007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a2, 8($sp)
201d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 6, 8
2027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a1, 4($sp)
203d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 5, 4
204fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    # bottom will hold Method*
2051d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers
2064af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, %got(_ZN3art7Runtime9instance_E)($gp)
2074af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, 0($t0)
2081d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    THIS_LOAD_REQUIRES_READ_BARRIER
2094af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, RUNTIME_REFS_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET($t0)
2101d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $t0, 0($sp)                                # Place Method* at bottom of stack.
2111d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF)  # Place sp in Thread::Current()->top_quick_frame.
2125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2141d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
2152a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $ra, 60($sp)
216bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
2172a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s8, 56($sp)
218bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
2192a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $gp, 52($sp)
220bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 28
2212a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s7, 48($sp)
222bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 23
2232a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s6, 44($sp)
224bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 22
2252a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s5, 40($sp)
226bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 21
2272a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s4, 36($sp)
228bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 20
2292a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s3, 32($sp)
230bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 19
2312a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s2, 28($sp)
232bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 18
2332a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $a3, 12($sp)
234bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 7
2352a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $a2, 8($sp)
236bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 6
2372a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $a1, 4($sp)
238bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 5
239468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    addiu  $sp, $sp, 64           # pop frame
2401f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_adjust_cfa_offset -64
2415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending
2455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception is Thread::Current()->exception_
2465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
2475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro DELIVER_PENDING_EXCEPTION
2488161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME     # save callee saves for throw
2498161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la      $t9, artDeliverPendingExceptionFromCode
2501d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr      $t9                          # artDeliverPendingExceptionFromCode(Thread*)
2511d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a0, rSELF                   # pass Thread::Current
2525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NO_EXCEPTION
2557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
2561d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
2578161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    bnez   $t0, 1f                       # success if no exception is pending
2585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
2605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
2625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
2635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_ZERO
2661d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
2677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $v0, 1f                       # success?
2685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra                           # return on success
2705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
2725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
2735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
275cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro RETURN_IF_RESULT_IS_NON_ZERO
2761d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
2777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    beqz   $v0, 1f                       # success?
2785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra                           # return on success
2805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
2825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
2835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * On entry $a0 is uint32_t* gprs_ and $a1 is uint32_t* fprs_
2875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * FIXME: just guessing about the shape of the jmpbuf.  Where will pc be?
2885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
289d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_do_long_jump
2907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f0, 0($a1)
2917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f1, 4($a1)
2927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f2, 8($a1)
2937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f3, 12($a1)
2947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f4, 16($a1)
2957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f5, 20($a1)
2967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f6, 24($a1)
2977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f7, 28($a1)
2987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f8, 32($a1)
2997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f9, 36($a1)
3007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f10, 40($a1)
3017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f11, 44($a1)
3027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f12, 48($a1)
3037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f13, 52($a1)
3047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f14, 56($a1)
3057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f15, 60($a1)
3067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f16, 64($a1)
3077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f17, 68($a1)
3087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f18, 72($a1)
3097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f19, 76($a1)
3107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f20, 80($a1)
3117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f21, 84($a1)
3127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f22, 88($a1)
3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f23, 92($a1)
3147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f24, 96($a1)
3157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f25, 100($a1)
3167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f26, 104($a1)
3177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f27, 108($a1)
3187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f28, 112($a1)
3197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f29, 116($a1)
3207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f30, 120($a1)
3217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f31, 124($a1)
322748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set push
323748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set nomacro
324748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set noat
3257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $at, 4($a0)
326748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set pop
3277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v0, 8($a0)
3287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v1, 12($a0)
3297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a1, 20($a0)
3307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a2, 24($a0)
3317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a3, 28($a0)
3327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, 32($a0)
3337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t1, 36($a0)
3347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t2, 40($a0)
3357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t3, 44($a0)
3367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t4, 48($a0)
3377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t5, 52($a0)
3387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t6, 56($a0)
3397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t7, 60($a0)
3407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s0, 64($a0)
3417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s1, 68($a0)
3427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s2, 72($a0)
3437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s3, 76($a0)
3447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s4, 80($a0)
3457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s5, 84($a0)
3467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s6, 88($a0)
3477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s7, 92($a0)
3487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t8, 96($a0)
3497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t9, 100($a0)
3507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $gp, 112($a0)
3517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $sp, 116($a0)
3527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $fp, 120($a0)
3537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $ra, 124($a0)
3547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a0, 16($a0)
3557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v0, $zero          # clear result registers r0 and r1
3567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra                 # do long jump
3577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v1, $zero
358d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_do_long_jump
3595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code, saves most registers (forms basis of long jump context) and passes
3625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at
3635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the thread. On entry r0 holds Throwable*
3645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
365468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_deliver_exception
36657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3678161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artDeliverExceptionFromCode
3681d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artDeliverExceptionFromCode(Throwable*, Thread*)
3691d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a1, rSELF                 # pass Thread::Current
370468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_deliver_exception
3715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver a NullPointerException
3745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
375d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNullPointerExceptionFromCode
376468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_null_pointer_exception
37757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3788161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNullPointerExceptionFromCode
3791d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artThrowNullPointerExceptionFromCode(Thread*)
3801d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a0, rSELF                 # pass Thread::Current
381468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_null_pointer_exception
3825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArithmeticException
3855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
386d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowDivZeroFromCode
387468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_div_zero
38857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3898161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowDivZeroFromCode
3901d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artThrowDivZeroFromCode(Thread*)
3911d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a0, rSELF                 # pass Thread::Current
392468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_div_zero
3935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException
3965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
397d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowArrayBoundsFromCode
398468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_array_bounds
39957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
4008161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowArrayBoundsFromCode
4011d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artThrowArrayBoundsFromCode(index, limit, Thread*)
4021d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a2, rSELF                 # pass Thread::Current
403468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_array_bounds
4045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
40557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
40657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a StackOverflowError.
40757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
408d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowStackOverflowFromCode
409468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_stack_overflow
41057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
4118161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowStackOverflowFromCode
4121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artThrowStackOverflowFromCode(Thread*)
4131d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a0, rSELF                 # pass Thread::Current
414468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_stack_overflow
4155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
41657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
41757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a NoSuchMethodError.
41857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
419d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNoSuchMethodFromCode
420468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_no_such_method
42157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
4228161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNoSuchMethodFromCode
4231d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artThrowNoSuchMethodFromCode(method_idx, Thread*)
4241d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a1, rSELF                 # pass Thread::Current
425468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_no_such_method
4265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
4285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * All generated callsites for interface invokes and invocation slow paths will load arguments
4297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain
4305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the method_idx.  This wrapper will save arg1-arg3, load the caller's Method*, align the
4315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * stack and call the appropriate C helper.
4327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1.
4335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
4347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting
4357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * of the target Method* in $v0 and method->code_ in $v1.
4365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
437fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao     * If unsuccessful, the helper will return NULL/NULL. There will be a pending exception in the
4385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * thread and we branch to another stub to deliver it.
4395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
4405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On success this wrapper will restore arguments and *jump* to the target, leaving the lr
4415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * pointing back to the original caller.
4425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
4435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name
4445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern \cxx_name
445d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY \c_name
4461d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME  # save callee saves in case allocation triggers GC
4471d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw    $a2, FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE($sp)                    # pass caller Method*
448fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move  $t0, $sp                        # save $sp
44958df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, -32                   # make space for extra args
45058df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset 32
4517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move  $a3, rSELF                      # pass Thread::Current
452d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 28, 12
4537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal   \cxx_name                       # (method_idx, this, caller, Thread*, $sp)
454fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw    $t0, 16($sp)                    # pass $sp
45558df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, 32                    # release out args
45658df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset -32
457fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move  $a0, $v0                        # save target Method*
45830a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    move  $t9, $v1                        # save $v0->code_
4591d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
460fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    beqz  $v0, 1f
4615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
46230a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    jr    $t9
4635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
4645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
4655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
466d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND \c_name
4675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
4685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4698dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline
4708dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck
4715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4728dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck
4738dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck
4748dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck
4758dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck
4765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
47779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    /*
478ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers     * Invocation stub for quick code.
4795d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     * On entry:
4805d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a0 = method pointer
4815d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a1 = argument array or NULL for no argument methods
4825d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a2 = size of argument array in bytes
4835d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a3 = (managed) thread pointer
4846474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao     *   [sp + 16] = JValue* result
4850177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers     *   [sp + 20] = shorty
4865d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     */
4875d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoENTRY art_quick_invoke_stub
4885d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $a0, 0($sp)           # save out a0
4895d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # spill s0, s1, fp, ra
4905d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset 16
4915d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $ra, 12($sp)
4925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 31, 12
4935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $fp, 8($sp)
4945d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 30, 8
4955d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s1, 4($sp)
4965d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 17, 4
4975d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s0, 0($sp)
4985d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 16, 0
4995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $fp, $sp              # save sp in fp
5005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_def_cfa_register 30
5015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $s1, $a3              # move managed thread pointer into s1
5025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $s0, $zero, SUSPEND_CHECK_INTERVAL  # reset s0 to suspend check interval
5035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $t0, $a2, 16          # create space for method pointer in frame
504b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    srl   $t0, $t0, 4           # shift the frame size right 4
505b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    sll   $t0, $t0, 4           # shift the frame size left 4 to align to 16 bytes
5065d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    subu  $sp, $sp, $t0         # reserve stack space for argument array
5075d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $a0, $sp, 4           # pass stack pointer + method ptr as dest for memcpy
5085d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jal   memcpy                # (dest, src, bytes)
5095d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # make space for argument slots for memcpy
5105d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16          # restore stack after memcpy
5115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a0, 16($fp)          # restore method*
5125d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a1, 4($sp)           # copy arg value for a1
5135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a2, 8($sp)           # copy arg value for a2
5145d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a3, 12($sp)          # copy arg value for a3
5152d7210188805292e463be4bcf7a133b654d7e0eaMathieu Chartier    lw    $t9, MIRROR_ART_METHOD_QUICK_CODE_OFFSET_32($a0)  # get pointer to the code
5165d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jalr  $t9                   # call the method
5175d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $zero, 0($sp)         # store NULL for method* at bottom of frame
5185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $sp, $fp              # restore the stack
5195d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s0, 0($sp)
520bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 16
5215d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s1, 4($sp)
522bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 17
5235d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $fp, 8($sp)
524bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
5255d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $ra, 12($sp)
526bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
5275d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16
5285d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset -16
5295d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $t0, 16($sp)          # get result pointer
5300177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers    lw    $t1, 20($sp)          # get shorty
5310177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers    lb    $t1, 0($t1)           # get result type char
5326474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t2, 68               # put char 'D' into t2
5336474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t2, 1f          # branch if result type char == 'D'
5346474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t3, 70               # put char 'F' into t3
5356474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t3, 1f          # branch if result type char == 'F'
5365d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v0, 0($t0)           # store the result
5376474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    jr    $ra
5385d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v1, 4($t0)           # store the other half of the result
5396474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao1:
54019ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao    s.s   $f0, 0($t0)           # store floating point result
5415d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jr    $ra
54219ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao    s.s   $f1, 4($t0)           # store other half of floating point result
5435d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoEND art_quick_invoke_stub
5445d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao
5455d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    /*
5465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on
5475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * failure.
5485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
549d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artHandleFillArrayDataFromCode
550468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_handle_fill_data
5511d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
5521d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)                   # pass referrer's Method*
5531d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artHandleFillArrayDataFromCode # (payload offset, Array*, method, Thread*)
554832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers    move   $a3, rSELF                     # pass Thread::Current
555fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    RETURN_IF_ZERO
556468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_handle_fill_data
5575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
55957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code that calls artLockObjectFromCode, may block for GC.
5605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
561d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artLockObjectFromCode
562468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_lock_object
56386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz    $a0, .Lart_quick_throw_null_pointer_exception_gp_set
564a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
5651d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME      # save callee saves in case we block
5661d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal     artLockObjectFromCode         # (Object* obj, Thread*)
5677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                    # pass Thread::Current
5686bcd163d322b867578fbcfe60e4e3b247c42974bIan Rogers    RETURN_IF_ZERO
569468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_lock_object
5705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure.
5735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
574d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artUnlockObjectFromCode
575468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_unlock_object
57686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz    $a0, .Lart_quick_throw_null_pointer_exception_gp_set
577a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
5781d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
5791d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal     artUnlockObjectFromCode   # (Object* obj, Thread*)
5807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                # pass Thread::Current
5815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
582468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_unlock_object
5835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure.
5865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
587a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .extern artThrowClassCastException
588468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_cast
589a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, -16
590a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset 16
591a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $ra, 12($sp)
592a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_rel_offset 31, 12
593a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $t9, 8($sp)
594a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a1, 4($sp)
595a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a0, 0($sp)
596a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jal    artIsAssignableFromCode
597a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
59886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz   $v0, .Lthrow_class_cast_exception
599a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $ra, 12($sp)
600a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr     $ra
601a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, 16
602a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -16
60386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lthrow_class_cast_exception:
604a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $t9, 8($sp)
605a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a1, 4($sp)
606a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a0, 0($sp)
607a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, 16
608a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -16
609a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
610a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    la   $t9, artThrowClassCastException
6111d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artThrowClassCastException (Class*, Class*, Thread*)
6121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a2, rSELF                 # pass Thread::Current
613468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_cast
6145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
616a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * Entry from managed code for array put operations of objects where the value being stored
617a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * needs to be checked for compatibility.
618a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * a0 = array, a1 = index, a2 = value
6195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
620a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_null_and_bound_check
62186bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez    $a0, .Lart_quick_aput_obj_with_bound_check_gp_set
622a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
62386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    b .Lart_quick_throw_null_pointer_exception_gp_set
624a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
625a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_null_and_bound_check
626a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers
627a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_bound_check
6281d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw $t0, MIRROR_ARRAY_LENGTH_OFFSET($a0)
629a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sltu $t1, $a1, $t0
63086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez $t1, .Lart_quick_aput_obj_gp_set
631a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
632a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a0, $a1
63386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    b .Lart_quick_throw_array_bounds_gp_set
634a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a1, $t0
635a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_bound_check
636a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers
637a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj
63886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz $a2, .Ldo_aput_null
639a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
6401d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw $t0, MIRROR_OBJECT_CLASS_OFFSET($a0)
6411d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw $t1, MIRROR_OBJECT_CLASS_OFFSET($a2)
6421d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw $t0, MIRROR_CLASS_COMPONENT_TYPE_OFFSET($t0)
64386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bne $t1, $t0, .Lcheck_assignability  # value's type == array's component type - trivial assignability
644a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
64586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput:
646a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sll $a1, $a1, 2
647a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t0, $a0, $a1
6481d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw  $a2, MIRROR_OBJECT_ARRAY_DATA_OFFSET($t0)
649a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw  $t0, THREAD_CARD_TABLE_OFFSET(rSELF)
650a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    srl $t1, $a0, 7
651a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t1, $t1, $t0
652a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sb  $t0, ($t1)
653a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr  $ra
654a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
65586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput_null:
656a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sll $a1, $a1, 2
657a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t0, $a0, $a1
6581d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw  $a2, MIRROR_OBJECT_ARRAY_DATA_OFFSET($t0)
659a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr  $ra
660a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
66186bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lcheck_assignability:
662a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, -32
663a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset 32
664a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $ra, 28($sp)
665a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_rel_offset 31, 28
666a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $t9, 12($sp)
667a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a2, 8($sp)
668a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a1, 4($sp)
669a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a0, 0($sp)
670a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move   $a1, $t1
671a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move   $a0, $t0
672a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jal    artIsAssignableFromCode  # (Class*, Class*)
673a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
674a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $ra, 28($sp)
675a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $t9, 12($sp)
676a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a2, 8($sp)
677a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a1, 4($sp)
678a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a0, 0($sp)
679a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add    $sp, 32
680a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -32
68186bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez   $v0, .Ldo_aput
682a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
683a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
684a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a1, $a2
685a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    la   $t9, artThrowArrayStoreException
6861d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artThrowArrayStoreException(Class*, Class*, Thread*)
6871d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a2, rSELF                 # pass Thread::Current
688a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj
6895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
6915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when uninitialized static storage, this stub will run the class
6925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * initializer and deliver the exception on error. On success the static storage base is
6935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * returned.
6945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
695d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeStaticStorageFromCode
696468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_static_storage
6971d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME            # save callee saves in case of GC
6981d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*)
6995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeStaticStorageFromCode
7001d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a2, rSELF                          # pass Thread::Current
701cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
702468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_static_storage
7035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
70557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code when dex cache misses for a type_idx.
7065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
707d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeTypeFromCode
708468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type
7091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
7101d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*)
7115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeFromCode
7121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a2, rSELF                         # pass Thread::Current
713cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
714468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type
7155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
7175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when type_idx needs to be checked for access and dex cache may also
71857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * miss.
7195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
720d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeTypeAndVerifyAccessFromCode
721468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type_and_verify_access
7221d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
7231d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*)
7245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeAndVerifyAccessFromCode
7251d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a2, rSELF                         # pass Thread::Current
726cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
727468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type_and_verify_access
72837f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
72937f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and load a boolean primitive value.
73037f05ef45e0393de812d51261dc293240c17294dFred Shih     */
73137f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetBooleanStaticFromCode
73237f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_boolean_static
7331d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7341d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
7351d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetBooleanStaticFromCode   # (uint32_t field_idx, const Method* referrer, Thread*)
73637f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a2, rSELF                    # pass Thread::Current
73737f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
73837f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_boolean_static
73937f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
74037f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and load a byte primitive value.
74137f05ef45e0393de812d51261dc293240c17294dFred Shih     */
74237f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetByteStaticFromCode
74337f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_byte_static
7441d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7451d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
7461d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetByteStaticFromCode      # (uint32_t field_idx, const Method* referrer, Thread*)
74737f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a2, rSELF                    # pass Thread::Current
74837f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
74937f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_byte_static
75037f05ef45e0393de812d51261dc293240c17294dFred Shih
75137f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
75237f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and load a char primitive value.
75337f05ef45e0393de812d51261dc293240c17294dFred Shih     */
75437f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetCharStaticFromCode
75537f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_char_static
7561d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7571d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
7581d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetCharStaticFromCode      # (uint32_t field_idx, const Method* referrer, Thread*)
75937f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a2, rSELF                    # pass Thread::Current
76037f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
76137f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_char_static
76237f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
76337f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and load a short primitive value.
76437f05ef45e0393de812d51261dc293240c17294dFred Shih     */
76537f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetShortStaticFromCode
76637f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_short_static
7671d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7681d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
7691d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetShortStaticFromCode     # (uint32_t field_idx, const Method* referrer, Thread*)
77037f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a2, rSELF                    # pass Thread::Current
77137f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
77237f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_short_static
7735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
77557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 32-bit primitive value.
7765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
777d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32StaticFromCode
778468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_static
7791d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7801d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
7811d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGet32StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*)
7827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
7835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
784468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_static
7855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
78757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 64-bit primitive value.
7885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
789d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64StaticFromCode
790468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_static
7911d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7921d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
7931d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGet64StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*)
7947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
7955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
796468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_static
7975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
79957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load an object reference.
8005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
801d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjStaticFromCode
802468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_static
8031d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8041d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8051d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetObjStaticFromCode       # (uint32_t field_idx, const Method* referrer, Thread*)
8067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
8075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
808468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_static
8095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
81137f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and load a boolean primitive value.
81237f05ef45e0393de812d51261dc293240c17294dFred Shih     */
81337f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetBooleanInstanceFromCode
81437f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_boolean_instance
8151d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8161d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8171d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetBooleanInstanceFromCode # (field_idx, Object*, referrer, Thread*)
81837f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a3, rSELF                    # pass Thread::Current
81937f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
82037f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_boolean_instance
82137f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
82237f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and load a byte primitive value.
82337f05ef45e0393de812d51261dc293240c17294dFred Shih     */
82437f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetByteInstanceFromCode
82537f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_byte_instance
8261d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8271d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8281d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetByteInstanceFromCode    # (field_idx, Object*, referrer, Thread*)
82937f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a3, rSELF                    # pass Thread::Current
83037f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
83137f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_byte_instance
83237f05ef45e0393de812d51261dc293240c17294dFred Shih
83337f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
83437f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and load a char primitive value.
83537f05ef45e0393de812d51261dc293240c17294dFred Shih     */
83637f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetCharInstanceFromCode
83737f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_char_instance
8381d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8391d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8401d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetCharInstanceFromCode    # (field_idx, Object*, referrer, Thread*)
84137f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a3, rSELF                    # pass Thread::Current
84237f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
84337f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_char_instance
84437f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
84537f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and load a short primitive value.
84637f05ef45e0393de812d51261dc293240c17294dFred Shih     */
84737f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetShortInstanceFromCode
84837f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_short_instance
8491d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8501d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8511d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetShortInstanceFromCode      # (field_idx, Object*, referrer, Thread*)
85237f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a3, rSELF                    # pass Thread::Current
85337f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
85437f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_short_instance
85537f05ef45e0393de812d51261dc293240c17294dFred Shih
85637f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
85757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 32-bit primitive value.
8585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
859d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32InstanceFromCode
860468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_instance
8611d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8621d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
864fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet32InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
8654eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
867468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_instance
8685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
87057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 64-bit primitive value.
8715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
872d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64InstanceFromCode
873468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_instance
8741d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8751d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
877fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet64InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
8784eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
880468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_instance
8815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
88357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load an object reference.
8845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
885d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjInstanceFromCode
886468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_instance
8871d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8881d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8891d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetObjInstanceFromCode     # (field_idx, Object*, referrer, Thread*)
8907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
8915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
892468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_instance
8935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
89537f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and store a 8-bit primitive value.
89637f05ef45e0393de812d51261dc293240c17294dFred Shih     */
89737f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet8StaticFromCode
89837f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set8_static
8991d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9001d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
9011d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet8StaticFromCode         # (field_idx, new_val, referrer, Thread*)
90237f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a3, rSELF                    # pass Thread::Current
90337f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_ZERO
90437f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set8_static
90537f05ef45e0393de812d51261dc293240c17294dFred Shih
90637f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
90737f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and store a 16-bit primitive value.
90837f05ef45e0393de812d51261dc293240c17294dFred Shih     */
90937f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet16StaticFromCode
91037f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set16_static
9111d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
91337f05ef45e0393de812d51261dc293240c17294dFred Shih    jal    artSet16StaticFromCode        # (field_idx, new_val, referrer, Thread*, $sp)
9141d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move   $a3, rSELF                    # pass Thread::Current
91537f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_ZERO
91637f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set16_static
91737f05ef45e0393de812d51261dc293240c17294dFred Shih
91837f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
91957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 32-bit primitive value.
9205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
921d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32StaticFromCode
922468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_static
9231d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9241d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
9251d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet32StaticFromCode        # (field_idx, new_val, referrer, Thread*)
9267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
9275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
928468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_static
9295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
93157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 64-bit primitive value.
9325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
93337f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet64StaticFromCode
934468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_static
9351d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9361d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
9371d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet64StaticFromCode        # (field_idx, referrer, new_val, Thread*)
938fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
9395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
940468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_static
9415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
94357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store an object reference.
9445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
945d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjStaticFromCode
946468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_static
9471d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9481d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
9491d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSetObjStaticFromCode       # (field_idx, new_val, referrer, Thread*)
9507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
9515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
952468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_static
9535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
95537f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and store a 8-bit primitive value.
95637f05ef45e0393de812d51261dc293240c17294dFred Shih     */
95737f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet8InstanceFromCode
95837f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set8_instance
9591d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9601d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
9611d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet8InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*)
96237f05ef45e0393de812d51261dc293240c17294dFred Shih    sw     rSELF, 16($sp)                # pass Thread::Current
96337f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_ZERO
96437f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set8_instance
96537f05ef45e0393de812d51261dc293240c17294dFred Shih
96637f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
96737f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and store a 16-bit primitive value.
96837f05ef45e0393de812d51261dc293240c17294dFred Shih     */
96937f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet16InstanceFromCode
97037f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set16_instance
9711d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9721d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
9731d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet16InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*)
97437f05ef45e0393de812d51261dc293240c17294dFred Shih    sw     rSELF, 16($sp)                # pass Thread::Current
97537f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_ZERO
97637f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set16_instance
97737f05ef45e0393de812d51261dc293240c17294dFred Shih
97837f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
97957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 32-bit primitive value.
9805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
981d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32InstanceFromCode
982468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_instance
9831d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9841d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
9851d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet32InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*)
986fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
9875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
988468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_instance
9895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
99157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 64-bit primitive value.
9925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
99337f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet64InstanceFromCode
994468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_instance
9951d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9961d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $t0, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # load referrer's Method*
9971d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw     rSELF, 20($sp)                # pass Thread::Current
9981d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet64InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*)
9991d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw     $t0, 16($sp)                  # pass referrer's Method*
10005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
1001468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_instance
10025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
10035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
100457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store an object reference.
10055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1006d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjInstanceFromCode
1007468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_instance
10081d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
10091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
10101d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSetObjInstanceFromCode     # (field_idx, Object*, new_val, referrer, Thread*)
1011fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
10125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
1013468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_instance
10145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
10155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
10165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code to resolve a string, this stub will allocate a String and deliver an
10175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception on error. On success the String is returned. R0 holds the referring method,
10185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * R1 holds the string index. The fast path check for hit in strings cache has already been
10195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * performed.
10205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1021d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artResolveStringFromCode
1022468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolve_string
10231d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
10241d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*)
10255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artResolveStringFromCode
10261d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a2, rSELF                # pass Thread::Current
1027cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
1028468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolve_string
10295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
10303b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi
1031cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier// Macro to facilitate adding new allocation entrypoints.
1032cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro TWO_ARG_DOWNCALL name, entrypoint, return
1033cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    .extern \entrypoint
1034cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name
10351d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
1036cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    jal     \entrypoint
10371d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a2, rSELF                # pass Thread::Current
1038cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    \return
1039cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name
1040cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm
10415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1042cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro THREE_ARG_DOWNCALL name, entrypoint, return
1043cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    .extern \entrypoint
1044cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name
10451d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
1046cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    jal     \entrypoint
10471d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a3, rSELF                # pass Thread::Current
1048cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    \return
1049cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name
1050cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm
10515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
10527410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier// Generate the allocation entrypoints for each allocator.
10537410f29b4dae223befac036ea567d7f33351dad1Mathieu ChartierGENERATE_ALL_ALLOC_ENTRYPOINTS
10543b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi
10555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
105657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code when the value in rSUSPEND has been decremented to 0.
10575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1058d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artTestSuspendFromCode
1059d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_test_suspend
1060474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers    lh     $a0, THREAD_FLAGS_OFFSET(rSELF)
10617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $a0, 1f
10627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addi  rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL   # reset rSUSPEND to SUSPEND_CHECK_INTERVAL
10637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
10645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
10655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
10661d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME          # save callee saves for stack crawl
10671d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artTestSuspendFromCode              # (Thread*)
10687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a0, rSELF
10691d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
1070d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_test_suspend
10715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
10725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
10735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code that is attempting to call a method on a proxy class. On entry
107457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * r0 holds the proxy method; r1, r2 and r3 may contain arguments.
10755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
10765fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    .extern artQuickProxyInvokeHandler
1077d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_proxy_invoke_handler
10781d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME
10797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw      $a0, 0($sp)            # place proxy method at bottom of frame
10807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF             # pass Thread::Current
10815fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    jal     artQuickProxyInvokeHandler  # (Method* proxy method, receiver, Thread*, SP)
1082af6e67a4816d2593586115b89faa659225363246Ian Rogers    move    $a3, $sp               # pass $sp
10837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
10841d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
10857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez    $t0, 1f
1086b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v0, $f0               # place return value to FP return value
10877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1088b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v1, $f1               # place return value to FP return value
10895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
10905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
1091d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_proxy_invoke_handler
10925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
109388474b416eb257078e590bf9bc7957cee604a186Jeff Hao    /*
109488474b416eb257078e590bf9bc7957cee604a186Jeff Hao     * Called to resolve an imt conflict. t0 is a hidden argument that holds the target method's
109588474b416eb257078e590bf9bc7957cee604a186Jeff Hao     * dex method index.
109688474b416eb257078e590bf9bc7957cee604a186Jeff Hao     */
109713738bf7c769638b7922cb2477471ad382632bc2Douglas LeungENTRY art_quick_imt_conflict_trampoline
109888474b416eb257078e590bf9bc7957cee604a186Jeff Hao    lw      $a0, 0($sp)            # load caller Method*
10991d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw      $a0, MIRROR_ART_METHOD_DEX_CACHE_METHODS_OFFSET($a0)  # load dex_cache_resolved_methods
110088474b416eb257078e590bf9bc7957cee604a186Jeff Hao    sll     $t0, 2                 # convert target method offset to bytes
110188474b416eb257078e590bf9bc7957cee604a186Jeff Hao    add     $a0, $t0               # get address of target method
11021d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw      $a0, MIRROR_OBJECT_ARRAY_DATA_OFFSET($a0)  # load the target method
110388474b416eb257078e590bf9bc7957cee604a186Jeff Hao    la      $t9, art_quick_invoke_interface_trampoline
110488474b416eb257078e590bf9bc7957cee604a186Jeff Hao    jr      $t9
110588474b416eb257078e590bf9bc7957cee604a186Jeff HaoEND art_quick_imt_conflict_trampoline
110688474b416eb257078e590bf9bc7957cee604a186Jeff Hao
1107468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .extern artQuickResolutionTrampoline
1108468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolution_trampoline
11091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME
1110468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    move    $a2, rSELF             # pass Thread::Current
111165d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers    jal     artQuickResolutionTrampoline  # (Method* called, receiver, Thread*, SP)
1112468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    move    $a3, $sp               # pass $sp
1113468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    beqz    $v0, 1f
1114468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    lw      $a0, 0($sp)            # load resolved method to $a0
11151d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
111665d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers    move    $t9, $v0               # code pointer must be in $t9 to generate the global pointer
1117468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    jr      $v0                    # tail call to method
11181984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    nop
1119468532ea115657709bc32ee498e701a4c71762d4Ian Rogers1:
11201d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
1121468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    DELIVER_PENDING_EXCEPTION
1122468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolution_trampoline
1123468532ea115657709bc32ee498e701a4c71762d4Ian Rogers
11242da882315a61072664f7ce3c212307342e907207Andreas GampeUNIMPLEMENTED art_quick_generic_jni_trampoline
11252da882315a61072664f7ce3c212307342e907207Andreas Gampe
1126468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .extern artQuickToInterpreterBridge
1127468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_to_interpreter_bridge
11281d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME
11297db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    move    $a1, rSELF             # pass Thread::Current
1130468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    jal     artQuickToInterpreterBridge    # (Method* method, Thread*, SP)
11317db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    move    $a2, $sp               # pass $sp
11327db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
11331d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
11347db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    bnez    $t0, 1f
1135b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v0, $f0               # place return value to FP return value
11367db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    jr      $ra
1137b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v1, $f1               # place return value to FP return value
11387db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers1:
11397db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    DELIVER_PENDING_EXCEPTION
1140468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_to_interpreter_bridge
11417db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers
11425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1143725a957985171d712d5c048cc3d00ff14968784bjeffhao     * Routine that intercepts method calls and returns.
11445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1145d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodEntryFromCode
1146d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodExitFromCode
1147468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_instrumentation_entry
11481d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME
114912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $sp       # remember bottom of caller's frame
11501d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    addiu    $sp, $sp, -32  # space for saved a0, pad (2 words), arguments (4 words)
115162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset 32
115262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $a0, 28($sp)   # save arg0
11531d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move     $a3, $ra       # pass $ra
11541d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal      artInstrumentationMethodEntryFromCode  # (Method*, Object*, Thread*, LR)
115562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, rSELF     # pass Thread::Current
11568161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move     $t9, $v0       # $t9 holds reference to code
115762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $a0, 28($sp)   # restore arg0
115862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, 32   # remove args
115962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset -32
11601d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
11618161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jalr     $t9            # call method
116262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    nop
1163468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_entry
11645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* intentional fallthrough */
1165468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .global art_quick_instrumentation_exit
1166468532ea115657709bc32ee498e701a4c71762d4Ian Rogersart_quick_instrumentation_exit:
1167d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_startproc
116812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    addiu    $t9, $ra, 4    # put current address into $t9 to rebuild $gp
11691d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    .cpload  $t9
1170c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung    move     $ra, $zero     # link register is to here, so clobber with 0 for later checks
11711d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME
1172c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung    move     $t0, $sp       # remember bottom of caller's frame
117362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, -48  # save return values and set up args
117462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset 48
117562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $v0, 32($sp)
1176c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung    .cfi_rel_offset 2, 32
117762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $v1, 36($sp)
1178c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung    .cfi_rel_offset 3, 36
117962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f0, 40($sp)
118062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f1, 44($sp)
118162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f0, 16($sp)   # pass fpr result
118262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f1, 20($sp)
118362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, $v0       # pass gpr result
118462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a3, $v1
118512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $a1, $t0       # pass $sp
118662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artInstrumentationMethodExitFromCode  # (Thread*, SP, gpr_res, fpr_res)
118712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $a0, rSELF     # pass Thread::Current
118812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $v0       # set aside returned link register
118912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $ra, $v1       # set link register for deoptimization
119062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $v0, 32($sp)   # restore return values
119162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $v1, 36($sp)
119262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    l.s      $f0, 40($sp)
119362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    l.s      $f1, 44($sp)
119412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    jr       $t0            # return
119562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, 112  # 48 bytes of args + 64 bytes of callee save frame
119662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset -112
1197468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_exit
11985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
119912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    /*
120062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization
120162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * will long jump to the upcall with a special exception of -1.
120212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao     */
1203d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artDeoptimize
1204d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deoptimize
120514dd5a82ad85a28612bf86e755ff929d767cea4cJeff Hao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
12061d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal      artDeoptimize  # artDeoptimize(Thread*)
120712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao                            # Returns caller method's frame size.
12081d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move     $a0, rSELF     # pass Thread::current
1209d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deoptimize
121012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao
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:
12177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
12187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
12197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
12205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
12211d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_shl_long
12225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* shl-long vAA, vBB, vCC */
12237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v0, $a0, $a2                    #  rlo<- alo << (shift&31)
12247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $v1, $a2                         #  rhi<- 31-shift  (shift is 5b)
12257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, 1
12267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, $v1                         #  alo<- alo >> (32-(shift&31))
12277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v1, $a1, $a2                    #  rhi<- ahi << (shift&31)
12287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v1, $a0                         #  rhi<- rhi | alo
12297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift< shift & 0x20
12307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $v0, $a2                    #  rhi<- rlo (if shift&0x20)
12317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1232fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    movn    $v0, $zero, $a2                  #  rlo<- 0  (if shift&0x20)
1233d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shl_long
12345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
12355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
12365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
12375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
12385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
12395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
12405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
12417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
12427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
12437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
12445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
12451d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_shr_long
12467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
12477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
12487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $a3, $a1, 31                     #  $a3<- sign(ah)
12497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
12507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
12517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
12527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
12537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
12547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
12557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
12567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $a3, $a2                    #  rhi<- sign(ahi) (if shift&0x20)
1257d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shr_long
12585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
12595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
12605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
12615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
12625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
12635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
12645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
12655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r0: low word
12665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r1: high word
12675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r2: shift count
12685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
12695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* ushr-long vAA, vBB, vCC */
12701d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_ushr_long
1271fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    srl     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
12727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
12737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
12747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
12757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
12767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
12777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
12787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
12797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1280fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    movn    $v1, $zero, $a2                  #  rhi<- 0 (if shift&0x20)
1281d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_ushr_long
12827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao
12831d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersUNIMPLEMENTED art_quick_indexof
12841d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersUNIMPLEMENTED art_quick_string_compareto
1285