quick_entrypoints_mips.S revision 1d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5
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
681d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    ld $t0, _ZN3art7Runtime9instance_E
691d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    THIS_LOAD_REQUIRES_READ_BARRIER
701d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    ld $t0, RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET($t0)
711d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $t0, 0($sp)                                # Place Method* at bottom of stack.
721d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF)  # Place sp in Thread::Current()->top_quick_frame.
735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC.
785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Does not include rSUSPEND or rSELF
791f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao     * callee-save: $s2-$s8 + $gp + $ra, 9 total + 3 words padding + 4 open words for args
805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
811d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro SETUP_REFS_ONLY_CALLEE_SAVE_FRAME
824eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, -64
83d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset 64
845c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
855c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe    // Ugly compile-time check, but we only have the preprocessor.
865c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_REFS_ONLY_CALLEE_SAVE != 64)
875c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "REFS_ONLY_CALLEE_SAVE_FRAME(MIPS) size not as expected."
885c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif
895c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
904eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $ra, 60($sp)
91d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 31, 60
924eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $s8, 56($sp)
93d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 30, 56
941f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $gp, 52($sp)
951f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 28, 52
961f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s7, 48($sp)
971f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 23, 48
981f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s6, 44($sp)
991f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 22, 44
1001f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s5, 40($sp)
1011f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 21, 40
1021f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s4, 36($sp)
1031f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 20, 36
1041f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s3, 32($sp)
1051f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 19, 32
1061f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s2, 28($sp)
1071f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 18, 28
108fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    # 3 words for alignment and extra args, 4 open words for args $a0-$a3, bottom will hold Method*
1091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers
1101d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    ld $t0, _ZN3art7Runtime9instance_E
1111d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    THIS_LOAD_REQUIRES_READ_BARRIER
1121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    ld $t0, RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET($t0)
1131d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $t0, 0($sp)                                # Place Method* at bottom of stack.
1141d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF)  # Place sp in Thread::Current()->top_quick_frame.
1155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1171d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
1184eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $ra, 60($sp)
119bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
1202a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s8, 56($sp)
121bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
1222a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $gp, 52($sp)
123bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 28
1242a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s7, 48($sp)
125bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 23
1262a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s6, 44($sp)
127bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 22
1282a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s5, 40($sp)
129bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 21
1302a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s4, 36($sp)
131bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 20
1322a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s3, 32($sp)
133bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 19
1342a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s2, 28($sp)
135bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 18
1364eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, 64
137d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -64
1385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1401d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
1414eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $ra, 60($sp)
142bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
1432a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s8, 56($sp)
144bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
1452a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $gp, 52($sp)
146bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 28
1472a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s7, 48($sp)
148bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 23
1492a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s6, 44($sp)
150bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 22
1512a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s5, 40($sp)
152bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 21
1532a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s4, 36($sp)
154bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 20
1552a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s3, 32($sp)
156bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 19
1572a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s2, 28($sp)
158bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 18
1597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
1604eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, 64
161d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -64
1625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
1665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC.
1671f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao     * callee-save: $a1-$a3, $s2-$s8 + $gp + $ra, 12 total + 3 words padding + method*
1685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1691d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME
1701f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    addiu  $sp, $sp, -64
1711f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_adjust_cfa_offset 64
1725c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
1735c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe    // Ugly compile-time check, but we only have the preprocessor.
1745c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE != 64)
1755c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "REFS_AND_ARGS_CALLEE_SAVE_FRAME(MIPS) size not as expected."
1765c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif
1775c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
1781f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $ra, 60($sp)
1791f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 31, 60
1801f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s8, 56($sp)
1811f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 30, 56
1821f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $gp, 52($sp)
1831f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 28, 52
1841f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s7, 48($sp)
1851f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 23, 48
1861f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s6, 44($sp)
1871f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 22, 44
1881f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s5, 40($sp)
1891f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 21, 40
1901f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s4, 36($sp)
1911f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 20, 36
1921f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s3, 32($sp)
1931f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 19, 32
1941f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s2, 28($sp)
1951f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 18, 28
1967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a3, 12($sp)
197d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 7, 12
1987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a2, 8($sp)
199d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 6, 8
2007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a1, 4($sp)
201d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 5, 4
202fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    # bottom will hold Method*
2031d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers
2041d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    ld $t0, _ZN3art7Runtime9instance_E
2051d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    THIS_LOAD_REQUIRES_READ_BARRIER
2061d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    ld $t0, RUNTIME_REFS_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET($t0)
2071d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $t0, 0($sp)                                # Place Method* at bottom of stack.
2081d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF)  # Place sp in Thread::Current()->top_quick_frame.
2095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2111d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
2122a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $ra, 60($sp)
213bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
2142a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s8, 56($sp)
215bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
2162a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $gp, 52($sp)
217bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 28
2182a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s7, 48($sp)
219bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 23
2202a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s6, 44($sp)
221bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 22
2222a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s5, 40($sp)
223bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 21
2242a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s4, 36($sp)
225bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 20
2262a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s3, 32($sp)
227bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 19
2282a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s2, 28($sp)
229bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 18
2302a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $a3, 12($sp)
231bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 7
2322a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $a2, 8($sp)
233bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 6
2342a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $a1, 4($sp)
235bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 5
236468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    addiu  $sp, $sp, 64           # pop frame
2371f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_adjust_cfa_offset -64
2385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending
2425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception is Thread::Current()->exception_
2435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
2445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro DELIVER_PENDING_EXCEPTION
2458161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME     # save callee saves for throw
2468161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la      $t9, artDeliverPendingExceptionFromCode
2471d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr      $t9                          # artDeliverPendingExceptionFromCode(Thread*)
2481d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a0, rSELF                   # pass Thread::Current
2495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NO_EXCEPTION
2527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
2531d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
2548161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    bnez   $t0, 1f                       # success if no exception is pending
2555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
2575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
2595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
2605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_ZERO
2631d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
2647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $v0, 1f                       # success?
2655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra                           # return on success
2675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
2695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
2705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
272cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro RETURN_IF_RESULT_IS_NON_ZERO
2731d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
2747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    beqz   $v0, 1f                       # success?
2755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra                           # return on success
2775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
2795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
2805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * On entry $a0 is uint32_t* gprs_ and $a1 is uint32_t* fprs_
2845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * FIXME: just guessing about the shape of the jmpbuf.  Where will pc be?
2855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
286d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_do_long_jump
2877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f0, 0($a1)
2887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f1, 4($a1)
2897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f2, 8($a1)
2907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f3, 12($a1)
2917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f4, 16($a1)
2927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f5, 20($a1)
2937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f6, 24($a1)
2947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f7, 28($a1)
2957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f8, 32($a1)
2967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f9, 36($a1)
2977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f10, 40($a1)
2987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f11, 44($a1)
2997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f12, 48($a1)
3007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f13, 52($a1)
3017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f14, 56($a1)
3027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f15, 60($a1)
3037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f16, 64($a1)
3047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f17, 68($a1)
3057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f18, 72($a1)
3067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f19, 76($a1)
3077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f20, 80($a1)
3087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f21, 84($a1)
3097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f22, 88($a1)
3107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f23, 92($a1)
3117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f24, 96($a1)
3127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f25, 100($a1)
3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f26, 104($a1)
3147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f27, 108($a1)
3157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f28, 112($a1)
3167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f29, 116($a1)
3177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f30, 120($a1)
3187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f31, 124($a1)
319748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set push
320748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set nomacro
321748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set noat
3227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $at, 4($a0)
323748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set pop
3247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v0, 8($a0)
3257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v1, 12($a0)
3267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a1, 20($a0)
3277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a2, 24($a0)
3287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a3, 28($a0)
3297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, 32($a0)
3307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t1, 36($a0)
3317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t2, 40($a0)
3327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t3, 44($a0)
3337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t4, 48($a0)
3347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t5, 52($a0)
3357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t6, 56($a0)
3367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t7, 60($a0)
3377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s0, 64($a0)
3387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s1, 68($a0)
3397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s2, 72($a0)
3407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s3, 76($a0)
3417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s4, 80($a0)
3427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s5, 84($a0)
3437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s6, 88($a0)
3447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s7, 92($a0)
3457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t8, 96($a0)
3467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t9, 100($a0)
3477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $gp, 112($a0)
3487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $sp, 116($a0)
3497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $fp, 120($a0)
3507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $ra, 124($a0)
3517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a0, 16($a0)
3527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v0, $zero          # clear result registers r0 and r1
3537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra                 # do long jump
3547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v1, $zero
355d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_do_long_jump
3565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code, saves most registers (forms basis of long jump context) and passes
3595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at
3605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the thread. On entry r0 holds Throwable*
3615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
362468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_deliver_exception
36357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3648161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artDeliverExceptionFromCode
3651d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artDeliverExceptionFromCode(Throwable*, Thread*)
3661d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a1, rSELF                 # pass Thread::Current
367468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_deliver_exception
3685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver a NullPointerException
3715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
372d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNullPointerExceptionFromCode
373468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_null_pointer_exception
37457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3758161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNullPointerExceptionFromCode
3761d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artThrowNullPointerExceptionFromCode(Thread*)
3771d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a0, rSELF                 # pass Thread::Current
378468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_null_pointer_exception
3795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArithmeticException
3825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
383d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowDivZeroFromCode
384468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_div_zero
38557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3868161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowDivZeroFromCode
3871d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artThrowDivZeroFromCode(Thread*)
3881d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a0, rSELF                 # pass Thread::Current
389468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_div_zero
3905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException
3935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
394d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowArrayBoundsFromCode
395468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_array_bounds
39657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3978161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowArrayBoundsFromCode
3981d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artThrowArrayBoundsFromCode(index, limit, Thread*)
3991d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a2, rSELF                 # pass Thread::Current
400468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_array_bounds
4015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
40257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
40357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a StackOverflowError.
40457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
405d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowStackOverflowFromCode
406468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_stack_overflow
40757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
4088161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowStackOverflowFromCode
4091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artThrowStackOverflowFromCode(Thread*)
4101d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a0, rSELF                 # pass Thread::Current
411468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_stack_overflow
4125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
41357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
41457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a NoSuchMethodError.
41557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
416d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNoSuchMethodFromCode
417468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_no_such_method
41857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
4198161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNoSuchMethodFromCode
4201d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artThrowNoSuchMethodFromCode(method_idx, Thread*)
4211d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a1, rSELF                 # pass Thread::Current
422468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_no_such_method
4235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
4255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * All generated callsites for interface invokes and invocation slow paths will load arguments
4267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain
4275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the method_idx.  This wrapper will save arg1-arg3, load the caller's Method*, align the
4285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * stack and call the appropriate C helper.
4297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1.
4305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
4317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting
4327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * of the target Method* in $v0 and method->code_ in $v1.
4335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
434fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao     * If unsuccessful, the helper will return NULL/NULL. There will be a pending exception in the
4355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * thread and we branch to another stub to deliver it.
4365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
4375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On success this wrapper will restore arguments and *jump* to the target, leaving the lr
4385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * pointing back to the original caller.
4395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
4405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name
4415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern \cxx_name
442d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY \c_name
4431d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME  # save callee saves in case allocation triggers GC
4441d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw    $a2, FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE($sp)                    # pass caller Method*
445fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move  $t0, $sp                        # save $sp
44658df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, -32                   # make space for extra args
44758df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset 32
4487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move  $a3, rSELF                      # pass Thread::Current
449d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 28, 12
4507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal   \cxx_name                       # (method_idx, this, caller, Thread*, $sp)
451fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw    $t0, 16($sp)                    # pass $sp
45258df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, 32                    # release out args
45358df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset -32
454fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move  $a0, $v0                        # save target Method*
45530a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    move  $t9, $v1                        # save $v0->code_
4561d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
457fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    beqz  $v0, 1f
4585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
45930a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    jr    $t9
4605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
4615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
4625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
463d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND \c_name
4645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
4655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4668dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline
4678dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck
4685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4698dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck
4708dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck
4718dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck
4728dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck
4735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
47479fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    /*
475ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers     * Invocation stub for quick code.
4765d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     * On entry:
4775d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a0 = method pointer
4785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a1 = argument array or NULL for no argument methods
4795d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a2 = size of argument array in bytes
4805d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a3 = (managed) thread pointer
4816474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao     *   [sp + 16] = JValue* result
4820177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers     *   [sp + 20] = shorty
4835d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     */
4845d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoENTRY art_quick_invoke_stub
4855d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $a0, 0($sp)           # save out a0
4865d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # spill s0, s1, fp, ra
4875d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset 16
4885d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $ra, 12($sp)
4895d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 31, 12
4905d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $fp, 8($sp)
4915d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 30, 8
4925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s1, 4($sp)
4935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 17, 4
4945d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s0, 0($sp)
4955d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 16, 0
4965d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $fp, $sp              # save sp in fp
4975d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_def_cfa_register 30
4985d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $s1, $a3              # move managed thread pointer into s1
4995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $s0, $zero, SUSPEND_CHECK_INTERVAL  # reset s0 to suspend check interval
5005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $t0, $a2, 16          # create space for method pointer in frame
501b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    srl   $t0, $t0, 4           # shift the frame size right 4
502b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    sll   $t0, $t0, 4           # shift the frame size left 4 to align to 16 bytes
5035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    subu  $sp, $sp, $t0         # reserve stack space for argument array
5045d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $a0, $sp, 4           # pass stack pointer + method ptr as dest for memcpy
5055d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jal   memcpy                # (dest, src, bytes)
5065d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # make space for argument slots for memcpy
5075d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16          # restore stack after memcpy
5085d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a0, 16($fp)          # restore method*
5095d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a1, 4($sp)           # copy arg value for a1
5105d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a2, 8($sp)           # copy arg value for a2
5115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a3, 12($sp)          # copy arg value for a3
5121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw    $t9, MIRROR_ART_METHOD_QUICK_CODE_OFFSET($a0)  # get pointer to the code
5135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jalr  $t9                   # call the method
5145d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $zero, 0($sp)         # store NULL for method* at bottom of frame
5155d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $sp, $fp              # restore the stack
5165d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s0, 0($sp)
517bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 16
5185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s1, 4($sp)
519bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 17
5205d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $fp, 8($sp)
521bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
5225d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $ra, 12($sp)
523bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
5245d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16
5255d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset -16
5265d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $t0, 16($sp)          # get result pointer
5270177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers    lw    $t1, 20($sp)          # get shorty
5280177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers    lb    $t1, 0($t1)           # get result type char
5296474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t2, 68               # put char 'D' into t2
5306474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t2, 1f          # branch if result type char == 'D'
5316474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t3, 70               # put char 'F' into t3
5326474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t3, 1f          # branch if result type char == 'F'
5335d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v0, 0($t0)           # store the result
5346474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    jr    $ra
5355d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v1, 4($t0)           # store the other half of the result
5366474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao1:
53719ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao    s.s   $f0, 0($t0)           # store floating point result
5385d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jr    $ra
53919ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao    s.s   $f1, 4($t0)           # store other half of floating point result
5405d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoEND art_quick_invoke_stub
5415d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao
5425d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    /*
5435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on
5445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * failure.
5455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
546d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artHandleFillArrayDataFromCode
547468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_handle_fill_data
5481d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
5491d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)                   # pass referrer's Method*
5501d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artHandleFillArrayDataFromCode # (payload offset, Array*, method, Thread*)
551832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers    move   $a3, rSELF                     # pass Thread::Current
552fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    RETURN_IF_ZERO
553468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_handle_fill_data
5545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
55657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code that calls artLockObjectFromCode, may block for GC.
5575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
558d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artLockObjectFromCode
559468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_lock_object
56086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz    $a0, .Lart_quick_throw_null_pointer_exception_gp_set
561a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
5621d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME      # save callee saves in case we block
5631d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal     artLockObjectFromCode         # (Object* obj, Thread*)
5647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                    # pass Thread::Current
5656bcd163d322b867578fbcfe60e4e3b247c42974bIan Rogers    RETURN_IF_ZERO
566468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_lock_object
5675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure.
5705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
571d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artUnlockObjectFromCode
572468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_unlock_object
57386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz    $a0, .Lart_quick_throw_null_pointer_exception_gp_set
574a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
5751d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
5761d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal     artUnlockObjectFromCode   # (Object* obj, Thread*)
5777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                # pass Thread::Current
5785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
579468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_unlock_object
5805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure.
5835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
584a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .extern artThrowClassCastException
585468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_cast
586a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, -16
587a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset 16
588a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $ra, 12($sp)
589a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_rel_offset 31, 12
590a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $t9, 8($sp)
591a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a1, 4($sp)
592a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a0, 0($sp)
593a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jal    artIsAssignableFromCode
594a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
59586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz   $v0, .Lthrow_class_cast_exception
596a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $ra, 12($sp)
597a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr     $ra
598a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, 16
599a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -16
60086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lthrow_class_cast_exception:
601a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $t9, 8($sp)
602a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a1, 4($sp)
603a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a0, 0($sp)
604a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, 16
605a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -16
606a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
607a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    la   $t9, artThrowClassCastException
6081d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artThrowClassCastException (Class*, Class*, Thread*)
6091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a2, rSELF                 # pass Thread::Current
610468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_cast
6115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
613a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * Entry from managed code for array put operations of objects where the value being stored
614a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * needs to be checked for compatibility.
615a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * a0 = array, a1 = index, a2 = value
6165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
617a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_null_and_bound_check
61886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez    $a0, .Lart_quick_aput_obj_with_bound_check_gp_set
619a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
62086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    b .Lart_quick_throw_null_pointer_exception_gp_set
621a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
622a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_null_and_bound_check
623a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers
624a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_bound_check
6251d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw $t0, MIRROR_ARRAY_LENGTH_OFFSET($a0)
626a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sltu $t1, $a1, $t0
62786bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez $t1, .Lart_quick_aput_obj_gp_set
628a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
629a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a0, $a1
63086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    b .Lart_quick_throw_array_bounds_gp_set
631a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a1, $t0
632a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_bound_check
633a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers
634a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj
63586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz $a2, .Ldo_aput_null
636a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
6371d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw $t0, MIRROR_OBJECT_CLASS_OFFSET($a0)
6381d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw $t1, MIRROR_OBJECT_CLASS_OFFSET($a2)
6391d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw $t0, MIRROR_CLASS_COMPONENT_TYPE_OFFSET($t0)
64086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bne $t1, $t0, .Lcheck_assignability  # value's type == array's component type - trivial assignability
641a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
64286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput:
643a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sll $a1, $a1, 2
644a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t0, $a0, $a1
6451d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw  $a2, MIRROR_OBJECT_ARRAY_DATA_OFFSET($t0)
646a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw  $t0, THREAD_CARD_TABLE_OFFSET(rSELF)
647a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    srl $t1, $a0, 7
648a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t1, $t1, $t0
649a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sb  $t0, ($t1)
650a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr  $ra
651a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
65286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput_null:
653a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sll $a1, $a1, 2
654a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t0, $a0, $a1
6551d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw  $a2, MIRROR_OBJECT_ARRAY_DATA_OFFSET($t0)
656a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr  $ra
657a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
65886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lcheck_assignability:
659a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, -32
660a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset 32
661a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $ra, 28($sp)
662a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_rel_offset 31, 28
663a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $t9, 12($sp)
664a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a2, 8($sp)
665a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a1, 4($sp)
666a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a0, 0($sp)
667a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move   $a1, $t1
668a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move   $a0, $t0
669a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jal    artIsAssignableFromCode  # (Class*, Class*)
670a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
671a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $ra, 28($sp)
672a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $t9, 12($sp)
673a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a2, 8($sp)
674a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a1, 4($sp)
675a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a0, 0($sp)
676a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add    $sp, 32
677a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -32
67886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez   $v0, .Ldo_aput
679a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
680a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
681a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a1, $a2
682a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    la   $t9, artThrowArrayStoreException
6831d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jr   $t9                        # artThrowArrayStoreException(Class*, Class*, Thread*)
6841d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a2, rSELF                 # pass Thread::Current
685a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj
6865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
6885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when uninitialized static storage, this stub will run the class
6895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * initializer and deliver the exception on error. On success the static storage base is
6905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * returned.
6915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
692d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeStaticStorageFromCode
693468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_static_storage
6941d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME            # save callee saves in case of GC
6951d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*)
6965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeStaticStorageFromCode
6971d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a2, rSELF                          # pass Thread::Current
698cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
699468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_static_storage
7005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
70257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code when dex cache misses for a type_idx.
7035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
704d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeTypeFromCode
705468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type
7061d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
7071d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*)
7085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeFromCode
7091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a2, rSELF                         # pass Thread::Current
710cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
711468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type
7125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
7145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when type_idx needs to be checked for access and dex cache may also
71557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * miss.
7165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
717d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeTypeAndVerifyAccessFromCode
718468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type_and_verify_access
7191d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
7201d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*)
7215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeAndVerifyAccessFromCode
7221d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a2, rSELF                         # pass Thread::Current
723cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
724468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type_and_verify_access
72537f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
72637f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and load a boolean primitive value.
72737f05ef45e0393de812d51261dc293240c17294dFred Shih     */
72837f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetBooleanStaticFromCode
72937f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_boolean_static
7301d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7311d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
7321d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetBooleanStaticFromCode   # (uint32_t field_idx, const Method* referrer, Thread*)
73337f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a2, rSELF                    # pass Thread::Current
73437f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
73537f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_boolean_static
73637f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
73737f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and load a byte primitive value.
73837f05ef45e0393de812d51261dc293240c17294dFred Shih     */
73937f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetByteStaticFromCode
74037f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_byte_static
7411d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7421d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
7431d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetByteStaticFromCode      # (uint32_t field_idx, const Method* referrer, Thread*)
74437f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a2, rSELF                    # pass Thread::Current
74537f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
74637f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_byte_static
74737f05ef45e0393de812d51261dc293240c17294dFred Shih
74837f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
74937f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and load a char primitive value.
75037f05ef45e0393de812d51261dc293240c17294dFred Shih     */
75137f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetCharStaticFromCode
75237f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_char_static
7531d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7541d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
7551d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetCharStaticFromCode      # (uint32_t field_idx, const Method* referrer, Thread*)
75637f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a2, rSELF                    # pass Thread::Current
75737f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
75837f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_char_static
75937f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
76037f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and load a short primitive value.
76137f05ef45e0393de812d51261dc293240c17294dFred Shih     */
76237f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetShortStaticFromCode
76337f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_short_static
7641d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7651d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
7661d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetShortStaticFromCode     # (uint32_t field_idx, const Method* referrer, Thread*)
76737f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a2, rSELF                    # pass Thread::Current
76837f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
76937f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_short_static
7705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
77257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 32-bit primitive value.
7735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
774d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32StaticFromCode
775468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_static
7761d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7771d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
7781d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGet32StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*)
7797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
7805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
781468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_static
7825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
78457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 64-bit primitive value.
7855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
786d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64StaticFromCode
787468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_static
7881d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7891d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
7901d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGet64StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*)
7917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
7925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
793468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_static
7945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
79657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load an object reference.
7975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
798d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjStaticFromCode
799468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_static
8001d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8011d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8021d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetObjStaticFromCode       # (uint32_t field_idx, const Method* referrer, Thread*)
8037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
8045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
805468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_static
8065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
80837f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and load a boolean primitive value.
80937f05ef45e0393de812d51261dc293240c17294dFred Shih     */
81037f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetBooleanInstanceFromCode
81137f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_boolean_instance
8121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8131d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8141d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetBooleanInstanceFromCode # (field_idx, Object*, referrer, Thread*)
81537f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a3, rSELF                    # pass Thread::Current
81637f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
81737f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_boolean_instance
81837f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
81937f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and load a byte primitive value.
82037f05ef45e0393de812d51261dc293240c17294dFred Shih     */
82137f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetByteInstanceFromCode
82237f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_byte_instance
8231d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8241d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8251d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetByteInstanceFromCode    # (field_idx, Object*, referrer, Thread*)
82637f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a3, rSELF                    # pass Thread::Current
82737f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
82837f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_byte_instance
82937f05ef45e0393de812d51261dc293240c17294dFred Shih
83037f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
83137f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and load a char primitive value.
83237f05ef45e0393de812d51261dc293240c17294dFred Shih     */
83337f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetCharInstanceFromCode
83437f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_char_instance
8351d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8361d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8371d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetCharInstanceFromCode    # (field_idx, Object*, referrer, Thread*)
83837f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a3, rSELF                    # pass Thread::Current
83937f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
84037f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_char_instance
84137f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
84237f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and load a short primitive value.
84337f05ef45e0393de812d51261dc293240c17294dFred Shih     */
84437f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetShortInstanceFromCode
84537f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_short_instance
8461d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8471d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8481d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetShortInstanceFromCode      # (field_idx, Object*, referrer, Thread*)
84937f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a3, rSELF                    # pass Thread::Current
85037f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
85137f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_short_instance
85237f05ef45e0393de812d51261dc293240c17294dFred Shih
85337f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
85457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 32-bit primitive value.
8555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
856d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32InstanceFromCode
857468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_instance
8581d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8591d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
861fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet32InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
8624eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
864468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_instance
8655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
86757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 64-bit primitive value.
8685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
869d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64InstanceFromCode
870468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_instance
8711d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8721d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
874fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet64InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
8754eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
877468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_instance
8785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
88057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load an object reference.
8815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
882d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjInstanceFromCode
883468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_instance
8841d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8851d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8861d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetObjInstanceFromCode     # (field_idx, Object*, referrer, Thread*)
8877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
8885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
889468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_instance
8905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
89237f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and store a 8-bit primitive value.
89337f05ef45e0393de812d51261dc293240c17294dFred Shih     */
89437f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet8StaticFromCode
89537f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set8_static
8961d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8971d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
8981d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet8StaticFromCode         # (field_idx, new_val, referrer, Thread*)
89937f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a3, rSELF                    # pass Thread::Current
90037f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_ZERO
90137f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set8_static
90237f05ef45e0393de812d51261dc293240c17294dFred Shih
90337f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
90437f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and store a 16-bit primitive value.
90537f05ef45e0393de812d51261dc293240c17294dFred Shih     */
90637f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet16StaticFromCode
90737f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set16_static
9081d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
91037f05ef45e0393de812d51261dc293240c17294dFred Shih    jal    artSet16StaticFromCode        # (field_idx, new_val, referrer, Thread*, $sp)
9111d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move   $a3, rSELF                    # pass Thread::Current
91237f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_ZERO
91337f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set16_static
91437f05ef45e0393de812d51261dc293240c17294dFred Shih
91537f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
91657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 32-bit primitive value.
9175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
918d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32StaticFromCode
919468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_static
9201d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9211d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
9221d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet32StaticFromCode        # (field_idx, new_val, referrer, Thread*)
9237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
9245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
925468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_static
9265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
92857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 64-bit primitive value.
9295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
93037f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet64StaticFromCode
931468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_static
9321d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9331d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
9341d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet64StaticFromCode        # (field_idx, referrer, new_val, Thread*)
935fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
9365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
937468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_static
9385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
94057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store an object reference.
9415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
942d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjStaticFromCode
943468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_static
9441d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9451d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
9461d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSetObjStaticFromCode       # (field_idx, new_val, referrer, Thread*)
9477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
9485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
949468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_static
9505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
95237f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and store a 8-bit primitive value.
95337f05ef45e0393de812d51261dc293240c17294dFred Shih     */
95437f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet8InstanceFromCode
95537f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set8_instance
9561d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9571d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
9581d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet8InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*)
95937f05ef45e0393de812d51261dc293240c17294dFred Shih    sw     rSELF, 16($sp)                # pass Thread::Current
96037f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_ZERO
96137f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set8_instance
96237f05ef45e0393de812d51261dc293240c17294dFred Shih
96337f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
96437f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and store a 16-bit primitive value.
96537f05ef45e0393de812d51261dc293240c17294dFred Shih     */
96637f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet16InstanceFromCode
96737f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set16_instance
9681d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9691d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
9701d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet16InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*)
97137f05ef45e0393de812d51261dc293240c17294dFred Shih    sw     rSELF, 16($sp)                # pass Thread::Current
97237f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_ZERO
97337f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set16_instance
97437f05ef45e0393de812d51261dc293240c17294dFred Shih
97537f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
97657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 32-bit primitive value.
9775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
978d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32InstanceFromCode
979468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_instance
9801d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9811d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
9821d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet32InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*)
983fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
9845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
985468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_instance
9865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
98857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 64-bit primitive value.
9895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
99037f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet64InstanceFromCode
991468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_instance
9921d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9931d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $t0, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # load referrer's Method*
9941d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw     rSELF, 20($sp)                # pass Thread::Current
9951d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet64InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*)
9961d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw     $t0, 16($sp)                  # pass referrer's Method*
9975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
998468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_instance
9995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
10005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
100157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store an object reference.
10025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1003d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjInstanceFromCode
1004468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_instance
10051d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
10061d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw     $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp)  # pass referrer's Method*
10071d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSetObjInstanceFromCode     # (field_idx, Object*, new_val, referrer, Thread*)
1008fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
10095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
1010468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_instance
10115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
10125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
10135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code to resolve a string, this stub will allocate a String and deliver an
10145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception on error. On success the String is returned. R0 holds the referring method,
10155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * R1 holds the string index. The fast path check for hit in strings cache has already been
10165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * performed.
10175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1018d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artResolveStringFromCode
1019468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolve_string
10201d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
10211d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*)
10225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artResolveStringFromCode
10231d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a2, rSELF                # pass Thread::Current
1024cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
1025468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolve_string
10265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
10273b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi
1028cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier// Macro to facilitate adding new allocation entrypoints.
1029cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro TWO_ARG_DOWNCALL name, entrypoint, return
1030cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    .extern \entrypoint
1031cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name
10321d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
1033cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    jal     \entrypoint
10341d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a2, rSELF                # pass Thread::Current
1035cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    \return
1036cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name
1037cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm
10385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1039cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro THREE_ARG_DOWNCALL name, entrypoint, return
1040cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    .extern \entrypoint
1041cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name
10421d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
1043cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    jal     \entrypoint
10441d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a3, rSELF                # pass Thread::Current
1045cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    \return
1046cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name
1047cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm
10485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
10497410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier// Generate the allocation entrypoints for each allocator.
10507410f29b4dae223befac036ea567d7f33351dad1Mathieu ChartierGENERATE_ALL_ALLOC_ENTRYPOINTS
10513b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi
10525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
105357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code when the value in rSUSPEND has been decremented to 0.
10545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1055d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artTestSuspendFromCode
1056d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_test_suspend
1057474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers    lh     $a0, THREAD_FLAGS_OFFSET(rSELF)
10587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $a0, 1f
10597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addi  rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL   # reset rSUSPEND to SUSPEND_CHECK_INTERVAL
10607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
10615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
10625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
10631d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME          # save callee saves for stack crawl
10641d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artTestSuspendFromCode              # (Thread*)
10657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a0, rSELF
10661d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
1067d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_test_suspend
10685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
10695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
10705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code that is attempting to call a method on a proxy class. On entry
107157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * r0 holds the proxy method; r1, r2 and r3 may contain arguments.
10725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
10735fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    .extern artQuickProxyInvokeHandler
1074d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_proxy_invoke_handler
10751d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME
10767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw      $a0, 0($sp)            # place proxy method at bottom of frame
10777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF             # pass Thread::Current
10785fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    jal     artQuickProxyInvokeHandler  # (Method* proxy method, receiver, Thread*, SP)
1079af6e67a4816d2593586115b89faa659225363246Ian Rogers    move    $a3, $sp               # pass $sp
10807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
10811d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
10827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez    $t0, 1f
1083b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v0, $f0               # place return value to FP return value
10847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1085b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v1, $f1               # place return value to FP return value
10865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
10875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
1088d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_proxy_invoke_handler
10895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
109088474b416eb257078e590bf9bc7957cee604a186Jeff Hao    /*
109188474b416eb257078e590bf9bc7957cee604a186Jeff Hao     * Called to resolve an imt conflict. t0 is a hidden argument that holds the target method's
109288474b416eb257078e590bf9bc7957cee604a186Jeff Hao     * dex method index.
109388474b416eb257078e590bf9bc7957cee604a186Jeff Hao     */
10941d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_imt_conflict_trampoline
109588474b416eb257078e590bf9bc7957cee604a186Jeff Hao    lw      $a0, 0($sp)            # load caller Method*
10961d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw      $a0, MIRROR_ART_METHOD_DEX_CACHE_METHODS_OFFSET($a0)  # load dex_cache_resolved_methods
109788474b416eb257078e590bf9bc7957cee604a186Jeff Hao    sll     $t0, 2                 # convert target method offset to bytes
109888474b416eb257078e590bf9bc7957cee604a186Jeff Hao    add     $a0, $t0               # get address of target method
10991d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw      $a0, MIRROR_OBJECT_ARRAY_DATA_OFFSET($a0)  # load the target method
110088474b416eb257078e590bf9bc7957cee604a186Jeff Hao    la      $t9, art_quick_invoke_interface_trampoline
110188474b416eb257078e590bf9bc7957cee604a186Jeff Hao    jr      $t9
110288474b416eb257078e590bf9bc7957cee604a186Jeff HaoEND art_quick_imt_conflict_trampoline
110388474b416eb257078e590bf9bc7957cee604a186Jeff Hao
1104468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .extern artQuickResolutionTrampoline
1105468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolution_trampoline
11061d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME
1107468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    move    $a2, rSELF             # pass Thread::Current
110865d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers    jal     artQuickResolutionTrampoline  # (Method* called, receiver, Thread*, SP)
1109468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    move    $a3, $sp               # pass $sp
1110468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    beqz    $v0, 1f
1111468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    lw      $a0, 0($sp)            # load resolved method to $a0
11121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
111365d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers    move    $t9, $v0               # code pointer must be in $t9 to generate the global pointer
1114468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    jr      $v0                    # tail call to method
11151984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    nop
1116468532ea115657709bc32ee498e701a4c71762d4Ian Rogers1:
11171d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
1118468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    DELIVER_PENDING_EXCEPTION
1119468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolution_trampoline
1120468532ea115657709bc32ee498e701a4c71762d4Ian Rogers
11212da882315a61072664f7ce3c212307342e907207Andreas GampeUNIMPLEMENTED art_quick_generic_jni_trampoline
11222da882315a61072664f7ce3c212307342e907207Andreas Gampe
1123468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .extern artQuickToInterpreterBridge
1124468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_to_interpreter_bridge
11251d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME
11267db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    move    $a1, rSELF             # pass Thread::Current
1127468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    jal     artQuickToInterpreterBridge    # (Method* method, Thread*, SP)
11287db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    move    $a2, $sp               # pass $sp
11297db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
11301d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
11317db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    bnez    $t0, 1f
1132b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v0, $f0               # place return value to FP return value
11337db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    jr      $ra
1134b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v1, $f1               # place return value to FP return value
11357db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers1:
11367db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    DELIVER_PENDING_EXCEPTION
1137468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_to_interpreter_bridge
11387db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers
11395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1140725a957985171d712d5c048cc3d00ff14968784bjeffhao     * Routine that intercepts method calls and returns.
11415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1142d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodEntryFromCode
1143d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodExitFromCode
1144468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_instrumentation_entry
11451d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME
114612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $sp       # remember bottom of caller's frame
11471d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    addiu    $sp, $sp, -32  # space for saved a0, pad (2 words), arguments (4 words)
114862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset 32
114962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $a0, 28($sp)   # save arg0
11501d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move     $a3, $ra       # pass $ra
11511d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal      artInstrumentationMethodEntryFromCode  # (Method*, Object*, Thread*, LR)
115262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, rSELF     # pass Thread::Current
11538161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move     $t9, $v0       # $t9 holds reference to code
115462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $a0, 28($sp)   # restore arg0
115562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, 32   # remove args
115662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset -32
11571d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
11588161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jalr     $t9            # call method
115962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    nop
1160468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_entry
11615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* intentional fallthrough */
1162468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .global art_quick_instrumentation_exit
1163468532ea115657709bc32ee498e701a4c71762d4Ian Rogersart_quick_instrumentation_exit:
1164d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_startproc
116512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    addiu    $t9, $ra, 4    # put current address into $t9 to rebuild $gp
11661d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    .cpload  $t9
1167c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung    move     $ra, $zero     # link register is to here, so clobber with 0 for later checks
11681d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME
1169c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung    move     $t0, $sp       # remember bottom of caller's frame
117062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, -48  # save return values and set up args
117162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset 48
117262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $v0, 32($sp)
1173c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung    .cfi_rel_offset 2, 32
117462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $v1, 36($sp)
1175c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung    .cfi_rel_offset 3, 36
117662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f0, 40($sp)
117762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f1, 44($sp)
117862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f0, 16($sp)   # pass fpr result
117962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f1, 20($sp)
118062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, $v0       # pass gpr result
118162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a3, $v1
118212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $a1, $t0       # pass $sp
118362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artInstrumentationMethodExitFromCode  # (Thread*, SP, gpr_res, fpr_res)
118412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $a0, rSELF     # pass Thread::Current
118512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $v0       # set aside returned link register
118612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $ra, $v1       # set link register for deoptimization
118762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $v0, 32($sp)   # restore return values
118862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $v1, 36($sp)
118962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    l.s      $f0, 40($sp)
119062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    l.s      $f1, 44($sp)
119112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    jr       $t0            # return
119262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, 112  # 48 bytes of args + 64 bytes of callee save frame
119362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset -112
1194468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_exit
11955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
119612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    /*
119762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization
119862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * will long jump to the upcall with a special exception of -1.
119912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao     */
1200d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artDeoptimize
1201d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deoptimize
120214dd5a82ad85a28612bf86e755ff929d767cea4cJeff Hao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
12031d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal      artDeoptimize  # artDeoptimize(Thread*)
120412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao                            # Returns caller method's frame size.
12051d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move     $a0, rSELF     # pass Thread::current
1206d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deoptimize
120712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao
12085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
12095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
12105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
12115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
12125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
12135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
12147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
12157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
12167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
12175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
12181d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_shl_long
12195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* shl-long vAA, vBB, vCC */
12207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v0, $a0, $a2                    #  rlo<- alo << (shift&31)
12217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $v1, $a2                         #  rhi<- 31-shift  (shift is 5b)
12227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, 1
12237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, $v1                         #  alo<- alo >> (32-(shift&31))
12247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v1, $a1, $a2                    #  rhi<- ahi << (shift&31)
12257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v1, $a0                         #  rhi<- rhi | alo
12267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift< shift & 0x20
12277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $v0, $a2                    #  rhi<- rlo (if shift&0x20)
12287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1229fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    movn    $v0, $zero, $a2                  #  rlo<- 0  (if shift&0x20)
1230d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shl_long
12315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
12325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
12335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
12345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
12355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
12365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
12375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
12387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
12397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
12407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
12415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
12421d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_shr_long
12437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
12447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
12457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $a3, $a1, 31                     #  $a3<- sign(ah)
12467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
12477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
12487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
12497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
12507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
12517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
12527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
12537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $a3, $a2                    #  rhi<- sign(ahi) (if shift&0x20)
1254d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shr_long
12555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
12565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
12575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
12585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
12595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
12605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
12615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
12625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r0: low word
12635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r1: high word
12645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r2: shift count
12655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
12665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* ushr-long vAA, vBB, vCC */
12671d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_ushr_long
1268fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    srl     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
12697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
12707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
12717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
12727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
12737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
12747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
12757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
12767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1277fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    movn    $v1, $zero, $a2                  #  rhi<- 0 (if shift&0x20)
1278d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_ushr_long
12797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao
12801d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersUNIMPLEMENTED art_quick_indexof
12811d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersUNIMPLEMENTED art_quick_string_compareto
1282