quick_entrypoints_mips.S revision 86bcdc251f5ae22fcedd18c096ea538b7dbfa8cb
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
37fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $ra, 60($sp)
38d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 31, 60
39fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     $s8, 56($sp)
40d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 30, 56
411f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $gp, 52($sp)
421f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 28, 52
431f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s7, 48($sp)
441f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 23, 48
451f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s6, 44($sp)
461f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 22, 44
471f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s5, 40($sp)
481f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 21, 40
491f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s4, 36($sp)
501f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 20, 36
511f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s3, 32($sp)
521f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 19, 32
531f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s2, 28($sp)
541f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 18, 28
551f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s1, 24($sp)
561f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 17, 24
571f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s0, 20($sp)
581f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 16, 20
591f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    # 1 word for alignment, 4 open words for args $a0-$a3, bottom will hold Method*
605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC.
655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Does not include rSUSPEND or rSELF
661f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao     * callee-save: $s2-$s8 + $gp + $ra, 9 total + 3 words padding + 4 open words for args
675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_ONLY_CALLEE_SAVE_FRAME
694eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, -64
70d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset 64
714eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $ra, 60($sp)
72d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 31, 60
734eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $s8, 56($sp)
74d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 30, 56
751f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $gp, 52($sp)
761f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 28, 52
771f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s7, 48($sp)
781f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 23, 48
791f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s6, 44($sp)
801f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 22, 44
811f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s5, 40($sp)
821f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 21, 40
831f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s4, 36($sp)
841f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 20, 36
851f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s3, 32($sp)
861f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 19, 32
871f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s2, 28($sp)
881f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 18, 28
89fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    # 3 words for alignment and extra args, 4 open words for args $a0-$a3, bottom will hold Method*
905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
934eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $ra, 60($sp)
94bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
952a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s8, 56($sp)
96bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
972a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $gp, 52($sp)
98bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 28
992a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s7, 48($sp)
100bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 23
1012a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s6, 44($sp)
102bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 22
1032a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s5, 40($sp)
104bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 21
1052a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s4, 36($sp)
106bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 20
1072a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s3, 32($sp)
108bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 19
1092a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s2, 28($sp)
110bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 18
1114eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, 64
112d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -64
1135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
1164eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $ra, 60($sp)
117bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
1182a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s8, 56($sp)
119bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
1202a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $gp, 52($sp)
121bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 28
1222a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s7, 48($sp)
123bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 23
1242a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s6, 44($sp)
125bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 22
1262a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s5, 40($sp)
127bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 21
1282a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s4, 36($sp)
129bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 20
1302a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s3, 32($sp)
131bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 19
1322a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s2, 28($sp)
133bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 18
1347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
1354eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    addiu  $sp, $sp, 64
136d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_adjust_cfa_offset -64
1375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
1415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC.
1421f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao     * callee-save: $a1-$a3, $s2-$s8 + $gp + $ra, 12 total + 3 words padding + method*
1435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
1451f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    addiu  $sp, $sp, -64
1461f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_adjust_cfa_offset 64
1471f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $ra, 60($sp)
1481f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 31, 60
1491f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s8, 56($sp)
1501f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 30, 56
1511f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $gp, 52($sp)
1521f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 28, 52
1531f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s7, 48($sp)
1541f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 23, 48
1551f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s6, 44($sp)
1561f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 22, 44
1571f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s5, 40($sp)
1581f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 21, 40
1591f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s4, 36($sp)
1601f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 20, 36
1611f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s3, 32($sp)
1621f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 19, 32
1631f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s2, 28($sp)
1641f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 18, 28
1657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a3, 12($sp)
166d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 7, 12
1677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a2, 8($sp)
168d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 6, 8
1697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw     $a1, 4($sp)
170d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 5, 4
171fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    # bottom will hold Method*
1725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
1752a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $ra, 60($sp)
176bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
1772a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s8, 56($sp)
178bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
1792a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $gp, 52($sp)
180bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 28
1812a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s7, 48($sp)
182bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 23
1832a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s6, 44($sp)
184bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 22
1852a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s5, 40($sp)
186bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 21
1872a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s4, 36($sp)
188bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 20
1892a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s3, 32($sp)
190bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 19
1912a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s2, 28($sp)
192bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 18
1932a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $a3, 12($sp)
194bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 7
1952a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $a2, 8($sp)
196bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 6
1972a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $a1, 4($sp)
198bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 5
199468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    addiu  $sp, $sp, 64           # pop frame
2001f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_adjust_cfa_offset -64
2015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending
2055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception is Thread::Current()->exception_
2065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
2075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro DELIVER_PENDING_EXCEPTION
2088161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME     # save callee saves for throw
2098161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move    $a0, rSELF                   # pass Thread::Current
2108161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la      $t9, artDeliverPendingExceptionFromCode
2118161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr      $t9                          # artDeliverPendingExceptionFromCode(Thread*, $sp)
2128161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move    $a1, $sp                     # pass $sp
2135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NO_EXCEPTION
2167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
2175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
2188161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    bnez   $t0, 1f                       # success if no exception is pending
2195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
2215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
2235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
2245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_ZERO
2275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
2287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $v0, 1f                       # success?
2295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra                           # return on success
2315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
2335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
2345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
236cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro RETURN_IF_RESULT_IS_NON_ZERO
2375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
2387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    beqz   $v0, 1f                       # success?
2395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra                           # return on success
2415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
2435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
2445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * On entry $a0 is uint32_t* gprs_ and $a1 is uint32_t* fprs_
2485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * FIXME: just guessing about the shape of the jmpbuf.  Where will pc be?
2495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
250d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_do_long_jump
2517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f0, 0($a1)
2527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f1, 4($a1)
2537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f2, 8($a1)
2547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f3, 12($a1)
2557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f4, 16($a1)
2567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f5, 20($a1)
2577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f6, 24($a1)
2587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f7, 28($a1)
2597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f8, 32($a1)
2607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f9, 36($a1)
2617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f10, 40($a1)
2627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f11, 44($a1)
2637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f12, 48($a1)
2647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f13, 52($a1)
2657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f14, 56($a1)
2667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f15, 60($a1)
2677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f16, 64($a1)
2687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f17, 68($a1)
2697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f18, 72($a1)
2707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f19, 76($a1)
2717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f20, 80($a1)
2727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f21, 84($a1)
2737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f22, 88($a1)
2747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f23, 92($a1)
2757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f24, 96($a1)
2767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f25, 100($a1)
2777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f26, 104($a1)
2787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f27, 108($a1)
2797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f28, 112($a1)
2807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f29, 116($a1)
2817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f30, 120($a1)
2827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    l.s     $f31, 124($a1)
2837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $at, 4($a0)
2847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v0, 8($a0)
2857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v1, 12($a0)
2867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a1, 20($a0)
2877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a2, 24($a0)
2887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a3, 28($a0)
2897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, 32($a0)
2907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t1, 36($a0)
2917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t2, 40($a0)
2927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t3, 44($a0)
2937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t4, 48($a0)
2947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t5, 52($a0)
2957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t6, 56($a0)
2967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t7, 60($a0)
2977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s0, 64($a0)
2987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s1, 68($a0)
2997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s2, 72($a0)
3007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s3, 76($a0)
3017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s4, 80($a0)
3027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s5, 84($a0)
3037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s6, 88($a0)
3047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s7, 92($a0)
3057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t8, 96($a0)
3067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t9, 100($a0)
3077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $k0, 104($a0)
3087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $k1, 108($a0)
3097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $gp, 112($a0)
3107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $sp, 116($a0)
3117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $fp, 120($a0)
3127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $ra, 124($a0)
3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a0, 16($a0)
3147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v0, $zero          # clear result registers r0 and r1
3157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra                 # do long jump
3167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v1, $zero
317d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_do_long_jump
3185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code, saves most registers (forms basis of long jump context) and passes
3215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at
3225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the thread. On entry r0 holds Throwable*
3235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
324468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_deliver_exception
32512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
32657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3278161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, rSELF                 # pass Thread::Current
3288161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artDeliverExceptionFromCode
3298161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artDeliverExceptionFromCode(Throwable*, Thread*, $sp)
3308161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a2, $sp                   # pass $sp
331468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_deliver_exception
3325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver a NullPointerException
3355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
336d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNullPointerExceptionFromCode
337468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_null_pointer_exception
33812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
33986bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_throw_null_pointer_exception_gp_set:
34057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3418161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a0, rSELF                 # pass Thread::Current
3428161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNullPointerExceptionFromCode
3438161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowNullPointerExceptionFromCode(Thread*, $sp)
3448161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, $sp                   # pass $sp
345468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_null_pointer_exception
3465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArithmeticException
3495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
350d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowDivZeroFromCode
351468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_div_zero
35212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
35357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a0, rSELF                 # pass Thread::Current
3558161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowDivZeroFromCode
3568161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowDivZeroFromCode(Thread*, $sp)
3577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move $a1, $sp                   # pass $sp
358468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_div_zero
3595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException
3625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
363d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowArrayBoundsFromCode
364468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_array_bounds
36512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
36686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_throw_array_bounds_gp_set:
36757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3688161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a2, rSELF                 # pass Thread::Current
3698161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowArrayBoundsFromCode
3708161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowArrayBoundsFromCode(index, limit, Thread*, $sp)
3718161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a3, $sp                   # pass $sp
372468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_array_bounds
3735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
37457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
37557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a StackOverflowError.
37657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
377d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowStackOverflowFromCode
378468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_stack_overflow
37912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
38057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3818161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a0, rSELF                 # pass Thread::Current
3828161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowStackOverflowFromCode
3838161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowStackOverflowFromCode(Thread*, $sp)
3848161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, $sp                   # pass $sp
385468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_stack_overflow
3865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
38757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
38857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a NoSuchMethodError.
38957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
390d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNoSuchMethodFromCode
391468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_no_such_method
39212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
39357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3948161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a1, rSELF                 # pass Thread::Current
3958161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNoSuchMethodFromCode
3968161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jr   $t9                        # artThrowNoSuchMethodFromCode(method_idx, Thread*, $sp)
3978161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move $a2, $sp                   # pass $sp
398468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_no_such_method
3995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
4015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * All generated callsites for interface invokes and invocation slow paths will load arguments
4027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain
4035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the method_idx.  This wrapper will save arg1-arg3, load the caller's Method*, align the
4045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * stack and call the appropriate C helper.
4057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1.
4065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
4077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting
4087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * of the target Method* in $v0 and method->code_ in $v1.
4095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
410fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao     * If unsuccessful, the helper will return NULL/NULL. There will be a pending exception in the
4115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * thread and we branch to another stub to deliver it.
4125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
4135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On success this wrapper will restore arguments and *jump* to the target, leaving the lr
4145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * pointing back to the original caller.
4155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
4165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name
4175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern \cxx_name
418d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY \c_name
41912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
4207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME  # save callee saves in case allocation triggers GC
4211f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    lw    $a2, 64($sp)                    # pass caller Method*
422fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move  $t0, $sp                        # save $sp
42358df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, -32                   # make space for extra args
42458df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset 32
4257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move  $a3, rSELF                      # pass Thread::Current
426d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 28, 12
4277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal   \cxx_name                       # (method_idx, this, caller, Thread*, $sp)
428fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw    $t0, 16($sp)                    # pass $sp
42958df32711162823647356afe25ae2cde04133563Jeff Hao    addiu $sp, $sp, 32                    # release out args
43058df32711162823647356afe25ae2cde04133563Jeff Hao    .cfi_adjust_cfa_offset -32
431fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move  $a0, $v0                        # save target Method*
43230a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    move  $t9, $v1                        # save $v0->code_
4335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
434fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    beqz  $v0, 1f
4355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
43630a3317577d84feafa859b3e39d1545a995f0b7cjeffhao    jr    $t9
4375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
4385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
4395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
440d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND \c_name
4415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
4425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4438dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline
4448dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck
4455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4468dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck
4478dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck
4488dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck
4498dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck
4505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
45179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    /*
452ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers     * Invocation stub for quick code.
4535d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     * On entry:
4545d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a0 = method pointer
4555d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a1 = argument array or NULL for no argument methods
4565d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a2 = size of argument array in bytes
4575d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a3 = (managed) thread pointer
4586474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao     *   [sp + 16] = JValue* result
4590177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers     *   [sp + 20] = shorty
4605d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     */
4615d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoENTRY art_quick_invoke_stub
4625d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    GENERATE_GLOBAL_POINTER
4635d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $a0, 0($sp)           # save out a0
4645d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # spill s0, s1, fp, ra
4655d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset 16
4665d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $ra, 12($sp)
4675d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 31, 12
4685d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $fp, 8($sp)
4695d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 30, 8
4705d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s1, 4($sp)
4715d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 17, 4
4725d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s0, 0($sp)
4735d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 16, 0
4745d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $fp, $sp              # save sp in fp
4755d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_def_cfa_register 30
4765d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $s1, $a3              # move managed thread pointer into s1
4775d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $s0, $zero, SUSPEND_CHECK_INTERVAL  # reset s0 to suspend check interval
4785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $t0, $a2, 16          # create space for method pointer in frame
4795d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    srl   $t0, $t0, 3           # shift the frame size right 3
4805d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sll   $t0, $t0, 3           # shift the frame size left 3 to align to 16 bytes
4815d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    subu  $sp, $sp, $t0         # reserve stack space for argument array
4825d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $a0, $sp, 4           # pass stack pointer + method ptr as dest for memcpy
4835d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jal   memcpy                # (dest, src, bytes)
4845d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # make space for argument slots for memcpy
4855d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16          # restore stack after memcpy
4865d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a0, 16($fp)          # restore method*
4875d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a1, 4($sp)           # copy arg value for a1
4885d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a2, 8($sp)           # copy arg value for a2
4895d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a3, 12($sp)          # copy arg value for a3
490ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers    lw    $t9, METHOD_QUICK_CODE_OFFSET($a0)  # get pointer to the code
4915d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jalr  $t9                   # call the method
4925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $zero, 0($sp)         # store NULL for method* at bottom of frame
4935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $sp, $fp              # restore the stack
4945d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s0, 0($sp)
495bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 16
4965d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s1, 4($sp)
497bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 17
4985d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $fp, 8($sp)
499bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
5005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $ra, 12($sp)
501bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
5025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16
5035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset -16
5045d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $t0, 16($sp)          # get result pointer
5050177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers    lw    $t1, 20($sp)          # get shorty
5060177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers    lb    $t1, 0($t1)           # get result type char
5076474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t2, 68               # put char 'D' into t2
5086474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t2, 1f          # branch if result type char == 'D'
5096474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t3, 70               # put char 'F' into t3
5106474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t3, 1f          # branch if result type char == 'F'
5115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v0, 0($t0)           # store the result
5126474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    jr    $ra
5135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v1, 4($t0)           # store the other half of the result
5146474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao1:
51519ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao    s.s   $f0, 0($t0)           # store floating point result
5165d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jr    $ra
51719ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao    s.s   $f1, 4($t0)           # store other half of floating point result
5185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoEND art_quick_invoke_stub
5195d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao
5205d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    /*
5215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on
5225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * failure.
5235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
524d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artHandleFillArrayDataFromCode
525468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_handle_fill_data
52612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
5277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
5287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
5297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artHandleFillArrayDataFromCode     # (Array*, const DexFile::Payload*, Thread*, $sp)
5307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
531fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    RETURN_IF_ZERO
532468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_handle_fill_data
5335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
53557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code that calls artLockObjectFromCode, may block for GC.
5365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
537d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artLockObjectFromCode
538468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_lock_object
53912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
54086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz    $a0, .Lart_quick_throw_null_pointer_exception_gp_set
541a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
5427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME      # save callee saves in case we block
5437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                    # pass Thread::Current
5447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artLockObjectFromCode         # (Object* obj, Thread*, $sp)
5457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, $sp                      # pass $sp
5466bcd163d322b867578fbcfe60e4e3b247c42974bIan Rogers    RETURN_IF_ZERO
547468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_lock_object
5485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure.
5515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
552d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artUnlockObjectFromCode
553468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_unlock_object
55412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
55586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz    $a0, .Lart_quick_throw_null_pointer_exception_gp_set
556a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
5577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case exception allocation triggers GC
5587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                # pass Thread::Current
5597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal     artUnlockObjectFromCode   # (Object* obj, Thread*, $sp)
5607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, $sp                  # pass $sp
5615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
562468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_unlock_object
5635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure.
5665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
567a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .extern artThrowClassCastException
568468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_cast
56912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
570a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, -16
571a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset 16
572a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $ra, 12($sp)
573a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_rel_offset 31, 12
574a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $t9, 8($sp)
575a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a1, 4($sp)
576a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a0, 0($sp)
577a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jal    artIsAssignableFromCode
578a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
57986bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz   $v0, .Lthrow_class_cast_exception
580a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $ra, 12($sp)
581a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr     $ra
582a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, 16
583a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -16
58486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lthrow_class_cast_exception:
585a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $t9, 8($sp)
586a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a1, 4($sp)
587a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a0, 0($sp)
588a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, 16
589a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -16
590a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
591a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a2, rSELF                 # pass Thread::Current
592a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    la   $t9, artThrowClassCastException
593a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr   $t9                        # artThrowClassCastException (Class*, Class*, Thread*, SP)
594a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a3, $sp                   # pass $sp
595468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_cast
5965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
598a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * Entry from managed code for array put operations of objects where the value being stored
599a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * needs to be checked for compatibility.
600a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * a0 = array, a1 = index, a2 = value
6015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
602a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_null_and_bound_check
60312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
60486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez    $a0, .Lart_quick_aput_obj_with_bound_check_gp_set
605a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
60686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    b .Lart_quick_throw_null_pointer_exception_gp_set
607a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
608a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_null_and_bound_check
609a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers
610a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_bound_check
611a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    GENERATE_GLOBAL_POINTER
61286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_aput_obj_with_bound_check_gp_set:
613a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw $t0, ARRAY_LENGTH_OFFSET($a0)
614a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sltu $t1, $a1, $t0
61586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez $t1, .Lart_quick_aput_obj_gp_set
616a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
617a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a0, $a1
61886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    b .Lart_quick_throw_array_bounds_gp_set
619a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a1, $t0
620a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_bound_check
621a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers
622a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj
623a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    GENERATE_GLOBAL_POINTER
62486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_aput_obj_gp_set:
62586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz $a2, .Ldo_aput_null
626a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
627a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw $t0, CLASS_OFFSET($a0)
628a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw $t1, CLASS_OFFSET($a2)
629a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw $t0, CLASS_COMPONENT_TYPE_OFFSET($t0)
63086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bne $t1, $t0, .Lcheck_assignability  # value's type == array's component type - trivial assignability
631a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
63286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput:
633a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sll $a1, $a1, 2
634a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t0, $a0, $a1
635a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw  $a2, OBJECT_ARRAY_DATA_OFFSET($t0)
636a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw  $t0, THREAD_CARD_TABLE_OFFSET(rSELF)
637a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    srl $t1, $a0, 7
638a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t1, $t1, $t0
639a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sb  $t0, ($t1)
640a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr  $ra
641a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
64286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput_null:
643a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sll $a1, $a1, 2
644a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t0, $a0, $a1
645a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw  $a2, OBJECT_ARRAY_DATA_OFFSET($t0)
646a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr  $ra
647a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
64886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lcheck_assignability:
649a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, -32
650a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset 32
651a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $ra, 28($sp)
652a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_rel_offset 31, 28
653a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $t9, 12($sp)
654a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a2, 8($sp)
655a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a1, 4($sp)
656a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a0, 0($sp)
657a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move   $a1, $t1
658a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move   $a0, $t0
659a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jal    artIsAssignableFromCode  # (Class*, Class*)
660a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
661a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $ra, 28($sp)
662a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $t9, 12($sp)
663a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a2, 8($sp)
664a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a1, 4($sp)
665a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a0, 0($sp)
666a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add    $sp, 32
667a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -32
66886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez   $v0, .Ldo_aput
669a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
670a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
671a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a1, $a2
672a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a2, rSELF                 # pass Thread::Current
673a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    la   $t9, artThrowArrayStoreException
674a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jr   $t9                        # artThrowArrayStoreException(Class*, Class*, Thread*, SP)
675a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a3, $sp                   # pass $sp
676a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj
6775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
6795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when uninitialized static storage, this stub will run the class
6805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * initializer and deliver the exception on error. On success the static storage base is
6815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * returned.
6825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
683d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeStaticStorageFromCode
684468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_static_storage
68512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
6867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME            # save callee saves in case of GC
6877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                          # pass Thread::Current
6887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
6895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeStaticStorageFromCode
6907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                            # pass $sp
691cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
692468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_static_storage
6935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
69557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code when dex cache misses for a type_idx.
6965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
697d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeTypeFromCode
698468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type
69912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
7017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
7027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
7035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeFromCode
7047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
705cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
706468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type
7075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
7095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code when type_idx needs to be checked for access and dex cache may also
71057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * miss.
7115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
712d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInitializeTypeAndVerifyAccessFromCode
713468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type_and_verify_access
71412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME           # save callee saves in case of GC
7167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                         # pass Thread::Current
7177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp)
7185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artInitializeTypeAndVerifyAccessFromCode
7197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                           # pass $sp
720cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
721468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type_and_verify_access
7225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
72457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 32-bit primitive value.
7255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
726d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32StaticFromCode
727468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_static
72812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7304eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
7317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
732fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet32StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
7337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
7345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
735468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_static
7365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
73857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 64-bit primitive value.
7395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
740d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64StaticFromCode
741468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_static
74212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7444eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
7457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
746fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet64StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
7477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
7485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
749468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_static
7505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
75257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load an object reference.
7535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
754d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjStaticFromCode
755468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_static
75612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7584eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
7597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
760fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGetObjStaticFromCode       # (uint32_t field_idx, const Method* referrer, Thread*, $sp)
7617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, $sp                      # pass $sp
7625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
763468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_static
7645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
76657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 32-bit primitive value.
7675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
768d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32InstanceFromCode
769468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_instance
77012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7724eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
7737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
774fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet32InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
7754eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
7765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
777468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_instance
7785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
78057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 64-bit primitive value.
7815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
782d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64InstanceFromCode
783468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_instance
78412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
7864eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
7877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
788fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGet64InstanceFromCode      # (field_idx, Object*, referrer, Thread*, $sp)
7894eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
7905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
791468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_instance
7925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
79457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load an object reference.
7955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
796d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjInstanceFromCode
797468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_instance
79812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
7997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8004eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
8017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
802fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artGetObjInstanceFromCode     # (field_idx, Object*, referrer, Thread*, $sp)
8034eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
805468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_instance
8065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
80857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 32-bit primitive value.
8095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
810d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32StaticFromCode
811468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_static
81212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8144eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
8157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
816fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSet32StaticFromCode        # (field_idx, new_val, referrer, Thread*, $sp)
8174eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
819468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_static
8205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
82257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 64-bit primitive value.
8235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
824d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32StaticFromCode
825468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_static
82612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8284eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a1, 64($sp)                  # pass referrer's Method*
829fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
8307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artSet64StaticFromCode        # (field_idx, referrer, new_val, Thread*, $sp)
8314eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
8325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
833468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_static
8345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
83657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store an object reference.
8375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
838d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjStaticFromCode
839468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_static
84012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8424eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a2, 64($sp)                  # pass referrer's Method*
8437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
844fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSetObjStaticFromCode       # (field_idx, new_val, referrer, Thread*, $sp)
8454eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 16($sp)                  # pass $sp
8465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
847468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_static
8485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
85057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 32-bit primitive value.
8515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
852d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32InstanceFromCode
853468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_instance
85412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8564eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a3, 64($sp)                  # pass referrer's Method*
857fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
8587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artSet32InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*, $sp)
8594eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
8605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
861468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_instance
8625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
86457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 64-bit primitive value.
8655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
866d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32InstanceFromCode
867468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_instance
86812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
870fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
871fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSet64InstanceFromCode      # (field_idx, Object*, new_val, Thread*, $sp)
8724eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
8735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
874468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_instance
8755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
87757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store an object reference.
8785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
879d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjInstanceFromCode
880468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_instance
88112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case of GC
8834eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    lw     $a3, 64($sp)                  # pass referrer's Method*
884fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
885fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    jal    artSetObjInstanceFromCode     # (field_idx, Object*, new_val, referrer, Thread*, $sp)
8864eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao    sw     $sp, 20($sp)                  # pass $sp
8875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
888468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_instance
8895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
8915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code to resolve a string, this stub will allocate a String and deliver an
8925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception on error. On success the String is returned. R0 holds the referring method,
8935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * R1 holds the string index. The fast path check for hit in strings cache has already been
8945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * performed.
8955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
896d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artResolveStringFromCode
897468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolve_string
89812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
8997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
9007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
9017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*, $sp)
9025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    jal     artResolveStringFromCode
9037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
904cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    RETURN_IF_RESULT_IS_NON_ZERO
905468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolve_string
9065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9073b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi
908cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier// Macro to facilitate adding new allocation entrypoints.
909cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro TWO_ARG_DOWNCALL name, entrypoint, return
910cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    .extern \entrypoint
911cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name
91212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
9137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
9147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF                # pass Thread::Current
915cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    jal     \entrypoint
9167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a3, $sp                  # pass $sp
917cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    \return
918cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name
919cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm
9205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
921cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro THREE_ARG_DOWNCALL name, entrypoint, return
922cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    .extern \entrypoint
923cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name
9243b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi    GENERATE_GLOBAL_POINTER
9253b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
9263b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi    move    $a3, rSELF                # pass Thread::Current
927cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    jal     \entrypoint
9283b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi    sw      $sp, 16($sp)              # pass $sp
929cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    \return
930cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name
931cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm
9325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9337410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier// Generate the allocation entrypoints for each allocator.
9347410f29b4dae223befac036ea567d7f33351dad1Mathieu ChartierGENERATE_ALL_ALLOC_ENTRYPOINTS
9353b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi
9365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
93757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code when the value in rSUSPEND has been decremented to 0.
9385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
939d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artTestSuspendFromCode
940d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_test_suspend
94112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
942474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers    lh     $a0, THREAD_FLAGS_OFFSET(rSELF)
9437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $a0, 1f
9447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    addi  rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL   # reset rSUSPEND to SUSPEND_CHECK_INTERVAL
9457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr     $ra
9465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
9475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
9487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a0, rSELF
9497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME          # save callee saves for stack crawl
9507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal    artTestSuspendFromCode             # (Thread*, $sp)
9517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a1, $sp
9525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
953d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_test_suspend
9545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
9565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code that is attempting to call a method on a proxy class. On entry
95757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * r0 holds the proxy method; r1, r2 and r3 may contain arguments.
9585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
9595fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    .extern artQuickProxyInvokeHandler
960d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_proxy_invoke_handler
96112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
9625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
9637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sw      $a0, 0($sp)            # place proxy method at bottom of frame
9647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a2, rSELF             # pass Thread::Current
9655fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    jal     artQuickProxyInvokeHandler  # (Method* proxy method, receiver, Thread*, SP)
966af6e67a4816d2593586115b89faa659225363246Ian Rogers    move    $a3, $sp               # pass $sp
9677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
9681984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
9697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez    $t0, 1f
9701984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    nop
9717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
9725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
9735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
9745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
975d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_proxy_invoke_handler
9765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
97788474b416eb257078e590bf9bc7957cee604a186Jeff Hao    /*
97888474b416eb257078e590bf9bc7957cee604a186Jeff Hao     * Called to resolve an imt conflict. t0 is a hidden argument that holds the target method's
97988474b416eb257078e590bf9bc7957cee604a186Jeff Hao     * dex method index.
98088474b416eb257078e590bf9bc7957cee604a186Jeff Hao     */
98188474b416eb257078e590bf9bc7957cee604a186Jeff HaoENTRY art_quick_imt_conflict_trampoline
98288474b416eb257078e590bf9bc7957cee604a186Jeff Hao    GENERATE_GLOBAL_POINTER
98388474b416eb257078e590bf9bc7957cee604a186Jeff Hao    lw      $a0, 0($sp)            # load caller Method*
98488474b416eb257078e590bf9bc7957cee604a186Jeff Hao    lw      $a0, METHOD_DEX_CACHE_METHODS_OFFSET($a0)  # load dex_cache_resolved_methods
98588474b416eb257078e590bf9bc7957cee604a186Jeff Hao    sll     $t0, 2                 # convert target method offset to bytes
98688474b416eb257078e590bf9bc7957cee604a186Jeff Hao    add     $a0, $t0               # get address of target method
98788474b416eb257078e590bf9bc7957cee604a186Jeff Hao    lw      $a0, OBJECT_ARRAY_DATA_OFFSET($a0)  # load the target method
98888474b416eb257078e590bf9bc7957cee604a186Jeff Hao    la      $t9, art_quick_invoke_interface_trampoline
98988474b416eb257078e590bf9bc7957cee604a186Jeff Hao    jr      $t9
99088474b416eb257078e590bf9bc7957cee604a186Jeff HaoEND art_quick_imt_conflict_trampoline
99188474b416eb257078e590bf9bc7957cee604a186Jeff Hao
992468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .extern artQuickResolutionTrampoline
993468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolution_trampoline
994468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    GENERATE_GLOBAL_POINTER
995468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
996468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    move    $a2, rSELF             # pass Thread::Current
99765d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers    jal     artQuickResolutionTrampoline  # (Method* called, receiver, Thread*, SP)
998468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    move    $a3, $sp               # pass $sp
999468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    beqz    $v0, 1f
1000468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    lw      $a0, 0($sp)            # load resolved method to $a0
10011984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
100265d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers    move    $t9, $v0               # code pointer must be in $t9 to generate the global pointer
1003468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    jr      $v0                    # tail call to method
10041984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    nop
1005468532ea115657709bc32ee498e701a4c71762d4Ian Rogers1:
10061984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
1007468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    DELIVER_PENDING_EXCEPTION
1008468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolution_trampoline
1009468532ea115657709bc32ee498e701a4c71762d4Ian Rogers
1010468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .extern artQuickToInterpreterBridge
1011468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_to_interpreter_bridge
10127db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    GENERATE_GLOBAL_POINTER
10137db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
10147db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    move    $a1, rSELF             # pass Thread::Current
1015468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    jal     artQuickToInterpreterBridge    # (Method* method, Thread*, SP)
10167db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    move    $a2, $sp               # pass $sp
10177db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
10181984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
10197db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    bnez    $t0, 1f
10201984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    nop
10217db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    jr      $ra
10227db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    nop
10237db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers1:
10247db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    DELIVER_PENDING_EXCEPTION
1025468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_to_interpreter_bridge
10267db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers
10275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1028725a957985171d712d5c048cc3d00ff14968784bjeffhao     * Routine that intercepts method calls and returns.
10295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1030d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodEntryFromCode
1031d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodExitFromCode
1032468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_instrumentation_entry
103312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
103462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
103512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $sp       # remember bottom of caller's frame
103662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, -32  # space for args, pad (3 words), arguments (5 words)
103762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset 32
103862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $a0, 28($sp)   # save arg0
103962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $ra, 16($sp)   # pass $ra
104062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a3, $t0       # pass $sp
104162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artInstrumentationMethodEntryFromCode  # (Method*, Object*, Thread*, SP, LR)
104262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, rSELF     # pass Thread::Current
10438161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move     $t9, $v0       # $t9 holds reference to code
104462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $a0, 28($sp)   # restore arg0
104562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, 32   # remove args
104662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset -32
104762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
10488161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jalr     $t9            # call method
104962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    nop
1050468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_entry
10515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* intentional fallthrough */
1052468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .global art_quick_instrumentation_exit
1053468532ea115657709bc32ee498e701a4c71762d4Ian Rogersart_quick_instrumentation_exit:
1054d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_startproc
105512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    addiu    $t9, $ra, 4    # put current address into $t9 to rebuild $gp
105612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
105712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $sp       # remember bottom of caller's frame
105862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    SETUP_REF_ONLY_CALLEE_SAVE_FRAME
105962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, -48  # save return values and set up args
106062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset 48
106162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $v0, 32($sp)
1062d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 2, 0
106362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    sw       $v1, 36($sp)
1064d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_rel_offset 3, 4
106562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f0, 40($sp)
106662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f1, 44($sp)
106762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f0, 16($sp)   # pass fpr result
106862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    s.s      $f1, 20($sp)
106962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, $v0       # pass gpr result
107062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a3, $v1
107112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $a1, $t0       # pass $sp
107262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artInstrumentationMethodExitFromCode  # (Thread*, SP, gpr_res, fpr_res)
107312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $a0, rSELF     # pass Thread::Current
107412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $t0, $v0       # set aside returned link register
107512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $ra, $v1       # set link register for deoptimization
107662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $v0, 32($sp)   # restore return values
107762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    lw       $v1, 36($sp)
107862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    l.s      $f0, 40($sp)
107962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    l.s      $f1, 44($sp)
108012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    jr       $t0            # return
108162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    addiu    $sp, $sp, 112  # 48 bytes of args + 64 bytes of callee save frame
108262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    .cfi_adjust_cfa_offset -112
1083468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_exit
10845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
108512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    /*
108662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization
108762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * will long jump to the upcall with a special exception of -1.
108812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao     */
1089d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artDeoptimize
1090d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artEnterInterpreterFromDeoptimize
1091d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deoptimize
109212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    GENERATE_GLOBAL_POINTER
109314dd5a82ad85a28612bf86e755ff929d767cea4cJeff Hao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
109462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a0, rSELF     # pass Thread::current
109562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artDeoptimize  # artDeoptimize(Thread*, SP)
109612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao                            # Returns caller method's frame size.
109762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a1, $sp       # pass $sp
1098d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deoptimize
109912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao
11005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
11015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
11025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
11035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
11045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
11055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
11067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
11077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
11087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
11095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1110d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shl_long
11115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* shl-long vAA, vBB, vCC */
11127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v0, $a0, $a2                    #  rlo<- alo << (shift&31)
11137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $v1, $a2                         #  rhi<- 31-shift  (shift is 5b)
11147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, 1
11157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, $v1                         #  alo<- alo >> (32-(shift&31))
11167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v1, $a1, $a2                    #  rhi<- ahi << (shift&31)
11177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v1, $a0                         #  rhi<- rhi | alo
11187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift< shift & 0x20
11197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $v0, $a2                    #  rhi<- rlo (if shift&0x20)
11207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1121fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    movn    $v0, $zero, $a2                  #  rlo<- 0  (if shift&0x20)
1122d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shl_long
11235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
11245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
11255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
11265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
11275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
11285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
11295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
11307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
11317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
11327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
11335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1134d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .global art_quick_shr_long
1135d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shr_long
11367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
11377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
11387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $a3, $a1, 31                     #  $a3<- sign(ah)
11397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
11407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
11417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
11427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
11437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
11447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
11457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
11467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v1, $a3, $a2                    #  rhi<- sign(ahi) (if shift&0x20)
1147d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shr_long
11485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
11495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
11505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
11515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
11525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
11535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
11545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
11555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r0: low word
11565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r1: high word
11575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r2: shift count
11585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
11595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* ushr-long vAA, vBB, vCC */
1160d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .global art_quick_ushr_long
1161d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_ushr_long
1162fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    srl     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
11637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
11647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
11657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
11667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
11677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    or      $v0, $a1                         #  rlo<- rlo | ahi
11687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
11697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    movn    $v0, $v1, $a2                    #  rlo<- rhi (if shift&0x20)
11707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr      $ra
1171fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    movn    $v1, $zero, $a2                  #  rhi<- 0 (if shift&0x20)
1172d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_ushr_long
11737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao
1174d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_indexof
11757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr $ra
11760703060875166106af3d490c6c264611aea67ec8jeffhao    nop
1177d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_indexof
11787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao
1179d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_string_compareto
11807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jr $ra
11810703060875166106af3d490c6c264611aea67ec8jeffhao    nop
1182d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_string_compareto
1183