quick_entrypoints_mips.S revision b264937893fd12bce84681a6d9da6de99ebe6aa4
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)
321f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao     * callee-save: $s0-$s8 + $gp + $ra, 11 total + 1 word padding + 4 open words for args
335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
3457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.macro SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
35fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    addiu  $sp, $sp, -64
36d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset 64
375c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
385c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe     // Ugly compile-time check, but we only have the preprocessor.
395c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_SAVE_ALL_CALLEE_SAVE != 64)
405c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "SAVE_ALL_CALLEE_SAVE_FRAME(MIPS) size not as expected."
415c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif
425c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
43fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $ra, 60($sp)
44d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 31, 60
45fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $s8, 56($sp)
46d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 30, 56
471f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $gp, 52($sp)
481f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 28, 52
491f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s7, 48($sp)
501f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 23, 48
511f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s6, 44($sp)
521f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 22, 44
531f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s5, 40($sp)
541f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 21, 40
551f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s4, 36($sp)
561f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 20, 36
571f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s3, 32($sp)
581f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 19, 32
591f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s2, 28($sp)
601f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 18, 28
611f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s1, 24($sp)
621f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 17, 24
631f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s0, 20($sp)
641f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 16, 20
651f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    # 1 word for alignment, 4 open words for args $a0-$a3, bottom will hold Method*
665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC.
715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Does not include rSUSPEND or rSELF
721f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao     * callee-save: $s2-$s8 + $gp + $ra, 9 total + 3 words padding + 4 open words for args
735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_ONLY_CALLEE_SAVE_FRAME
754eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, -64
76d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset 64
775c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
785c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe    // Ugly compile-time check, but we only have the preprocessor.
795c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_REFS_ONLY_CALLEE_SAVE != 64)
805c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "REFS_ONLY_CALLEE_SAVE_FRAME(MIPS) size not as expected."
815c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif
825c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
834eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $ra, 60($sp)
84d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 31, 60
854eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $s8, 56($sp)
86d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 30, 56
871f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $gp, 52($sp)
881f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 28, 52
891f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s7, 48($sp)
901f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 23, 48
911f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s6, 44($sp)
921f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 22, 44
931f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s5, 40($sp)
941f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 21, 40
951f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s4, 36($sp)
961f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 20, 36
971f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s3, 32($sp)
981f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 19, 32
991f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s2, 28($sp)
1001f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 18, 28
101fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    # 3 words for alignment and extra args, 4 open words for args $a0-$a3, bottom will hold Method*
1025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
1054eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $ra, 60($sp)
106bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
1072a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s8, 56($sp)
108bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
1092a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $gp, 52($sp)
110bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 28
1112a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s7, 48($sp)
112bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 23
1132a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s6, 44($sp)
114bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 22
1152a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s5, 40($sp)
116bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 21
1172a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s4, 36($sp)
118bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 20
1192a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s3, 32($sp)
120bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 19
1212a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s2, 28($sp)
122bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 18
1234eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, 64
124d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -64
1255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
1284eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $ra, 60($sp)
129bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
1302a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s8, 56($sp)
131bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
1322a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $gp, 52($sp)
133bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 28
1342a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s7, 48($sp)
135bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 23
1362a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s6, 44($sp)
137bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 22
1382a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s5, 40($sp)
139bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 21
1402a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s4, 36($sp)
141bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 20
1422a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s3, 32($sp)
143bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 19
1442a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s2, 28($sp)
145bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 18
1467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
1474eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, 64
148d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -64
1495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
1535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC.
1541f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao     * callee-save: $a1-$a3, $s2-$s8 + $gp + $ra, 12 total + 3 words padding + method*
1555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
1571f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    addiu  $sp, $sp, -64
1581f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_adjust_cfa_offset 64
1595c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
1605c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe    // Ugly compile-time check, but we only have the preprocessor.
1615c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE != 64)
1625c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "REFS_AND_ARGS_CALLEE_SAVE_FRAME(MIPS) size not as expected."
1635c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif
1645c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
1651f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $ra, 60($sp)
1661f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 31, 60
1671f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s8, 56($sp)
1681f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 30, 56
1691f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $gp, 52($sp)
1701f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 28, 52
1711f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s7, 48($sp)
1721f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 23, 48
1731f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s6, 44($sp)
1741f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 22, 44
1751f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s5, 40($sp)
1761f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 21, 40
1771f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s4, 36($sp)
1781f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 20, 36
1791f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s3, 32($sp)
1801f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 19, 32
1811f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s2, 28($sp)
1821f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 18, 28
1837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a3, 12($sp)
184d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 7, 12
1857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a2, 8($sp)
186d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 6, 8
1877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a1, 4($sp)
188d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 5, 4
189fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    # bottom will hold Method*
1905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
1932a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $ra, 60($sp)
194bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
1952a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s8, 56($sp)
196bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
1972a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $gp, 52($sp)
198bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 28
1992a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s7, 48($sp)
200bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 23
2012a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s6, 44($sp)
202bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 22
2032a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s5, 40($sp)
204bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 21
2052a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s4, 36($sp)
206bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 20
2072a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s3, 32($sp)
208bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 19
2092a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s2, 28($sp)
210bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 18
2112a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $a3, 12($sp)
212bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 7
2132a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $a2, 8($sp)
214bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 6
2152a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $a1, 4($sp)
216bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 5
217468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    addiu  $sp, $sp, 64           # pop frame
2181f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_adjust_cfa_offset -64
2195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending
2235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception is Thread::Current()->exception_
2245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
2255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro DELIVER_PENDING_EXCEPTION
2268161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME     # save callee saves for throw
2278161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move    $a0, rSELF                   # pass Thread::Current
2288161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la      $t9, artDeliverPendingExceptionFromCode
2298161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr      $t9                          # artDeliverPendingExceptionFromCode(Thread*, $sp)
2308161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move    $a1, $sp                     # pass $sp
2315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NO_EXCEPTION
2347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
2355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
2368161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    bnez   $t0, 1f                       # success if no exception is pending
2375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
2395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
2415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
2425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_ZERO
2455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
2467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $v0, 1f                       # success?
2475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra                           # return on success
2495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
2515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
2525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
254cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro RETURN_IF_RESULT_IS_NON_ZERO
2555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
2567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    beqz   $v0, 1f                       # success?
2575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra                           # return on success
2595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
2615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
2625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * On entry $a0 is uint32_t* gprs_ and $a1 is uint32_t* fprs_
2665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * FIXME: just guessing about the shape of the jmpbuf.  Where will pc be?
2675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
268d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_do_long_jump
2697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f0, 0($a1)
2707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f1, 4($a1)
2717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f2, 8($a1)
2727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f3, 12($a1)
2737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f4, 16($a1)
2747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f5, 20($a1)
2757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f6, 24($a1)
2767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f7, 28($a1)
2777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f8, 32($a1)
2787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f9, 36($a1)
2797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f10, 40($a1)
2807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f11, 44($a1)
2817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f12, 48($a1)
2827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f13, 52($a1)
2837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f14, 56($a1)
2847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f15, 60($a1)
2857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f16, 64($a1)
2867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f17, 68($a1)
2877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f18, 72($a1)
2887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f19, 76($a1)
2897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f20, 80($a1)
2907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f21, 84($a1)
2917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f22, 88($a1)
2927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f23, 92($a1)
2937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f24, 96($a1)
2947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f25, 100($a1)
2957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f26, 104($a1)
2967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f27, 108($a1)
2977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f28, 112($a1)
2987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f29, 116($a1)
2997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f30, 120($a1)
3007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f31, 124($a1)
3017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $at, 4($a0)
3027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v0, 8($a0)
3037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v1, 12($a0)
3047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a1, 20($a0)
3057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a2, 24($a0)
3067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a3, 28($a0)
3077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, 32($a0)
3087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t1, 36($a0)
3097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t2, 40($a0)
3107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t3, 44($a0)
3117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t4, 48($a0)
3127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t5, 52($a0)
3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t6, 56($a0)
3147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t7, 60($a0)
3157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s0, 64($a0)
3167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s1, 68($a0)
3177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s2, 72($a0)
3187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s3, 76($a0)
3197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s4, 80($a0)
3207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s5, 84($a0)
3217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s6, 88($a0)
3227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s7, 92($a0)
3237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t8, 96($a0)
3247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t9, 100($a0)
3257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $k0, 104($a0)
3267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $k1, 108($a0)
3277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $gp, 112($a0)
3287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $sp, 116($a0)
3297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $fp, 120($a0)
3307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $ra, 124($a0)
3317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a0, 16($a0)
3327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v0, $zero          # clear result registers r0 and r1
3337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra                 # do long jump
3347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v1, $zero
335d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_do_long_jump
3365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code, saves most registers (forms basis of long jump context) and passes
3395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at
3405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the thread. On entry r0 holds Throwable*
3415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
342468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_deliver_exception
34312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
34457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3458161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, rSELF                 # pass Thread::Current
3468161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artDeliverExceptionFromCode
3478161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artDeliverExceptionFromCode(Throwable*, Thread*, $sp)
3488161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a2, $sp                   # pass $sp
349468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_deliver_exception
3505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver a NullPointerException
3535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
354d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNullPointerExceptionFromCode
355468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_null_pointer_exception
35612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
35786bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_throw_null_pointer_exception_gp_set:
35857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3598161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a0, rSELF                 # pass Thread::Current
3608161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNullPointerExceptionFromCode
3618161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowNullPointerExceptionFromCode(Thread*, $sp)
3628161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, $sp                   # pass $sp
363468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_null_pointer_exception
3645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArithmeticException
3675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
368d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowDivZeroFromCode
369468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_div_zero
37012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
37157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a0, rSELF                 # pass Thread::Current
3738161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowDivZeroFromCode
3748161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowDivZeroFromCode(Thread*, $sp)
3757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a1, $sp                   # pass $sp
376468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_div_zero
3775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException
3805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
381d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowArrayBoundsFromCode
382468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_array_bounds
38312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
38486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_throw_array_bounds_gp_set:
38557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3868161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a2, rSELF                 # pass Thread::Current
3878161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowArrayBoundsFromCode
3888161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowArrayBoundsFromCode(index, limit, Thread*, $sp)
3898161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a3, $sp                   # pass $sp
390468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_array_bounds
3915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
39257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
39357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a StackOverflowError.
39457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
395d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowStackOverflowFromCode
396468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_stack_overflow
39712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
39857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3998161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a0, rSELF                 # pass Thread::Current
4008161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowStackOverflowFromCode
4018161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowStackOverflowFromCode(Thread*, $sp)
4028161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, $sp                   # pass $sp
403468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_stack_overflow
4045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
40557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
40657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a NoSuchMethodError.
40757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
408d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNoSuchMethodFromCode
409468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_no_such_method
41012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
41157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
4128161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, rSELF                 # pass Thread::Current
4138161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNoSuchMethodFromCode
4148161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowNoSuchMethodFromCode(method_idx, Thread*, $sp)
4158161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a2, $sp                   # pass $sp
416468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_no_such_method
4175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
4195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * All generated callsites for interface invokes and invocation slow paths will load arguments
4207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain
4215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the method_idx.  This wrapper will save arg1-arg3, load the caller's Method*, align the
4225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * stack and call the appropriate C helper.
4237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1.
4245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
4257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting
4267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * of the target Method* in $v0 and method->code_ in $v1.
4275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
428fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao     * If unsuccessful, the helper will return NULL/NULL. There will be a pending exception in the
4295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * thread and we branch to another stub to deliver it.
4305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
4315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On success this wrapper will restore arguments and *jump* to the target, leaving the lr
4325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * pointing back to the original caller.
4335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
4345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name
4355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern \cxx_name
436d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY \c_name
43712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
4387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME  # save callee saves in case allocation triggers GC
4391f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    lw    $a2, 64($sp)                    # pass caller Method*
440fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move  $t0, $sp                        # save $sp
44158df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, -32                   # make space for extra args
44258df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset 32
4437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move  $a3, rSELF                      # pass Thread::Current
444d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 28, 12
4457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal   \cxx_name                       # (method_idx, this, caller, Thread*, $sp)
446fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw    $t0, 16($sp)                    # pass $sp
44758df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, 32                    # release out args
44858df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset -32
449fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move  $a0, $v0                        # save target Method*
45030a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    move  $t9, $v1                        # save $v0->code_
4515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
452fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    beqz  $v0, 1f
4535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
45430a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    jr    $t9
4555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
4565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
4575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
458d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND \c_name
4595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
4605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4618dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline
4628dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck
4635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4648dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck
4658dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck
4668dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck
4678dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck
4685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
46979fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    /*
470ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers     * Invocation stub for quick code.
4715d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     * On entry:
4725d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a0 = method pointer
4735d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a1 = argument array or NULL for no argument methods
4745d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a2 = size of argument array in bytes
4755d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a3 = (managed) thread pointer
4766474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao     *   [sp + 16] = JValue* result
4770177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers     *   [sp + 20] = shorty
4785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     */
4795d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoENTRY art_quick_invoke_stub
4805d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    GENERATE_GLOBAL_POINTER
4815d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $a0, 0($sp)           # save out a0
4825d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # spill s0, s1, fp, ra
4835d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset 16
4845d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $ra, 12($sp)
4855d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 31, 12
4865d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $fp, 8($sp)
4875d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 30, 8
4885d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s1, 4($sp)
4895d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 17, 4
4905d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s0, 0($sp)
4915d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 16, 0
4925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $fp, $sp              # save sp in fp
4935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_def_cfa_register 30
4945d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $s1, $a3              # move managed thread pointer into s1
4955d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $s0, $zero, SUSPEND_CHECK_INTERVAL  # reset s0 to suspend check interval
4965d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $t0, $a2, 16          # create space for method pointer in frame
497b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    srl   $t0, $t0, 4           # shift the frame size right 4
498b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    sll   $t0, $t0, 4           # shift the frame size left 4 to align to 16 bytes
4995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    subu  $sp, $sp, $t0         # reserve stack space for argument array
5005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $a0, $sp, 4           # pass stack pointer + method ptr as dest for memcpy
5015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jal   memcpy                # (dest, src, bytes)
5025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # make space for argument slots for memcpy
5035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16          # restore stack after memcpy
5045d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a0, 16($fp)          # restore method*
5055d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a1, 4($sp)           # copy arg value for a1
5065d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a2, 8($sp)           # copy arg value for a2
5075d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a3, 12($sp)          # copy arg value for a3
508ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers    lw    $t9, METHOD_QUICK_CODE_OFFSET($a0)  # get pointer to the code
5095d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jalr  $t9                   # call the method
5105d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $zero, 0($sp)         # store NULL for method* at bottom of frame
5115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $sp, $fp              # restore the stack
5125d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s0, 0($sp)
513bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 16
5145d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s1, 4($sp)
515bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 17
5165d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $fp, 8($sp)
517bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
5185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $ra, 12($sp)
519bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
5205d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16
5215d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset -16
5225d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $t0, 16($sp)          # get result pointer
5230177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers    lw    $t1, 20($sp)          # get shorty
5240177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers    lb    $t1, 0($t1)           # get result type char
5256474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t2, 68               # put char 'D' into t2
5266474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t2, 1f          # branch if result type char == 'D'
5276474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t3, 70               # put char 'F' into t3
5286474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t3, 1f          # branch if result type char == 'F'
5295d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v0, 0($t0)           # store the result
5306474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    jr    $ra
5315d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v1, 4($t0)           # store the other half of the result
5326474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao1:
53319ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao    s.s   $f0, 0($t0)           # store floating point result
5345d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jr    $ra
53519ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao    s.s   $f1, 4($t0)           # store other half of floating point result
5365d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoEND art_quick_invoke_stub
5375d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao
5385d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    /*
5395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on
5405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * failure.
5415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
542d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artHandleFillArrayDataFromCode
543468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_handle_fill_data
54412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
5457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
5467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
5477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artHandleFillArrayDataFromCode     # (Array*, const DexFile::Payload*, Thread*, $sp)
5487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
549fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    RETURN_IF_ZERO
550468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_handle_fill_data
5515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
55357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code that calls artLockObjectFromCode, may block for GC.
5545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
555d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artLockObjectFromCode
556468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_lock_object
55712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
55886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz    $a0, .Lart_quick_throw_null_pointer_exception_gp_set
559a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
5607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME      # save callee saves in case we block
5617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                    # pass Thread::Current
5627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artLockObjectFromCode         # (Object* obj, Thread*, $sp)
5637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, $sp                      # pass $sp
5646bcd163d322b867578fbcfe60e4e3b247c42974bIan Rogers    RETURN_IF_ZERO
565468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_lock_object
5665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure.
5695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
570d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artUnlockObjectFromCode
571468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_unlock_object
57212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
57386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz    $a0, .Lart_quick_throw_null_pointer_exception_gp_set
574a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
5757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
5767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                # pass Thread::Current
5777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artUnlockObjectFromCode   # (Object* obj, Thread*, $sp)
5787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, $sp                  # pass $sp
5795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
580468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_unlock_object
5815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure.
5845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
585a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .extern artThrowClassCastException
586468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_cast
58712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
588a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, -16
589a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset 16
590a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $ra, 12($sp)
591a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_rel_offset 31, 12
592a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $t9, 8($sp)
593a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a1, 4($sp)
594a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a0, 0($sp)
595a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jal    artIsAssignableFromCode
596a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
59786bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz   $v0, .Lthrow_class_cast_exception
598a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $ra, 12($sp)
599a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr     $ra
600a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, 16
601a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -16
60286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lthrow_class_cast_exception:
603a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $t9, 8($sp)
604a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a1, 4($sp)
605a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a0, 0($sp)
606a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, 16
607a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -16
608a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
609a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a2, rSELF                 # pass Thread::Current
610a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    la   $t9, artThrowClassCastException
611a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr   $t9                        # artThrowClassCastException (Class*, Class*, Thread*, SP)
612a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a3, $sp                   # pass $sp
613468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_cast
6145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
616a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * Entry from managed code for array put operations of objects where the value being stored
617a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * needs to be checked for compatibility.
618a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * a0 = array, a1 = index, a2 = value
6195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
620a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_null_and_bound_check
62112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
62286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez    $a0, .Lart_quick_aput_obj_with_bound_check_gp_set
623a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
62486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    b .Lart_quick_throw_null_pointer_exception_gp_set
625a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
626a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_null_and_bound_check
627a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers
628a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_bound_check
629a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    GENERATE_GLOBAL_POINTER
63086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_aput_obj_with_bound_check_gp_set:
631a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw $t0, ARRAY_LENGTH_OFFSET($a0)
632a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sltu $t1, $a1, $t0
63386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez $t1, .Lart_quick_aput_obj_gp_set
634a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
635a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a0, $a1
63686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    b .Lart_quick_throw_array_bounds_gp_set
637a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a1, $t0
638a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_bound_check
639a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers
640a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj
641a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    GENERATE_GLOBAL_POINTER
64286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_aput_obj_gp_set:
64386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz $a2, .Ldo_aput_null
644a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
645a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw $t0, CLASS_OFFSET($a0)
646a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw $t1, CLASS_OFFSET($a2)
647a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw $t0, CLASS_COMPONENT_TYPE_OFFSET($t0)
64886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bne $t1, $t0, .Lcheck_assignability  # value's type == array's component type - trivial assignability
649a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
65086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput:
651a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sll $a1, $a1, 2
652a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t0, $a0, $a1
653a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw  $a2, OBJECT_ARRAY_DATA_OFFSET($t0)
654a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw  $t0, THREAD_CARD_TABLE_OFFSET(rSELF)
655a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    srl $t1, $a0, 7
656a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t1, $t1, $t0
657a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sb  $t0, ($t1)
658a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr  $ra
659a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
66086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput_null:
661a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sll $a1, $a1, 2
662a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t0, $a0, $a1
663a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw  $a2, OBJECT_ARRAY_DATA_OFFSET($t0)
664a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr  $ra
665a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
66686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lcheck_assignability:
667a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, -32
668a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset 32
669a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $ra, 28($sp)
670a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_rel_offset 31, 28
671a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $t9, 12($sp)
672a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a2, 8($sp)
673a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a1, 4($sp)
674a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a0, 0($sp)
675a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move   $a1, $t1
676a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move   $a0, $t0
677a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jal    artIsAssignableFromCode  # (Class*, Class*)
678a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
679a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $ra, 28($sp)
680a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $t9, 12($sp)
681a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a2, 8($sp)
682a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a1, 4($sp)
683a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a0, 0($sp)
684a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add    $sp, 32
685a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -32
68686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez   $v0, .Ldo_aput
687a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
688a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
689a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a1, $a2
690a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a2, rSELF                 # pass Thread::Current
691a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    la   $t9, artThrowArrayStoreException
692a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr   $t9                        # artThrowArrayStoreException(Class*, Class*, Thread*, SP)
693a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a3, $sp                   # pass $sp
694a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj
6955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
6975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when uninitialized static storage, this stub will run the class
6985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * initializer and deliver the exception on error. On success the static storage base is
6995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * returned.
7005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
701d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeStaticStorageFromCode
702468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_static_storage
70312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME            # save callee saves in case of GC
7057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                          # pass Thread::Current
7067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
7075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeStaticStorageFromCode
7087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                            # pass $sp
709cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
710468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_static_storage
7115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
71357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code when dex cache misses for a type_idx.
7145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
715d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeTypeFromCode
716468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type
71712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
7197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
7207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
7215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeFromCode
7227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
723cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
724468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type
7255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
7275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when type_idx needs to be checked for access and dex cache may also
72857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * miss.
7295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
730d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeTypeAndVerifyAccessFromCode
731468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type_and_verify_access
73212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
7347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
7357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
7365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeAndVerifyAccessFromCode
7377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
738cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
739468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type_and_verify_access
7405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
74257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 32-bit primitive value.
7435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
744d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32StaticFromCode
745468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_static
74612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7484eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
7497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
750fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet32StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
7517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
7525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
753468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_static
7545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
75657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 64-bit primitive value.
7575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
758d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64StaticFromCode
759468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_static
76012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7624eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
7637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
764fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet64StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
7657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
7665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
767468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_static
7685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
77057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load an object reference.
7715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
772d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjStaticFromCode
773468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_static
77412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7764eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
7777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
778fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGetObjStaticFromCode       # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
7797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
7805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
781468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_static
7825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
78457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 32-bit primitive value.
7855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
786d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32InstanceFromCode
787468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_instance
78812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7904eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
7917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
792fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet32InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
7934eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
7945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
795468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_instance
7965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
79857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 64-bit primitive value.
7995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
800d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64InstanceFromCode
801468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_instance
80212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8044eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
8057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
806fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet64InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
8074eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
809468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_instance
8105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
81257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load an object reference.
8135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
814d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjInstanceFromCode
815468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_instance
81612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8184eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
8197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
820fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGetObjInstanceFromCode     # (field_idx, Object*, referrer, Thread*, $sp)
8214eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
823468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_instance
8245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
82657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 32-bit primitive value.
8275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
828d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32StaticFromCode
829468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_static
83012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8324eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
8337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
834fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSet32StaticFromCode        # (field_idx, new_val, referrer, Thread*, $sp)
8354eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
837468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_static
8385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
84057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 64-bit primitive value.
8415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
842d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32StaticFromCode
843468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_static
84412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8464eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
847fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
8487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artSet64StaticFromCode        # (field_idx, referrer, new_val, Thread*, $sp)
8494eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
8505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
851468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_static
8525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
85457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store an object reference.
8555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
856d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjStaticFromCode
857468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_static
85812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8604eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
8617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
862fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSetObjStaticFromCode       # (field_idx, new_val, referrer, Thread*, $sp)
8634eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
865468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_static
8665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
86857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 32-bit primitive value.
8695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
870d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32InstanceFromCode
871468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_instance
87212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8744eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a3, 64($sp)                  # pass referrer's Method*
875fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
8767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artSet32InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*, $sp)
8774eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
8785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
879468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_instance
8805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
88257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 64-bit primitive value.
8835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
884d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32InstanceFromCode
885468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_instance
88612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
888fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
889fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSet64InstanceFromCode      # (field_idx, Object*, new_val, Thread*, $sp)
8904eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
8915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
892468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_instance
8935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
89557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store an object reference.
8965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
897d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjInstanceFromCode
898468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_instance
89912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
9007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9014eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a3, 64($sp)                  # pass referrer's Method*
902fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
903fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSetObjInstanceFromCode     # (field_idx, Object*, new_val, referrer, Thread*, $sp)
9044eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
9055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
906468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_instance
9075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
9095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code to resolve a string, this stub will allocate a String and deliver an
9105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception on error. On success the String is returned. R0 holds the referring method,
9115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * R1 holds the string index. The fast path check for hit in strings cache has already been
9125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * performed.
9135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
914d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artResolveStringFromCode
915468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolve_string
91612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
9177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
9187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
9197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*, $sp)
9205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artResolveStringFromCode
9217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
922cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
923468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolve_string
9245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9253b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi
926cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier// Macro to facilitate adding new allocation entrypoints.
927cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro TWO_ARG_DOWNCALL name, entrypoint, return
928cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    .extern \entrypoint
929cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name
93012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
9317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
9327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
933cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    jal     \entrypoint
9347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
935cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    \return
936cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name
937cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm
9385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
939cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro THREE_ARG_DOWNCALL name, entrypoint, return
940cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    .extern \entrypoint
941cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name
9423b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi    GENERATE_GLOBAL_POINTER
9433b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
9443b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi    move    $a3, rSELF                # pass Thread::Current
945cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    jal     \entrypoint
9463b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi    sw      $sp, 16($sp)              # pass $sp
947cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    \return
948cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name
949cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm
9505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9517410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier// Generate the allocation entrypoints for each allocator.
9527410f29b4dae223befac036ea567d7f33351dad1Mathieu ChartierGENERATE_ALL_ALLOC_ENTRYPOINTS
9533b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi
9545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
95557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code when the value in rSUSPEND has been decremented to 0.
9565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
957d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artTestSuspendFromCode
958d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_test_suspend
95912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
960474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers    lh     $a0, THREAD_FLAGS_OFFSET(rSELF)
9617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $a0, 1f
9627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addi  rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL   # reset rSUSPEND to SUSPEND_CHECK_INTERVAL
9637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
9645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
9655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
9667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a0, rSELF
9677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME          # save callee saves for stack crawl
9687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artTestSuspendFromCode             # (Thread*, $sp)
9697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a1, $sp
9705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
971d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_test_suspend
9725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
9745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code that is attempting to call a method on a proxy class. On entry
97557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * r0 holds the proxy method; r1, r2 and r3 may contain arguments.
9765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
9775fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    .extern artQuickProxyInvokeHandler
978d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_proxy_invoke_handler
97912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
9805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
9817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw      $a0, 0($sp)            # place proxy method at bottom of frame
9827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF             # pass Thread::Current
9835fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    jal     artQuickProxyInvokeHandler  # (Method* proxy method, receiver, Thread*, SP)
984af6e67a4816d2593586115b89faa659225363246Ian Rogers    move    $a3, $sp               # pass $sp
9857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
9861984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
9877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez    $t0, 1f
988b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v0, $f0               # place return value to FP return value
9897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
990b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v1, $f1               # place return value to FP return value
9915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
9925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
993d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_proxy_invoke_handler
9945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
99588474b416eb257078e590bf9bc7957cee604a186Jeff Hao    /*
99688474b416eb257078e590bf9bc7957cee604a186Jeff Hao     * Called to resolve an imt conflict. t0 is a hidden argument that holds the target method's
99788474b416eb257078e590bf9bc7957cee604a186Jeff Hao     * dex method index.
99888474b416eb257078e590bf9bc7957cee604a186Jeff Hao     */
99988474b416eb257078e590bf9bc7957cee604a186Jeff HaoENTRY art_quick_imt_conflict_trampoline
100088474b416eb257078e590bf9bc7957cee604a186Jeff Hao    GENERATE_GLOBAL_POINTER
100188474b416eb257078e590bf9bc7957cee604a186Jeff Hao    lw      $a0, 0($sp)            # load caller Method*
100288474b416eb257078e590bf9bc7957cee604a186Jeff Hao    lw      $a0, METHOD_DEX_CACHE_METHODS_OFFSET($a0)  # load dex_cache_resolved_methods
100388474b416eb257078e590bf9bc7957cee604a186Jeff Hao    sll     $t0, 2                 # convert target method offset to bytes
100488474b416eb257078e590bf9bc7957cee604a186Jeff Hao    add     $a0, $t0               # get address of target method
100588474b416eb257078e590bf9bc7957cee604a186Jeff Hao    lw      $a0, OBJECT_ARRAY_DATA_OFFSET($a0)  # load the target method
100688474b416eb257078e590bf9bc7957cee604a186Jeff Hao    la      $t9, art_quick_invoke_interface_trampoline
100788474b416eb257078e590bf9bc7957cee604a186Jeff Hao    jr      $t9
100888474b416eb257078e590bf9bc7957cee604a186Jeff HaoEND art_quick_imt_conflict_trampoline
100988474b416eb257078e590bf9bc7957cee604a186Jeff Hao
1010468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .extern artQuickResolutionTrampoline
1011468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolution_trampoline
1012468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    GENERATE_GLOBAL_POINTER
1013468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
1014468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    move    $a2, rSELF             # pass Thread::Current
101565d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers    jal     artQuickResolutionTrampoline  # (Method* called, receiver, Thread*, SP)
1016468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    move    $a3, $sp               # pass $sp
1017468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    beqz    $v0, 1f
1018468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    lw      $a0, 0($sp)            # load resolved method to $a0
10191984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
102065d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers    move    $t9, $v0               # code pointer must be in $t9 to generate the global pointer
1021468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    jr      $v0                    # tail call to method
10221984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    nop
1023468532ea115657709bc32ee498e701a4c71762d4Ian Rogers1:
10241984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
1025468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    DELIVER_PENDING_EXCEPTION
1026468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolution_trampoline
1027468532ea115657709bc32ee498e701a4c71762d4Ian Rogers
10282da882315a61072664f7ce3c212307342e907207Andreas GampeUNIMPLEMENTED art_quick_generic_jni_trampoline
10292da882315a61072664f7ce3c212307342e907207Andreas Gampe
1030468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .extern artQuickToInterpreterBridge
1031468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_to_interpreter_bridge
10327db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    GENERATE_GLOBAL_POINTER
10337db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
10347db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    move    $a1, rSELF             # pass Thread::Current
1035468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    jal     artQuickToInterpreterBridge    # (Method* method, Thread*, SP)
10367db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    move    $a2, $sp               # pass $sp
10377db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
10381984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
10397db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    bnez    $t0, 1f
1040b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v0, $f0               # place return value to FP return value
10417db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    jr      $ra
1042b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v1, $f1               # place return value to FP return value
10437db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers1:
10447db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    DELIVER_PENDING_EXCEPTION
1045468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_to_interpreter_bridge
10467db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers
10475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1048725a957985171d712d5c048cc3d00ff14968784bjeffhao     * Routine that intercepts method calls and returns.
10495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1050d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodEntryFromCode
1051d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodExitFromCode
1052468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_instrumentation_entry
105312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
105462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
105512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $sp       # remember bottom of caller's frame
105662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, -32  # space for args, pad (3 words), arguments (5 words)
105762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset 32
105862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $a0, 28($sp)   # save arg0
105962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $ra, 16($sp)   # pass $ra
106062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a3, $t0       # pass $sp
106162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artInstrumentationMethodEntryFromCode  # (Method*, Object*, Thread*, SP, LR)
106262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, rSELF     # pass Thread::Current
10638161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move     $t9, $v0       # $t9 holds reference to code
106462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $a0, 28($sp)   # restore arg0
106562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, 32   # remove args
106662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset -32
106762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
10688161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jalr     $t9            # call method
106962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    nop
1070468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_entry
10715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* intentional fallthrough */
1072468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .global art_quick_instrumentation_exit
1073468532ea115657709bc32ee498e701a4c71762d4Ian Rogersart_quick_instrumentation_exit:
1074d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_startproc
107512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    addiu    $t9, $ra, 4    # put current address into $t9 to rebuild $gp
107612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
107712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $sp       # remember bottom of caller's frame
107862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    SETUP_REF_ONLY_CALLEE_SAVE_FRAME
107962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, -48  # save return values and set up args
108062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset 48
108162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $v0, 32($sp)
1082d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 2, 0
108362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $v1, 36($sp)
1084d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 3, 4
108562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f0, 40($sp)
108662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f1, 44($sp)
108762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f0, 16($sp)   # pass fpr result
108862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f1, 20($sp)
108962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, $v0       # pass gpr result
109062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a3, $v1
109112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $a1, $t0       # pass $sp
109262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artInstrumentationMethodExitFromCode  # (Thread*, SP, gpr_res, fpr_res)
109312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $a0, rSELF     # pass Thread::Current
109412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $v0       # set aside returned link register
109512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $ra, $v1       # set link register for deoptimization
109662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $v0, 32($sp)   # restore return values
109762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $v1, 36($sp)
109862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    l.s      $f0, 40($sp)
109962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    l.s      $f1, 44($sp)
110012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    jr       $t0            # return
110162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, 112  # 48 bytes of args + 64 bytes of callee save frame
110262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset -112
1103468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_exit
11045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
110512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    /*
110662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization
110762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * will long jump to the upcall with a special exception of -1.
110812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao     */
1109d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artDeoptimize
1110d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artEnterInterpreterFromDeoptimize
1111d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deoptimize
111212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
111314dd5a82ad85a28612bf86e755ff929d767cea4cJeff Hao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
111462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a0, rSELF     # pass Thread::current
111562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artDeoptimize  # artDeoptimize(Thread*, SP)
111612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao                            # Returns caller method's frame size.
111762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a1, $sp       # pass $sp
1118d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deoptimize
111912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao
11205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
11215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
11225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
11235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
11245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
11255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
11267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
11277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
11287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
11295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1130d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shl_long
11315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* shl-long vAA, vBB, vCC */
11327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v0, $a0, $a2                    #  rlo<- alo << (shift&31)
11337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $v1, $a2                         #  rhi<- 31-shift  (shift is 5b)
11347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, 1
11357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, $v1                         #  alo<- alo >> (32-(shift&31))
11367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v1, $a1, $a2                    #  rhi<- ahi << (shift&31)
11377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v1, $a0                         #  rhi<- rhi | alo
11387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift< shift & 0x20
11397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $v0, $a2                    #  rhi<- rlo (if shift&0x20)
11407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1141fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    movn    $v0, $zero, $a2                  #  rlo<- 0  (if shift&0x20)
1142d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shl_long
11435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
11445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
11455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
11465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
11475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
11485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
11495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
11507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
11517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
11527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
11535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1154d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .global art_quick_shr_long
1155d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shr_long
11567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
11577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
11587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $a3, $a1, 31                     #  $a3<- sign(ah)
11597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
11607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
11617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
11627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
11637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
11647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
11657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
11667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $a3, $a2                    #  rhi<- sign(ahi) (if shift&0x20)
1167d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shr_long
11685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
11695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
11705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
11715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
11725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
11735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
11745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
11755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r0: low word
11765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r1: high word
11775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r2: shift count
11785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
11795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* ushr-long vAA, vBB, vCC */
1180d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .global art_quick_ushr_long
1181d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_ushr_long
1182fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    srl     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
11837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
11847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
11857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
11867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
11877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
11887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
11897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
11907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1191fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    movn    $v1, $zero, $a2                  #  rhi<- 0 (if shift&0x20)
1192d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_ushr_long
11937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao
1194d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_indexof
11957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr $ra
11960703060875166106af3d490c6c264611aea67ec8jeffhao    nop
1197d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_indexof
11987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao
1199d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_string_compareto
12007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr $ra
12010703060875166106af3d490c6c264611aea67ec8jeffhao    nop
1202d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_string_compareto
1203