quick_entrypoints_mips.S revision c3d131e1ec030b4ff5c44fe2a45d5fb45b3295af
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)
301748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set push
302748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set nomacro
303748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set noat
3047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $at, 4($a0)
305748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set pop
3067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v0, 8($a0)
3077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v1, 12($a0)
3087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a1, 20($a0)
3097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a2, 24($a0)
3107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a3, 28($a0)
3117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, 32($a0)
3127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t1, 36($a0)
3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t2, 40($a0)
3147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t3, 44($a0)
3157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t4, 48($a0)
3167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t5, 52($a0)
3177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t6, 56($a0)
3187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t7, 60($a0)
3197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s0, 64($a0)
3207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s1, 68($a0)
3217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s2, 72($a0)
3227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s3, 76($a0)
3237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s4, 80($a0)
3247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s5, 84($a0)
3257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s6, 88($a0)
3267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s7, 92($a0)
3277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t8, 96($a0)
3287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t9, 100($a0)
3297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $gp, 112($a0)
3307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $sp, 116($a0)
3317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $fp, 120($a0)
3327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $ra, 124($a0)
3337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a0, 16($a0)
3347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v0, $zero          # clear result registers r0 and r1
3357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra                 # do long jump
3367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v1, $zero
337d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_do_long_jump
3385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code, saves most registers (forms basis of long jump context) and passes
3415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at
3425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the thread. On entry r0 holds Throwable*
3435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
344468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_deliver_exception
34512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
34657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3478161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, rSELF                 # pass Thread::Current
3488161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artDeliverExceptionFromCode
3498161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artDeliverExceptionFromCode(Throwable*, Thread*, $sp)
3508161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a2, $sp                   # pass $sp
351468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_deliver_exception
3525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver a NullPointerException
3555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
356d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNullPointerExceptionFromCode
357468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_null_pointer_exception
35812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
35986bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_throw_null_pointer_exception_gp_set:
36057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3618161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a0, rSELF                 # pass Thread::Current
3628161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNullPointerExceptionFromCode
3638161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowNullPointerExceptionFromCode(Thread*, $sp)
3648161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, $sp                   # pass $sp
365468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_null_pointer_exception
3665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArithmeticException
3695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
370d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowDivZeroFromCode
371468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_div_zero
37212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
37357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a0, rSELF                 # pass Thread::Current
3758161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowDivZeroFromCode
3768161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowDivZeroFromCode(Thread*, $sp)
3777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a1, $sp                   # pass $sp
378468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_div_zero
3795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException
3825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
383d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowArrayBoundsFromCode
384468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_array_bounds
38512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
38686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_throw_array_bounds_gp_set:
38757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3888161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a2, rSELF                 # pass Thread::Current
3898161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowArrayBoundsFromCode
3908161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowArrayBoundsFromCode(index, limit, Thread*, $sp)
3918161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a3, $sp                   # pass $sp
392468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_array_bounds
3935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
39457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
39557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a StackOverflowError.
39657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
397d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowStackOverflowFromCode
398468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_stack_overflow
39912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
40057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
4018161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a0, rSELF                 # pass Thread::Current
4028161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowStackOverflowFromCode
4038161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowStackOverflowFromCode(Thread*, $sp)
4048161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, $sp                   # pass $sp
405468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_stack_overflow
4065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
40757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
40857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a NoSuchMethodError.
40957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
410d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNoSuchMethodFromCode
411468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_no_such_method
41212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
41357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
4148161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, rSELF                 # pass Thread::Current
4158161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNoSuchMethodFromCode
4168161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowNoSuchMethodFromCode(method_idx, Thread*, $sp)
4178161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a2, $sp                   # pass $sp
418468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_no_such_method
4195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
4215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * All generated callsites for interface invokes and invocation slow paths will load arguments
4227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain
4235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the method_idx.  This wrapper will save arg1-arg3, load the caller's Method*, align the
4245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * stack and call the appropriate C helper.
4257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1.
4265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
4277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting
4287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * of the target Method* in $v0 and method->code_ in $v1.
4295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
430fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao     * If unsuccessful, the helper will return NULL/NULL. There will be a pending exception in the
4315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * thread and we branch to another stub to deliver it.
4325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
4335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On success this wrapper will restore arguments and *jump* to the target, leaving the lr
4345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * pointing back to the original caller.
4355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
4365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name
4375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern \cxx_name
438d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY \c_name
43912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
4407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME  # save callee saves in case allocation triggers GC
4411f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    lw    $a2, 64($sp)                    # pass caller Method*
442fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move  $t0, $sp                        # save $sp
44358df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, -32                   # make space for extra args
44458df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset 32
4457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move  $a3, rSELF                      # pass Thread::Current
446d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 28, 12
4477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal   \cxx_name                       # (method_idx, this, caller, Thread*, $sp)
448fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw    $t0, 16($sp)                    # pass $sp
44958df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, 32                    # release out args
45058df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset -32
451fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move  $a0, $v0                        # save target Method*
45230a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    move  $t9, $v1                        # save $v0->code_
4535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
454fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    beqz  $v0, 1f
4555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
45630a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    jr    $t9
4575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
4585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
4595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
460d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND \c_name
4615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
4625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4638dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline
4648dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck
4655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4668dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck
4678dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck
4688dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck
4698dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck
4705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
47179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    /*
472ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers     * Invocation stub for quick code.
4735d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     * On entry:
4745d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a0 = method pointer
4755d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a1 = argument array or NULL for no argument methods
4765d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a2 = size of argument array in bytes
4775d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a3 = (managed) thread pointer
4786474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao     *   [sp + 16] = JValue* result
4790177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers     *   [sp + 20] = shorty
4805d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     */
4815d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoENTRY art_quick_invoke_stub
4825d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    GENERATE_GLOBAL_POINTER
4835d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $a0, 0($sp)           # save out a0
4845d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # spill s0, s1, fp, ra
4855d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset 16
4865d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $ra, 12($sp)
4875d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 31, 12
4885d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $fp, 8($sp)
4895d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 30, 8
4905d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s1, 4($sp)
4915d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 17, 4
4925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s0, 0($sp)
4935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 16, 0
4945d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $fp, $sp              # save sp in fp
4955d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_def_cfa_register 30
4965d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $s1, $a3              # move managed thread pointer into s1
4975d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $s0, $zero, SUSPEND_CHECK_INTERVAL  # reset s0 to suspend check interval
4985d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $t0, $a2, 16          # create space for method pointer in frame
499b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    srl   $t0, $t0, 4           # shift the frame size right 4
500b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    sll   $t0, $t0, 4           # shift the frame size left 4 to align to 16 bytes
5015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    subu  $sp, $sp, $t0         # reserve stack space for argument array
5025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $a0, $sp, 4           # pass stack pointer + method ptr as dest for memcpy
5035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jal   memcpy                # (dest, src, bytes)
5045d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # make space for argument slots for memcpy
5055d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16          # restore stack after memcpy
5065d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a0, 16($fp)          # restore method*
5075d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a1, 4($sp)           # copy arg value for a1
5085d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a2, 8($sp)           # copy arg value for a2
5095d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a3, 12($sp)          # copy arg value for a3
510ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers    lw    $t9, METHOD_QUICK_CODE_OFFSET($a0)  # get pointer to the code
5115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jalr  $t9                   # call the method
5125d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $zero, 0($sp)         # store NULL for method* at bottom of frame
5135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $sp, $fp              # restore the stack
5145d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s0, 0($sp)
515bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 16
5165d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s1, 4($sp)
517bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 17
5185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $fp, 8($sp)
519bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
5205d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $ra, 12($sp)
521bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
5225d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16
5235d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset -16
5245d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $t0, 16($sp)          # get result pointer
5250177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers    lw    $t1, 20($sp)          # get shorty
5260177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers    lb    $t1, 0($t1)           # get result type char
5276474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t2, 68               # put char 'D' into t2
5286474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t2, 1f          # branch if result type char == 'D'
5296474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t3, 70               # put char 'F' into t3
5306474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t3, 1f          # branch if result type char == 'F'
5315d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v0, 0($t0)           # store the result
5326474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    jr    $ra
5335d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v1, 4($t0)           # store the other half of the result
5346474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao1:
53519ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao    s.s   $f0, 0($t0)           # store floating point result
5365d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jr    $ra
53719ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao    s.s   $f1, 4($t0)           # store other half of floating point result
5385d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoEND art_quick_invoke_stub
5395d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao
5405d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    /*
5415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on
5425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * failure.
5435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
544d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artHandleFillArrayDataFromCode
545468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_handle_fill_data
54612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
5477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
5487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
5497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artHandleFillArrayDataFromCode     # (Array*, const DexFile::Payload*, Thread*, $sp)
5507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
551fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    RETURN_IF_ZERO
552468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_handle_fill_data
5535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
55557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code that calls artLockObjectFromCode, may block for GC.
5565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
557d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artLockObjectFromCode
558468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_lock_object
55912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
56086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz    $a0, .Lart_quick_throw_null_pointer_exception_gp_set
561a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
5627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME      # save callee saves in case we block
5637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                    # pass Thread::Current
5647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artLockObjectFromCode         # (Object* obj, Thread*, $sp)
5657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, $sp                      # pass $sp
5666bcd163d322b867578fbcfe60e4e3b247c42974bIan Rogers    RETURN_IF_ZERO
567468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_lock_object
5685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure.
5715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
572d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artUnlockObjectFromCode
573468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_unlock_object
57412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
57586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz    $a0, .Lart_quick_throw_null_pointer_exception_gp_set
576a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
5777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
5787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                # pass Thread::Current
5797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artUnlockObjectFromCode   # (Object* obj, Thread*, $sp)
5807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, $sp                  # pass $sp
5815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
582468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_unlock_object
5835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure.
5865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
587a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .extern artThrowClassCastException
588468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_cast
58912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
590a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, -16
591a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset 16
592a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $ra, 12($sp)
593a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_rel_offset 31, 12
594a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $t9, 8($sp)
595a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a1, 4($sp)
596a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a0, 0($sp)
597a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jal    artIsAssignableFromCode
598a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
59986bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz   $v0, .Lthrow_class_cast_exception
600a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $ra, 12($sp)
601a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr     $ra
602a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, 16
603a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -16
60486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lthrow_class_cast_exception:
605a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $t9, 8($sp)
606a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a1, 4($sp)
607a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a0, 0($sp)
608a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, 16
609a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -16
610a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
611a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a2, rSELF                 # pass Thread::Current
612a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    la   $t9, artThrowClassCastException
613a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr   $t9                        # artThrowClassCastException (Class*, Class*, Thread*, SP)
614a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a3, $sp                   # pass $sp
615468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_cast
6165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
618a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * Entry from managed code for array put operations of objects where the value being stored
619a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * needs to be checked for compatibility.
620a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * a0 = array, a1 = index, a2 = value
6215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
622a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_null_and_bound_check
62312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
62486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez    $a0, .Lart_quick_aput_obj_with_bound_check_gp_set
625a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
62686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    b .Lart_quick_throw_null_pointer_exception_gp_set
627a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
628a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_null_and_bound_check
629a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers
630a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_bound_check
631a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    GENERATE_GLOBAL_POINTER
63286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_aput_obj_with_bound_check_gp_set:
633a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw $t0, ARRAY_LENGTH_OFFSET($a0)
634a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sltu $t1, $a1, $t0
63586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez $t1, .Lart_quick_aput_obj_gp_set
636a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
637a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a0, $a1
63886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    b .Lart_quick_throw_array_bounds_gp_set
639a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a1, $t0
640a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_bound_check
641a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers
642a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj
643a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    GENERATE_GLOBAL_POINTER
64486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_aput_obj_gp_set:
64586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz $a2, .Ldo_aput_null
646a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
647a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw $t0, CLASS_OFFSET($a0)
648a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw $t1, CLASS_OFFSET($a2)
649a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw $t0, CLASS_COMPONENT_TYPE_OFFSET($t0)
65086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bne $t1, $t0, .Lcheck_assignability  # value's type == array's component type - trivial assignability
651a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
65286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput:
653a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sll $a1, $a1, 2
654a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t0, $a0, $a1
655a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw  $a2, OBJECT_ARRAY_DATA_OFFSET($t0)
656a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw  $t0, THREAD_CARD_TABLE_OFFSET(rSELF)
657a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    srl $t1, $a0, 7
658a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t1, $t1, $t0
659a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sb  $t0, ($t1)
660a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr  $ra
661a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
66286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput_null:
663a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sll $a1, $a1, 2
664a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t0, $a0, $a1
665a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw  $a2, OBJECT_ARRAY_DATA_OFFSET($t0)
666a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr  $ra
667a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
66886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lcheck_assignability:
669a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, -32
670a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset 32
671a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $ra, 28($sp)
672a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_rel_offset 31, 28
673a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $t9, 12($sp)
674a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a2, 8($sp)
675a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a1, 4($sp)
676a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a0, 0($sp)
677a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move   $a1, $t1
678a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move   $a0, $t0
679a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jal    artIsAssignableFromCode  # (Class*, Class*)
680a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
681a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $ra, 28($sp)
682a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $t9, 12($sp)
683a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a2, 8($sp)
684a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a1, 4($sp)
685a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a0, 0($sp)
686a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add    $sp, 32
687a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -32
68886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez   $v0, .Ldo_aput
689a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
690a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
691a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a1, $a2
692a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a2, rSELF                 # pass Thread::Current
693a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    la   $t9, artThrowArrayStoreException
694a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr   $t9                        # artThrowArrayStoreException(Class*, Class*, Thread*, SP)
695a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a3, $sp                   # pass $sp
696a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj
6975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
6995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when uninitialized static storage, this stub will run the class
7005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * initializer and deliver the exception on error. On success the static storage base is
7015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * returned.
7025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
703d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeStaticStorageFromCode
704468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_static_storage
70512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME            # save callee saves in case of GC
7077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                          # pass Thread::Current
7087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
7095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeStaticStorageFromCode
7107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                            # pass $sp
711cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
712468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_static_storage
7135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
71557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code when dex cache misses for a type_idx.
7165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
717d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeTypeFromCode
718468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type
71912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
7217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
7227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
7235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeFromCode
7247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
725cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
726468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type
7275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
7295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when type_idx needs to be checked for access and dex cache may also
73057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * miss.
7315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
732d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeTypeAndVerifyAccessFromCode
733468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type_and_verify_access
73412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
7367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
7377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
7385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeAndVerifyAccessFromCode
7397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
740cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
741468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type_and_verify_access
7425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
74457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 32-bit primitive value.
7455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
746d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32StaticFromCode
747468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_static
74812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7504eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
7517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
752fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet32StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
7537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
7545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
755468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_static
7565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
75857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 64-bit primitive value.
7595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
760d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64StaticFromCode
761468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_static
76212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7644eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
7657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
766fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet64StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
7677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
7685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
769468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_static
7705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
77257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load an object reference.
7735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
774d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjStaticFromCode
775468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_static
77612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7784eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
7797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
780fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGetObjStaticFromCode       # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
7817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
7825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
783468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_static
7845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
78657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 32-bit primitive value.
7875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
788d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32InstanceFromCode
789468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_instance
79012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7924eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
7937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
794fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet32InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
7954eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
7965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
797468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_instance
7985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
80057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 64-bit primitive value.
8015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
802d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64InstanceFromCode
803468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_instance
80412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8064eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
8077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
808fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet64InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
8094eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
811468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_instance
8125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
81457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load an object reference.
8155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
816d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjInstanceFromCode
817468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_instance
81812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8204eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
8217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
822fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGetObjInstanceFromCode     # (field_idx, Object*, referrer, Thread*, $sp)
8234eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
825468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_instance
8265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
82857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 32-bit primitive value.
8295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
830d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32StaticFromCode
831468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_static
83212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8344eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
8357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
836fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSet32StaticFromCode        # (field_idx, new_val, referrer, Thread*, $sp)
8374eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
839468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_static
8405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
84257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 64-bit primitive value.
8435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
844d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32StaticFromCode
845468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_static
84612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8484eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
849fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
8507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artSet64StaticFromCode        # (field_idx, referrer, new_val, Thread*, $sp)
8514eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
8525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
853468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_static
8545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
85657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store an object reference.
8575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
858d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjStaticFromCode
859468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_static
86012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8624eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
8637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
864fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSetObjStaticFromCode       # (field_idx, new_val, referrer, Thread*, $sp)
8654eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
867468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_static
8685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
87057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 32-bit primitive value.
8715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
872d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32InstanceFromCode
873468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_instance
87412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8764eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a3, 64($sp)                  # pass referrer's Method*
877fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
8787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artSet32InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*, $sp)
8794eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
8805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
881468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_instance
8825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
88457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 64-bit primitive value.
8855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
886d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32InstanceFromCode
887468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_instance
88812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
890fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
891fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSet64InstanceFromCode      # (field_idx, Object*, new_val, Thread*, $sp)
8924eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
8935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
894468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_instance
8955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
89757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store an object reference.
8985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
899d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjInstanceFromCode
900468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_instance
90112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
9027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
9034eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a3, 64($sp)                  # pass referrer's Method*
904fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
905fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSetObjInstanceFromCode     # (field_idx, Object*, new_val, referrer, Thread*, $sp)
9064eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
9075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
908468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_instance
9095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
9115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code to resolve a string, this stub will allocate a String and deliver an
9125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception on error. On success the String is returned. R0 holds the referring method,
9135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * R1 holds the string index. The fast path check for hit in strings cache has already been
9145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * performed.
9155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
916d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artResolveStringFromCode
917468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolve_string
91812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
9197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
9207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
9217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*, $sp)
9225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artResolveStringFromCode
9237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
924cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
925468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolve_string
9265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9273b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi
928cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier// Macro to facilitate adding new allocation entrypoints.
929cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro TWO_ARG_DOWNCALL name, entrypoint, return
930cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    .extern \entrypoint
931cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name
93212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
9337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
9347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
935cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    jal     \entrypoint
9367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
937cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    \return
938cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name
939cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm
9405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
941cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro THREE_ARG_DOWNCALL name, entrypoint, return
942cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    .extern \entrypoint
943cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name
9443b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi    GENERATE_GLOBAL_POINTER
9453b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
9463b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi    move    $a3, rSELF                # pass Thread::Current
947cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    jal     \entrypoint
9483b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi    sw      $sp, 16($sp)              # pass $sp
949cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    \return
950cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name
951cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm
9525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9537410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier// Generate the allocation entrypoints for each allocator.
9547410f29b4dae223befac036ea567d7f33351dad1Mathieu ChartierGENERATE_ALL_ALLOC_ENTRYPOINTS
9553b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi
9565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
95757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code when the value in rSUSPEND has been decremented to 0.
9585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
959d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artTestSuspendFromCode
960d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_test_suspend
96112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
962474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers    lh     $a0, THREAD_FLAGS_OFFSET(rSELF)
9637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $a0, 1f
9647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addi  rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL   # reset rSUSPEND to SUSPEND_CHECK_INTERVAL
9657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
9665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
9675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
9687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a0, rSELF
9697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME          # save callee saves for stack crawl
9707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artTestSuspendFromCode             # (Thread*, $sp)
9717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a1, $sp
9725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
973d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_test_suspend
9745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
9765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code that is attempting to call a method on a proxy class. On entry
97757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * r0 holds the proxy method; r1, r2 and r3 may contain arguments.
9785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
9795fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    .extern artQuickProxyInvokeHandler
980d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_proxy_invoke_handler
98112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
9825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
9837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw      $a0, 0($sp)            # place proxy method at bottom of frame
9847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF             # pass Thread::Current
9855fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    jal     artQuickProxyInvokeHandler  # (Method* proxy method, receiver, Thread*, SP)
986af6e67a4816d2593586115b89faa659225363246Ian Rogers    move    $a3, $sp               # pass $sp
9877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
9881984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
9897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez    $t0, 1f
990b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v0, $f0               # place return value to FP return value
9917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
992b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v1, $f1               # place return value to FP return value
9935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
9945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
995d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_proxy_invoke_handler
9965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
99788474b416eb257078e590bf9bc7957cee604a186Jeff Hao    /*
99888474b416eb257078e590bf9bc7957cee604a186Jeff Hao     * Called to resolve an imt conflict. t0 is a hidden argument that holds the target method's
99988474b416eb257078e590bf9bc7957cee604a186Jeff Hao     * dex method index.
100088474b416eb257078e590bf9bc7957cee604a186Jeff Hao     */
100188474b416eb257078e590bf9bc7957cee604a186Jeff HaoENTRY art_quick_imt_conflict_trampoline
100288474b416eb257078e590bf9bc7957cee604a186Jeff Hao    GENERATE_GLOBAL_POINTER
100388474b416eb257078e590bf9bc7957cee604a186Jeff Hao    lw      $a0, 0($sp)            # load caller Method*
100488474b416eb257078e590bf9bc7957cee604a186Jeff Hao    lw      $a0, METHOD_DEX_CACHE_METHODS_OFFSET($a0)  # load dex_cache_resolved_methods
100588474b416eb257078e590bf9bc7957cee604a186Jeff Hao    sll     $t0, 2                 # convert target method offset to bytes
100688474b416eb257078e590bf9bc7957cee604a186Jeff Hao    add     $a0, $t0               # get address of target method
100788474b416eb257078e590bf9bc7957cee604a186Jeff Hao    lw      $a0, OBJECT_ARRAY_DATA_OFFSET($a0)  # load the target method
100888474b416eb257078e590bf9bc7957cee604a186Jeff Hao    la      $t9, art_quick_invoke_interface_trampoline
100988474b416eb257078e590bf9bc7957cee604a186Jeff Hao    jr      $t9
101088474b416eb257078e590bf9bc7957cee604a186Jeff HaoEND art_quick_imt_conflict_trampoline
101188474b416eb257078e590bf9bc7957cee604a186Jeff Hao
1012468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .extern artQuickResolutionTrampoline
1013468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolution_trampoline
1014468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    GENERATE_GLOBAL_POINTER
1015468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
1016468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    move    $a2, rSELF             # pass Thread::Current
101765d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers    jal     artQuickResolutionTrampoline  # (Method* called, receiver, Thread*, SP)
1018468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    move    $a3, $sp               # pass $sp
1019468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    beqz    $v0, 1f
1020468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    lw      $a0, 0($sp)            # load resolved method to $a0
10211984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
102265d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers    move    $t9, $v0               # code pointer must be in $t9 to generate the global pointer
1023468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    jr      $v0                    # tail call to method
10241984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    nop
1025468532ea115657709bc32ee498e701a4c71762d4Ian Rogers1:
10261984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
1027468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    DELIVER_PENDING_EXCEPTION
1028468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolution_trampoline
1029468532ea115657709bc32ee498e701a4c71762d4Ian Rogers
10302da882315a61072664f7ce3c212307342e907207Andreas GampeUNIMPLEMENTED art_quick_generic_jni_trampoline
10312da882315a61072664f7ce3c212307342e907207Andreas Gampe
1032468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .extern artQuickToInterpreterBridge
1033468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_to_interpreter_bridge
10347db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    GENERATE_GLOBAL_POINTER
10357db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
10367db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    move    $a1, rSELF             # pass Thread::Current
1037468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    jal     artQuickToInterpreterBridge    # (Method* method, Thread*, SP)
10387db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    move    $a2, $sp               # pass $sp
10397db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
10401984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
10417db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    bnez    $t0, 1f
1042b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v0, $f0               # place return value to FP return value
10437db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    jr      $ra
1044b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung    mtc1    $v1, $f1               # place return value to FP return value
10457db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers1:
10467db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    DELIVER_PENDING_EXCEPTION
1047468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_to_interpreter_bridge
10487db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers
10495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1050725a957985171d712d5c048cc3d00ff14968784bjeffhao     * Routine that intercepts method calls and returns.
10515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1052d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodEntryFromCode
1053d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodExitFromCode
1054468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_instrumentation_entry
105512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
105662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
105712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $sp       # remember bottom of caller's frame
105862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, -32  # space for args, pad (3 words), arguments (5 words)
105962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset 32
106062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $a0, 28($sp)   # save arg0
106162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $ra, 16($sp)   # pass $ra
106262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a3, $t0       # pass $sp
106362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artInstrumentationMethodEntryFromCode  # (Method*, Object*, Thread*, SP, LR)
106462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, rSELF     # pass Thread::Current
10658161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move     $t9, $v0       # $t9 holds reference to code
106662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $a0, 28($sp)   # restore arg0
106762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, 32   # remove args
106862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset -32
106962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
10708161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jalr     $t9            # call method
107162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    nop
1072468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_entry
10735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* intentional fallthrough */
1074468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .global art_quick_instrumentation_exit
1075468532ea115657709bc32ee498e701a4c71762d4Ian Rogersart_quick_instrumentation_exit:
1076d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_startproc
107712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    addiu    $t9, $ra, 4    # put current address into $t9 to rebuild $gp
107812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
1079c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung    move     $ra, $zero     # link register is to here, so clobber with 0 for later checks
108062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    SETUP_REF_ONLY_CALLEE_SAVE_FRAME
1081c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung    move     $t0, $sp       # remember bottom of caller's frame
108262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, -48  # save return values and set up args
108362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset 48
108462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $v0, 32($sp)
1085c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung    .cfi_rel_offset 2, 32
108662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $v1, 36($sp)
1087c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung    .cfi_rel_offset 3, 36
108862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f0, 40($sp)
108962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f1, 44($sp)
109062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f0, 16($sp)   # pass fpr result
109162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f1, 20($sp)
109262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, $v0       # pass gpr result
109362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a3, $v1
109412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $a1, $t0       # pass $sp
109562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artInstrumentationMethodExitFromCode  # (Thread*, SP, gpr_res, fpr_res)
109612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $a0, rSELF     # pass Thread::Current
109712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $v0       # set aside returned link register
109812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $ra, $v1       # set link register for deoptimization
109962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $v0, 32($sp)   # restore return values
110062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $v1, 36($sp)
110162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    l.s      $f0, 40($sp)
110262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    l.s      $f1, 44($sp)
110312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    jr       $t0            # return
110462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, 112  # 48 bytes of args + 64 bytes of callee save frame
110562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset -112
1106468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_exit
11075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
110812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    /*
110962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization
111062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * will long jump to the upcall with a special exception of -1.
111112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao     */
1112d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artDeoptimize
1113d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artEnterInterpreterFromDeoptimize
1114d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deoptimize
111512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
111614dd5a82ad85a28612bf86e755ff929d767cea4cJeff Hao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
111762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a0, rSELF     # pass Thread::current
111862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artDeoptimize  # artDeoptimize(Thread*, SP)
111912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao                            # Returns caller method's frame size.
112062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a1, $sp       # pass $sp
1121d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deoptimize
112212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao
11235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
11245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
11255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
11265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
11275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
11285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
11297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
11307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
11317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
11325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1133d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shl_long
11345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* shl-long vAA, vBB, vCC */
11357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v0, $a0, $a2                    #  rlo<- alo << (shift&31)
11367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $v1, $a2                         #  rhi<- 31-shift  (shift is 5b)
11377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, 1
11387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, $v1                         #  alo<- alo >> (32-(shift&31))
11397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v1, $a1, $a2                    #  rhi<- ahi << (shift&31)
11407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v1, $a0                         #  rhi<- rhi | alo
11417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift< shift & 0x20
11427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $v0, $a2                    #  rhi<- rlo (if shift&0x20)
11437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1144fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    movn    $v0, $zero, $a2                  #  rlo<- 0  (if shift&0x20)
1145d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shl_long
11465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
11475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
11485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
11495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
11505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
11515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
11525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
11537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
11547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
11557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
11565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1157d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .global art_quick_shr_long
1158d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shr_long
11597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
11607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
11617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $a3, $a1, 31                     #  $a3<- sign(ah)
11627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
11637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
11647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
11657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
11667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
11677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
11687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
11697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $a3, $a2                    #  rhi<- sign(ahi) (if shift&0x20)
1170d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shr_long
11715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
11725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
11735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
11745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
11755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
11765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
11775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
11785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r0: low word
11795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r1: high word
11805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r2: shift count
11815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
11825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* ushr-long vAA, vBB, vCC */
1183d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .global art_quick_ushr_long
1184d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_ushr_long
1185fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    srl     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
11867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
11877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
11887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
11897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
11907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
11917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
11927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
11937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1194fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    movn    $v1, $zero, $a2                  #  rhi<- 0 (if shift&0x20)
1195d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_ushr_long
11967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao
1197d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_indexof
11987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr $ra
11990703060875166106af3d490c6c264611aea67ec8jeffhao    nop
1200d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_indexof
12017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao
1202d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_string_compareto
12037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr $ra
12040703060875166106af3d490c6c264611aea67ec8jeffhao    nop
1205d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_string_compareto
1206