quick_entrypoints_mips.S revision 848f70a3d73833fc1bf3032a9ff6812e429661d9
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
29735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung#define ARG_SLOT_SIZE   32    // space for a0-a3 plus 4 more words
30735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung
315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kSaveAll)
34735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Callee-save: $s0-$s8 + $gp + $ra, 11 total + 1 word for Method*
35735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Clobbers $t0 and $sp
36735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Allocates ARG_SLOT_SIZE bytes at the bottom of the stack for arg slots.
37735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Reserves FRAME_SIZE_SAVE_ALL_CALLEE_SAVE + ARG_SLOT_SIZE bytes on the stack
385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
3957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.macro SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
40735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu  $sp, $sp, -48
41735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_adjust_cfa_offset 48
425c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
435c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe     // Ugly compile-time check, but we only have the preprocessor.
44735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung#if (FRAME_SIZE_SAVE_ALL_CALLEE_SAVE != 48)
455c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "SAVE_ALL_CALLEE_SAVE_FRAME(MIPS) size not as expected."
465c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif
475c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
48735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $ra, 44($sp)
49735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 31, 44
50735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s8, 40($sp)
51735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 30, 40
52735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $gp, 36($sp)
53735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 28, 36
54735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s7, 32($sp)
55735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 23, 32
56735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s6, 28($sp)
57735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 22, 28
58735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s5, 24($sp)
59735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 21, 24
60735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s4, 20($sp)
61735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 20, 20
62735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s3, 16($sp)
63735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 19, 16
64735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s2, 12($sp)
65735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 18, 12
66735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s1, 8($sp)
67735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 17, 8
68735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s0, 4($sp)
69735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 16, 4
70735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    # 1 word for holding Method*
711d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers
724af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, %got(_ZN3art7Runtime9instance_E)($gp)
734af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, 0($t0)
741d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    THIS_LOAD_REQUIRES_READ_BARRIER
754af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET($t0)
761d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $t0, 0($sp)                                # Place Method* at bottom of stack.
771d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF)  # Place sp in Thread::Current()->top_quick_frame.
78735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu  $sp, $sp, -ARG_SLOT_SIZE               # reserve argument slots on the stack
79735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_adjust_cfa_offset ARG_SLOT_SIZE
805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC.
855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Does not include rSUSPEND or rSELF
86735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * callee-save: $s2-$s8 + $gp + $ra, 9 total + 2 words padding + 1 word to hold Method*
87735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Clobbers $t0 and $sp
88735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Allocates ARG_SLOT_SIZE bytes at the bottom of the stack for arg slots.
89735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Reserves FRAME_SIZE_REFS_ONLY_CALLEE_SAVE + ARG_SLOT_SIZE bytes on the stack
905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
911d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro SETUP_REFS_ONLY_CALLEE_SAVE_FRAME
92735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu  $sp, $sp, -48
93735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_adjust_cfa_offset 48
945c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
955c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe    // Ugly compile-time check, but we only have the preprocessor.
96735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung#if (FRAME_SIZE_REFS_ONLY_CALLEE_SAVE != 48)
975c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "REFS_ONLY_CALLEE_SAVE_FRAME(MIPS) size not as expected."
985c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif
995c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
100735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $ra, 44($sp)
101735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 31, 44
102735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s8, 40($sp)
103735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 30, 40
104735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $gp, 36($sp)
105735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 28, 36
106735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s7, 32($sp)
107735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 23, 32
108735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s6, 28($sp)
109735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 22, 28
110735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s5, 24($sp)
111735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 21, 24
112735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s4, 20($sp)
113735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 20, 20
114735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s3, 16($sp)
115735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 19, 16
116735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $s2, 12($sp)
117735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_rel_offset 18, 12
118735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    # 2 words for alignment and bottom word will hold Method*
1191d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers
1204af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, %got(_ZN3art7Runtime9instance_E)($gp)
1214af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, 0($t0)
1221d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    THIS_LOAD_REQUIRES_READ_BARRIER
1234af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET($t0)
1241d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $t0, 0($sp)                                # Place Method* at bottom of stack.
1251d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF)  # Place sp in Thread::Current()->top_quick_frame.
126735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu  $sp, $sp, -ARG_SLOT_SIZE               # reserve argument slots on the stack
127735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_adjust_cfa_offset ARG_SLOT_SIZE
1285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1301d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
131735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu  $sp, $sp, ARG_SLOT_SIZE                # remove argument slots on the stack
132735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_adjust_cfa_offset -ARG_SLOT_SIZE
133735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $ra, 44($sp)
134bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
135735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $s8, 40($sp)
136bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
137735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $gp, 36($sp)
138bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 28
139735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $s7, 32($sp)
140bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 23
141735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $s6, 28($sp)
142bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 22
143735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $s5, 24($sp)
144bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 21
145735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $s4, 20($sp)
146bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 20
147735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $s3, 16($sp)
148bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 19
149735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $s2, 12($sp)
150bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 18
151735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu  $sp, $sp, 48
152735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_adjust_cfa_offset -48
1535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1551d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
156735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
1578d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr   $zero, $ra
158735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    nop
1595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
1605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that sets up the callee save frame to conform with
163735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Runtime::CreateCalleeSaveMethod(kRefsAndArgs).
1641f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao     * callee-save: $a1-$a3, $s2-$s8 + $gp + $ra, 12 total + 3 words padding + method*
1655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
166735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung.macro SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME_REGISTERS_ONLY
1671f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    addiu  $sp, $sp, -64
1681f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_adjust_cfa_offset 64
1695c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
1705c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe    // Ugly compile-time check, but we only have the preprocessor.
1715c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE != 64)
1725c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "REFS_AND_ARGS_CALLEE_SAVE_FRAME(MIPS) size not as expected."
1735c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif
1745c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe
1751f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $ra, 60($sp)
1761f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 31, 60
1771f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s8, 56($sp)
1781f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 30, 56
1791f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $gp, 52($sp)
1801f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 28, 52
1811f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s7, 48($sp)
1821f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 23, 48
1831f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s6, 44($sp)
1841f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 22, 44
1851f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s5, 40($sp)
1861f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 21, 40
1871f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s4, 36($sp)
1881f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 20, 36
1891f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s3, 32($sp)
1901f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 19, 32
1911f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    sw     $s2, 28($sp)
1921f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_rel_offset 18, 28
193c6d86725521841637bdd9564e71be3d9691db20fDouglas Leung    sw     $a3, 24($sp)
194c6d86725521841637bdd9564e71be3d9691db20fDouglas Leung    .cfi_rel_offset 7, 24
195c6d86725521841637bdd9564e71be3d9691db20fDouglas Leung    sw     $a2, 20($sp)
196c6d86725521841637bdd9564e71be3d9691db20fDouglas Leung    .cfi_rel_offset 6, 20
197c6d86725521841637bdd9564e71be3d9691db20fDouglas Leung    sw     $a1, 16($sp)
198c6d86725521841637bdd9564e71be3d9691db20fDouglas Leung    .cfi_rel_offset 5, 16
199fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    # bottom will hold Method*
200735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung.endm
2011d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers
202735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    /*
203735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Macro that sets up the callee save frame to conform with
204735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC.
205735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * callee-save: $a1-$a3, $s2-$s8 + $gp + $ra, 12 total + 3 words padding + method*
206735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Clobbers $t0 and $sp
207735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Allocates ARG_SLOT_SIZE bytes at the bottom of the stack for arg slots.
208735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Reserves FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE + ARG_SLOT_SIZE bytes on the stack
209735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     */
210735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung.macro SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME
211735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME_REGISTERS_ONLY
2124af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, %got(_ZN3art7Runtime9instance_E)($gp)
2134af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, 0($t0)
2141d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    THIS_LOAD_REQUIRES_READ_BARRIER
2154af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung    lw $t0, RUNTIME_REFS_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET($t0)
2161d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $t0, 0($sp)                                # Place Method* at bottom of stack.
2171d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF)  # Place sp in Thread::Current()->top_quick_frame.
218735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu  $sp, $sp, -ARG_SLOT_SIZE               # reserve argument slots on the stack
219735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_adjust_cfa_offset ARG_SLOT_SIZE
220735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung.endm
221735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung
222735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    /*
223735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Macro that sets up the callee save frame to conform with
224735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC.
225735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * callee-save: $a1-$a3, $s2-$s8 + $gp + $ra, 12 total + 3 words padding + method*
226735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Clobbers $sp
227735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Use $a0 as the Method* and loads it into bottom of stack.
228735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Allocates ARG_SLOT_SIZE bytes at the bottom of the stack for arg slots.
229735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     * Reserves FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE + ARG_SLOT_SIZE bytes on the stack
230735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung     */
231735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung.macro SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME_WITH_METHOD_IN_A0
232735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME_REGISTERS_ONLY
233735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw $a0, 0($sp)                                # Place Method* at bottom of stack.
234735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF)  # Place sp in Thread::Current()->top_quick_frame.
235735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu  $sp, $sp, -ARG_SLOT_SIZE               # reserve argument slots on the stack
236735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_adjust_cfa_offset ARG_SLOT_SIZE
2375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2391d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
240735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu  $sp, $sp, ARG_SLOT_SIZE                # remove argument slots on the stack
241735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_adjust_cfa_offset -ARG_SLOT_SIZE
2422a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $ra, 60($sp)
243bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
2442a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s8, 56($sp)
245bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
2462a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $gp, 52($sp)
247bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 28
2482a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s7, 48($sp)
249bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 23
2502a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s6, 44($sp)
251bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 22
2522a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s5, 40($sp)
253bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 21
2542a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s4, 36($sp)
255bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 20
2562a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s3, 32($sp)
257bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 19
2582a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier    lw     $s2, 28($sp)
259bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 18
260c6d86725521841637bdd9564e71be3d9691db20fDouglas Leung    lw     $a3, 24($sp)
261bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 7
262c6d86725521841637bdd9564e71be3d9691db20fDouglas Leung    lw     $a2, 20($sp)
263bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 6
264c6d86725521841637bdd9564e71be3d9691db20fDouglas Leung    lw     $a1, 16($sp)
265bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 5
266468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    addiu  $sp, $sp, 64           # pop frame
2671f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao    .cfi_adjust_cfa_offset -64
2685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
2715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending
2725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * exception is Thread::Current()->exception_
2735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
2745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro DELIVER_PENDING_EXCEPTION
2758161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME     # save callee saves for throw
2768161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la      $t9, artDeliverPendingExceptionFromCode
2778d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr    $zero, $t9                   # artDeliverPendingExceptionFromCode(Thread*)
2781d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a0, rSELF                   # pass Thread::Current
2795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NO_EXCEPTION
2827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw     $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
2831d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
2848161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    bnez   $t0, 1f                       # success if no exception is pending
2855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2868d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr   $zero, $ra
2875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
2895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
2905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
2915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
2925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_ZERO
2931d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
2947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $v0, 1f                       # success?
2955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2968d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr   $zero, $ra                    # return on success
2975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
2985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
2995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
3005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
3015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3021cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe.macro RETURN_IF_RESULT_IS_NON_ZERO_OR_DELIVER
3031d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME
3047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    beqz   $v0, 1f                       # success?
3055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
3068d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr   $zero, $ra                    # return on success
3075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
3085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
3095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
3105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
3115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * On entry $a0 is uint32_t* gprs_ and $a1 is uint32_t* fprs_
3145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * FIXME: just guessing about the shape of the jmpbuf.  Where will pc be?
3155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
316d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_do_long_jump
317e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f0,  $f1,   0*8, $a1, $t1
318e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f2,  $f3,   1*8, $a1, $t1
319e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f4,  $f5,   2*8, $a1, $t1
320e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f6,  $f7,   3*8, $a1, $t1
321e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f8,  $f9,   4*8, $a1, $t1
322e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f10, $f11,  5*8, $a1, $t1
323e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f12, $f13,  6*8, $a1, $t1
324e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f14, $f15,  7*8, $a1, $t1
325e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f16, $f17,  8*8, $a1, $t1
326e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f18, $f19,  9*8, $a1, $t1
327e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f20, $f21, 10*8, $a1, $t1
328e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f22, $f23, 11*8, $a1, $t1
329e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f24, $f25, 12*8, $a1, $t1
330e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f26, $f27, 13*8, $a1, $t1
331e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f28, $f29, 14*8, $a1, $t1
332e34652f15f32666323052a6718a63248244f1e66Duane Sand    LDu  $f30, $f31, 15*8, $a1, $t1
333e34652f15f32666323052a6718a63248244f1e66Duane Sand
334748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set push
335748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set nomacro
336748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set noat
3377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $at, 4($a0)
338748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman    .set pop
3397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v0, 8($a0)
3407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $v1, 12($a0)
3417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a1, 20($a0)
3427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a2, 24($a0)
3437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a3, 28($a0)
3447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, 32($a0)
3457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t1, 36($a0)
3467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t2, 40($a0)
3477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t3, 44($a0)
3487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t4, 48($a0)
3497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t5, 52($a0)
3507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t6, 56($a0)
3517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t7, 60($a0)
3527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s0, 64($a0)
3537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s1, 68($a0)
3547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s2, 72($a0)
3557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s3, 76($a0)
3567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s4, 80($a0)
3577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s5, 84($a0)
3587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s6, 88($a0)
3597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $s7, 92($a0)
3607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t8, 96($a0)
3617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t9, 100($a0)
3627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $gp, 112($a0)
3637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $sp, 116($a0)
3647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $fp, 120($a0)
3657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $ra, 124($a0)
3667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $a0, 16($a0)
3677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v0, $zero          # clear result registers r0 and r1
3688d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr    $zero, $ra          # do long jump
3697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $v1, $zero
370d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_do_long_jump
3715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code, saves most registers (forms basis of long jump context) and passes
3745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at
3755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the bottom of the thread. On entry r0 holds Throwable*
3765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
377468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_deliver_exception
37857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3798161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artDeliverExceptionFromCode
3808d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr $zero, $t9                 # artDeliverExceptionFromCode(Throwable*, Thread*)
3811d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a1, rSELF                 # pass Thread::Current
382468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_deliver_exception
3835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver a NullPointerException
3865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
387d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNullPointerExceptionFromCode
388468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_null_pointer_exception
38957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
3908161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNullPointerExceptionFromCode
3918d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr $zero, $t9                 # artThrowNullPointerExceptionFromCode(Thread*)
3921d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a0, rSELF                 # pass Thread::Current
393468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_null_pointer_exception
3945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
3955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
3965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArithmeticException
3975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
398d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowDivZeroFromCode
399468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_div_zero
40057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
4018161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowDivZeroFromCode
4028d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr $zero, $t9                 # artThrowDivZeroFromCode(Thread*)
4031d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a0, rSELF                 # pass Thread::Current
404468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_div_zero
4055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
4075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException
4085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
409d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowArrayBoundsFromCode
410468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_array_bounds
41157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
4128161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowArrayBoundsFromCode
4138d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr $zero, $t9                 # artThrowArrayBoundsFromCode(index, limit, Thread*)
4141d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a2, rSELF                 # pass Thread::Current
415468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_array_bounds
4165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
41757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
41857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a StackOverflowError.
41957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
420d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowStackOverflowFromCode
421468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_stack_overflow
42257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
4238161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowStackOverflowFromCode
4248d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr $zero, $t9                 # artThrowStackOverflowFromCode(Thread*)
4251d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a0, rSELF                 # pass Thread::Current
426468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_stack_overflow
4275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
42857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    /*
42957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to create and deliver a NoSuchMethodError.
43057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     */
431d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artThrowNoSuchMethodFromCode
432468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_no_such_method
43357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
4348161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    la   $t9, artThrowNoSuchMethodFromCode
4358d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr $zero, $t9                 # artThrowNoSuchMethodFromCode(method_idx, Thread*)
4361d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a1, rSELF                 # pass Thread::Current
437468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_no_such_method
4385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
4405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * All generated callsites for interface invokes and invocation slow paths will load arguments
4417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain
4425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * the method_idx.  This wrapper will save arg1-arg3, load the caller's Method*, align the
4435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * stack and call the appropriate C helper.
4447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1.
4455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
4467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting
4477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     * of the target Method* in $v0 and method->code_ in $v1.
4485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
4492cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier     * If unsuccessful, the helper will return null/null. There will be a pending exception in the
4505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * thread and we branch to another stub to deliver it.
4515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *
4525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On success this wrapper will restore arguments and *jump* to the target, leaving the lr
4535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * pointing back to the original caller.
4545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
4555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name
4565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    .extern \cxx_name
457d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY \c_name
4581d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME  # save callee saves in case allocation triggers GC
459735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw    $a2, FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE+ARG_SLOT_SIZE($sp)    # pass caller Method*
460735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu $t0, $sp, ARG_SLOT_SIZE         # save $sp (remove arg slots)
4617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move  $a3, rSELF                      # pass Thread::Current
4627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    jal   \cxx_name                       # (method_idx, this, caller, Thread*, $sp)
463fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw    $t0, 16($sp)                    # pass $sp
464fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    move  $a0, $v0                        # save target Method*
4651d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
466fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    beqz  $v0, 1f
467735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    move  $t9, $v1                        # save $v0->code_
4688d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr  $zero, $t9
4695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
4705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
4715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
472d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND \c_name
4735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm
4745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4758dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline
4768dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck
4775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
4788dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck
4798dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck
4808dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck
4818dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck
4825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
48379fe539587d4c09244172d0168eeed0ec9770466Jeff Hao    /*
484ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers     * Invocation stub for quick code.
4855d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     * On entry:
4865d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a0 = method pointer
4872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier     *   a1 = argument array or null for no argument methods
4885d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a2 = size of argument array in bytes
4895d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     *   a3 = (managed) thread pointer
4906474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao     *   [sp + 16] = JValue* result
4910177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers     *   [sp + 20] = shorty
4925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao     */
4935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoENTRY art_quick_invoke_stub
4945d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $a0, 0($sp)           # save out a0
4955d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # spill s0, s1, fp, ra
4965d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset 16
4975d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $ra, 12($sp)
4985d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 31, 12
4995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $fp, 8($sp)
5005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 30, 8
5015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s1, 4($sp)
5025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 17, 4
5035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $s0, 0($sp)
5045d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_rel_offset 16, 0
5055d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $fp, $sp              # save sp in fp
5065d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_def_cfa_register 30
5075d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $s1, $a3              # move managed thread pointer into s1
5085d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $s0, $zero, SUSPEND_CHECK_INTERVAL  # reset s0 to suspend check interval
509735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu $t0, $a2, 4           # create space for method pointer in frame.
510735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    subu  $t0, $sp, $t0         # reserve & align *stack* to 16 bytes:
511735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    srl   $t0, $t0, 4           # native calling convention only aligns to 8B,
512735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sll   $sp, $t0, 4           # so we have to ensure ART 16B alignment ourselves.
5135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $a0, $sp, 4           # pass stack pointer + method ptr as dest for memcpy
5145d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jal   memcpy                # (dest, src, bytes)
5155d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, -16         # make space for argument slots for memcpy
5165d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16          # restore stack after memcpy
5175d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a0, 16($fp)          # restore method*
5185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a1, 4($sp)           # copy arg value for a1
5195d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a2, 8($sp)           # copy arg value for a2
5205d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $a3, 12($sp)          # copy arg value for a3
5212d7210188805292e463be4bcf7a133b654d7e0eaMathieu Chartier    lw    $t9, MIRROR_ART_METHOD_QUICK_CODE_OFFSET_32($a0)  # get pointer to the code
5225d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    jalr  $t9                   # call the method
5232cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    sw    $zero, 0($sp)         # store null for method* at bottom of frame
5245d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    move  $sp, $fp              # restore the stack
5255d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s0, 0($sp)
526bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 16
5275d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $s1, 4($sp)
528bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 17
5295d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $fp, 8($sp)
530bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 30
5315d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $ra, 12($sp)
532bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison    .cfi_restore 31
5335d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    addiu $sp, $sp, 16
5345d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    .cfi_adjust_cfa_offset -16
5355d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    lw    $t0, 16($sp)          # get result pointer
5360177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers    lw    $t1, 20($sp)          # get shorty
5370177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers    lb    $t1, 0($t1)           # get result type char
5386474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t2, 68               # put char 'D' into t2
5396474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t2, 1f          # branch if result type char == 'D'
5406474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    li    $t3, 70               # put char 'F' into t3
5416474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao    beq   $t1, $t3, 1f          # branch if result type char == 'F'
5425d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v0, 0($t0)           # store the result
5438d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr  $zero, $ra
5445d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    sw    $v1, 4($t0)           # store the other half of the result
5456474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao1:
546e34652f15f32666323052a6718a63248244f1e66Duane Sand    SDu   $f0, $f1, 0, $t0, $t1 # store floating point result
5478d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr  $zero, $ra
548e34652f15f32666323052a6718a63248244f1e66Duane Sand    nop
5495d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoEND art_quick_invoke_stub
5505d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao
5515d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao    /*
5525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on
5535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * failure.
5545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
555d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artHandleFillArrayDataFromCode
556468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_handle_fill_data
557735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a2, 0($sp)                    # pass referrer's Method*
558735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case exception allocation triggers GC
5591d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artHandleFillArrayDataFromCode # (payload offset, Array*, method, Thread*)
560832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers    move   $a3, rSELF                     # pass Thread::Current
561fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    RETURN_IF_ZERO
562468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_handle_fill_data
5635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
56557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Entry from managed code that calls artLockObjectFromCode, may block for GC.
5665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
567d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artLockObjectFromCode
568468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_lock_object
56986bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz    $a0, .Lart_quick_throw_null_pointer_exception_gp_set
570a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
571735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME     # save callee saves in case we block
5721d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal     artLockObjectFromCode         # (Object* obj, Thread*)
5737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                    # pass Thread::Current
5746bcd163d322b867578fbcfe60e4e3b247c42974bIan Rogers    RETURN_IF_ZERO
575468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_lock_object
5765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure.
5795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
580d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artUnlockObjectFromCode
581468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_unlock_object
58286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz    $a0, .Lart_quick_throw_null_pointer_exception_gp_set
583a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
584735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC
5851d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal     artUnlockObjectFromCode   # (Object* obj, Thread*)
5867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move    $a1, rSELF                # pass Thread::Current
5875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
588468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_unlock_object
5895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
5905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
5915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure.
5925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
593a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .extern artThrowClassCastException
594468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_cast
595a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, -16
596a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset 16
597a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $ra, 12($sp)
598a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_rel_offset 31, 12
599a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $t9, 8($sp)
600a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a1, 4($sp)
601a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a0, 0($sp)
602a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jal    artIsAssignableFromCode
603735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu  $sp, $sp, -16             # reserve argument slots on the stack
604735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu  $sp, $sp, 16
60586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz   $v0, .Lthrow_class_cast_exception
606a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $ra, 12($sp)
6078d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr   $zero, $ra
608a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, 16
609a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -16
61086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lthrow_class_cast_exception:
611a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $t9, 8($sp)
612a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a1, 4($sp)
613a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a0, 0($sp)
614a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, 16
615a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -16
616a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
617a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    la   $t9, artThrowClassCastException
6188d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr $zero, $t9                 # artThrowClassCastException (Class*, Class*, Thread*)
6191d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a2, rSELF                 # pass Thread::Current
620468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_cast
6215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
623a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * Entry from managed code for array put operations of objects where the value being stored
624a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * needs to be checked for compatibility.
625a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers     * a0 = array, a1 = index, a2 = value
6265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
627a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_null_and_bound_check
62886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez    $a0, .Lart_quick_aput_obj_with_bound_check_gp_set
629a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
63086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    b .Lart_quick_throw_null_pointer_exception_gp_set
631a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
632a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_null_and_bound_check
633a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers
634a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_bound_check
6351d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw $t0, MIRROR_ARRAY_LENGTH_OFFSET($a0)
636a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sltu $t1, $a1, $t0
63786bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez $t1, .Lart_quick_aput_obj_gp_set
638a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
639a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a0, $a1
64086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    b .Lart_quick_throw_array_bounds_gp_set
641a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a1, $t0
642a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_bound_check
643a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers
644a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj
64586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    beqz $a2, .Ldo_aput_null
646a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
6471d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw $t0, MIRROR_OBJECT_CLASS_OFFSET($a0)
6481d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw $t1, MIRROR_OBJECT_CLASS_OFFSET($a2)
6491d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw $t0, MIRROR_CLASS_COMPONENT_TYPE_OFFSET($t0)
65086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bne $t1, $t0, .Lcheck_assignability  # value's type == array's component type - trivial assignability
651a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
65286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput:
653a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sll $a1, $a1, 2
654a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t0, $a0, $a1
6551d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw  $a2, MIRROR_OBJECT_ARRAY_DATA_OFFSET($t0)
656a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw  $t0, THREAD_CARD_TABLE_OFFSET(rSELF)
657a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    srl $t1, $a0, 7
658a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t1, $t1, $t0
659a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sb  $t0, ($t1)
6608d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr $zero, $ra
661a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
66286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput_null:
663a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sll $a1, $a1, 2
664a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    add $t0, $a0, $a1
6651d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw  $a2, MIRROR_OBJECT_ARRAY_DATA_OFFSET($t0)
6668d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr $zero, $ra
667a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
66886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lcheck_assignability:
669a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    addiu  $sp, $sp, -32
670a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset 32
671a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $ra, 28($sp)
672a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_rel_offset 31, 28
673a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $t9, 12($sp)
674a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a2, 8($sp)
675a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a1, 4($sp)
676a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    sw     $a0, 0($sp)
677a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move   $a1, $t1
678a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move   $a0, $t0
679a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    jal    artIsAssignableFromCode  # (Class*, Class*)
680735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu $sp, $sp, -16     # reserve argument slots on the stack
681735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu $sp, $sp, 16
682a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $ra, 28($sp)
683a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $t9, 12($sp)
684a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a2, 8($sp)
685a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a1, 4($sp)
686a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    lw     $a0, 0($sp)
687e34652f15f32666323052a6718a63248244f1e66Duane Sand    addiu  $sp, 32
688a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    .cfi_adjust_cfa_offset -32
68986bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers    bnez   $v0, .Ldo_aput
690a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    nop
691a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
692a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    move $a1, $a2
693a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers    la   $t9, artThrowArrayStoreException
6948d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr $zero, $t9                 # artThrowArrayStoreException(Class*, Class*, Thread*)
6951d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move $a2, rSELF                 # pass Thread::Current
696a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj
6975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
6985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
69937f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and load a boolean primitive value.
70037f05ef45e0393de812d51261dc293240c17294dFred Shih     */
70137f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetBooleanStaticFromCode
70237f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_boolean_static
703735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a1, 0($sp)                   # pass referrer's Method*
704735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
7051d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetBooleanStaticFromCode   # (uint32_t field_idx, const Method* referrer, Thread*)
70637f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a2, rSELF                    # pass Thread::Current
70737f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
70837f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_boolean_static
70937f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
71037f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and load a byte primitive value.
71137f05ef45e0393de812d51261dc293240c17294dFred Shih     */
71237f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetByteStaticFromCode
71337f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_byte_static
714735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a1, 0($sp)                   # pass referrer's Method*
715735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
7161d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetByteStaticFromCode      # (uint32_t field_idx, const Method* referrer, Thread*)
71737f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a2, rSELF                    # pass Thread::Current
71837f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
71937f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_byte_static
72037f05ef45e0393de812d51261dc293240c17294dFred Shih
72137f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
72237f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and load a char primitive value.
72337f05ef45e0393de812d51261dc293240c17294dFred Shih     */
72437f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetCharStaticFromCode
72537f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_char_static
726735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a1, 0($sp)                   # pass referrer's Method*
727735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
7281d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetCharStaticFromCode      # (uint32_t field_idx, const Method* referrer, Thread*)
72937f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a2, rSELF                    # pass Thread::Current
73037f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
73137f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_char_static
73237f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
73337f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and load a short primitive value.
73437f05ef45e0393de812d51261dc293240c17294dFred Shih     */
73537f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetShortStaticFromCode
73637f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_short_static
737735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a1, 0($sp)                   # pass referrer's Method*
738735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
7391d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetShortStaticFromCode     # (uint32_t field_idx, const Method* referrer, Thread*)
74037f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a2, rSELF                    # pass Thread::Current
74137f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
74237f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_short_static
7435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
74557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 32-bit primitive value.
7465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
747d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32StaticFromCode
748468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_static
749735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a1, 0($sp)                   # pass referrer's Method*
750735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
7511d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGet32StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*)
7527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
7535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
754468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_static
7555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
75757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load a 64-bit primitive value.
7585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
759d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64StaticFromCode
760468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_static
761735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a1, 0($sp)                   # pass referrer's Method*
762735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
7631d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGet64StaticFromCode        # (uint32_t field_idx, const Method* referrer, Thread*)
7647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
7655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
766468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_static
7675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
76957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and load an object reference.
7705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
771d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjStaticFromCode
772468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_static
773735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a1, 0($sp)                   # pass referrer's Method*
774735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
7751d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetObjStaticFromCode       # (uint32_t field_idx, const Method* referrer, Thread*)
7767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a2, rSELF                    # pass Thread::Current
7775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
778468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_static
7795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
7805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
78137f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and load a boolean primitive value.
78237f05ef45e0393de812d51261dc293240c17294dFred Shih     */
78337f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetBooleanInstanceFromCode
78437f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_boolean_instance
785735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a2, 0($sp)                   # pass referrer's Method*
786735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
7871d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetBooleanInstanceFromCode # (field_idx, Object*, referrer, Thread*)
78837f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a3, rSELF                    # pass Thread::Current
78937f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
79037f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_boolean_instance
79137f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
79237f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and load a byte primitive value.
79337f05ef45e0393de812d51261dc293240c17294dFred Shih     */
79437f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetByteInstanceFromCode
79537f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_byte_instance
796735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a2, 0($sp)                   # pass referrer's Method*
797735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
7981d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetByteInstanceFromCode    # (field_idx, Object*, referrer, Thread*)
79937f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a3, rSELF                    # pass Thread::Current
80037f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
80137f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_byte_instance
80237f05ef45e0393de812d51261dc293240c17294dFred Shih
80337f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
80437f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and load a char primitive value.
80537f05ef45e0393de812d51261dc293240c17294dFred Shih     */
80637f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetCharInstanceFromCode
80737f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_char_instance
808735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a2, 0($sp)                   # pass referrer's Method*
809735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
8101d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetCharInstanceFromCode    # (field_idx, Object*, referrer, Thread*)
81137f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a3, rSELF                    # pass Thread::Current
81237f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
81337f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_char_instance
81437f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
81537f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and load a short primitive value.
81637f05ef45e0393de812d51261dc293240c17294dFred Shih     */
81737f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artGetShortInstanceFromCode
81837f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_short_instance
819735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a2, 0($sp)                   # pass referrer's Method*
820735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
821735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    jal    artGetShortInstanceFromCode   # (field_idx, Object*, referrer, Thread*)
82237f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a3, rSELF                    # pass Thread::Current
82337f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_NO_EXCEPTION
82437f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_short_instance
82537f05ef45e0393de812d51261dc293240c17294dFred Shih
82637f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
82757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 32-bit primitive value.
8285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
829d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet32InstanceFromCode
830468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_instance
831735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a2, 0($sp)                   # pass referrer's Method*
832735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
833735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    jal    artGet32InstanceFromCode      # (field_idx, Object*, referrer, Thread*)
8347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
8355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
836468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_instance
8375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
83957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load a 64-bit primitive value.
8405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
841d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGet64InstanceFromCode
842468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_instance
843735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a2, 0($sp)                   # pass referrer's Method*
844735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
845735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    jal    artGet64InstanceFromCode      # (field_idx, Object*, referrer, Thread*)
8467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
8475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
848468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_instance
8495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
85157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and load an object reference.
8525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
853d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artGetObjInstanceFromCode
854468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_instance
855735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a2, 0($sp)                   # pass referrer's Method*
856735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
8571d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artGetObjInstanceFromCode     # (field_idx, Object*, referrer, Thread*)
8587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
8595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_NO_EXCEPTION
860468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_instance
8615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
86337f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and store a 8-bit primitive value.
86437f05ef45e0393de812d51261dc293240c17294dFred Shih     */
86537f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet8StaticFromCode
86637f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set8_static
867735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a2, 0($sp)                   # pass referrer's Method*
868735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
8691d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet8StaticFromCode         # (field_idx, new_val, referrer, Thread*)
87037f05ef45e0393de812d51261dc293240c17294dFred Shih    move   $a3, rSELF                    # pass Thread::Current
87137f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_ZERO
87237f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set8_static
87337f05ef45e0393de812d51261dc293240c17294dFred Shih
87437f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
87537f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve a static field and store a 16-bit primitive value.
87637f05ef45e0393de812d51261dc293240c17294dFred Shih     */
87737f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet16StaticFromCode
87837f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set16_static
879735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a2, 0($sp)                   # pass referrer's Method*
880735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
88137f05ef45e0393de812d51261dc293240c17294dFred Shih    jal    artSet16StaticFromCode        # (field_idx, new_val, referrer, Thread*, $sp)
8821d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move   $a3, rSELF                    # pass Thread::Current
88337f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_ZERO
88437f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set16_static
88537f05ef45e0393de812d51261dc293240c17294dFred Shih
88637f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
88757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 32-bit primitive value.
8885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
889d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32StaticFromCode
890468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_static
891735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a2, 0($sp)                   # pass referrer's Method*
892735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
8931d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet32StaticFromCode        # (field_idx, new_val, referrer, Thread*)
8947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
8955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
896468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_static
8975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
8985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
89957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store a 64-bit primitive value.
9005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
90137f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet64StaticFromCode
902468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_static
903735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a1, 0($sp)                   # pass referrer's Method*
9048d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe                                         # 64 bit new_val is in a2:a3 pair
905735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
9061d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet64StaticFromCode        # (field_idx, referrer, new_val, Thread*)
907fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
9085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
909468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_static
9105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
91257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve a static field and store an object reference.
9135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
914d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjStaticFromCode
915468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_static
916735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a2, 0($sp)                   # pass referrer's Method*
917735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
9187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a3, rSELF                    # pass Thread::Current
919735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    jal    artSetObjStaticFromCode       # (field_idx, new_val, referrer, Thread*)
9205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
921468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_static
9225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
92437f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and store a 8-bit primitive value.
92537f05ef45e0393de812d51261dc293240c17294dFred Shih     */
92637f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet8InstanceFromCode
92737f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set8_instance
928735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a3, 0($sp)                   # pass referrer's Method*
929735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
930735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    jal    artSet8InstanceFromCode       # (field_idx, Object*, new_val, referrer, Thread*)
93137f05ef45e0393de812d51261dc293240c17294dFred Shih    sw     rSELF, 16($sp)                # pass Thread::Current
93237f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_ZERO
93337f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set8_instance
93437f05ef45e0393de812d51261dc293240c17294dFred Shih
93537f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
93637f05ef45e0393de812d51261dc293240c17294dFred Shih     * Called by managed code to resolve an instance field and store a 16-bit primitive value.
93737f05ef45e0393de812d51261dc293240c17294dFred Shih     */
93837f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet16InstanceFromCode
93937f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set16_instance
940735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a3, 0($sp)                   # pass referrer's Method*
941735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
9421d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet16InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*)
94337f05ef45e0393de812d51261dc293240c17294dFred Shih    sw     rSELF, 16($sp)                # pass Thread::Current
94437f05ef45e0393de812d51261dc293240c17294dFred Shih    RETURN_IF_ZERO
94537f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set16_instance
94637f05ef45e0393de812d51261dc293240c17294dFred Shih
94737f05ef45e0393de812d51261dc293240c17294dFred Shih    /*
94857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 32-bit primitive value.
9495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
950d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSet32InstanceFromCode
951468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_instance
952735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a3, 0($sp)                   # pass referrer's Method*
953735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
9541d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet32InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*)
955fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
9565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
957468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_instance
9585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
96057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store a 64-bit primitive value.
9615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
96237f05ef45e0393de812d51261dc293240c17294dFred Shih    .extern artSet64InstanceFromCode
963468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_instance
964735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $t1, 0($sp)                   # load referrer's Method*
9658d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe                                         # 64 bit new_val is in a2:a3 pair
966735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
9671d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    sw     rSELF, 20($sp)                # pass Thread::Current
9681d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSet64InstanceFromCode      # (field_idx, Object*, new_val, referrer, Thread*)
969735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw     $t1, 16($sp)                  # pass referrer's Method*
9705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
971468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_instance
9725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
97457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code to resolve an instance field and store an object reference.
9755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
976d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artSetObjInstanceFromCode
977468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_instance
978735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw     $a3, 0($sp)                   # pass referrer's Method*
979735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME    # save callee saves in case of GC
9801d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artSetObjInstanceFromCode     # (field_idx, Object*, new_val, referrer, Thread*)
981fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao    sw     rSELF, 16($sp)                # pass Thread::Current
9825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    RETURN_IF_ZERO
983468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_instance
9845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
9855ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir Marko.macro ONE_ARG_DOWNCALL name, entrypoint, return
9865ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir Marko    .extern \entrypoint
9875ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir MarkoENTRY \name
9885ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir Marko    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC
9895ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir Marko    jal     \entrypoint
9905ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir Marko    move    $a1, rSELF                # pass Thread::Current
9915ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir Marko    \return
9925ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir MarkoEND \name
9935ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir Marko.endm
9945ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir Marko
995cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier// Macro to facilitate adding new allocation entrypoints.
996848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao.macro ONE_ARG_DOWNCALL name, entrypoint, return
997848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    .extern \entrypoint
998848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaoENTRY \name
999848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    GENERATE_GLOBAL_POINTER
1000848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
1001848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    move    $a1, rSELF                # pass Thread::Current
1002848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    jal     \entrypoint
1003848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    move    $a2, $sp                  # pass $sp
1004848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    \return
1005848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaoEND \name
1006848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao.endm
1007848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao
1008cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro TWO_ARG_DOWNCALL name, entrypoint, return
1009cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    .extern \entrypoint
1010cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name
1011735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC
1012cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    jal     \entrypoint
10131d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a2, rSELF                # pass Thread::Current
1014cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    \return
1015cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name
1016cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm
10175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1018cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro THREE_ARG_DOWNCALL name, entrypoint, return
1019cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    .extern \entrypoint
1020cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name
1021735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC
1022cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    jal     \entrypoint
10231d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move    $a3, rSELF                # pass Thread::Current
1024cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier    \return
1025cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name
1026cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm
10275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
1028848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao.macro FOUR_ARG_DOWNCALL name, entrypoint, return
1029848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    .extern \entrypoint
1030848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaoENTRY \name
1031848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    GENERATE_GLOBAL_POINTER
1032848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  # save callee saves in case of GC
1033848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    sw      rSELF, 16($sp)            # pass Thread::Current
1034848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    jal     \entrypoint
1035848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    sw      $sp, 20($sp)              # pass $sp
1036848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao    \return
1037848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff HaoEND \name
1038848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao.endm
1039848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao
10407410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier// Generate the allocation entrypoints for each allocator.
10417410f29b4dae223befac036ea567d7f33351dad1Mathieu ChartierGENERATE_ALL_ALLOC_ENTRYPOINTS
10423b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi
10435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
10441cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe     * Entry from managed code to resolve a string, this stub will allocate a String and deliver an
10455ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir Marko     * exception on error. On success the String is returned. A0 holds the string index. The fast
10465ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir Marko     * path check for hit in strings cache has already been performed.
10471cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe     */
10485ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir MarkoONE_ARG_DOWNCALL art_quick_resolve_string, artResolveStringFromCode, RETURN_IF_RESULT_IS_NON_ZERO_OR_DELIVER
10491cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe
10501cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe    /*
10511cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe     * Entry from managed code when uninitialized static storage, this stub will run the class
10521cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe     * initializer and deliver the exception on error. On success the static storage base is
10531cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe     * returned.
10541cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe     */
10555ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir MarkoONE_ARG_DOWNCALL art_quick_initialize_static_storage, artInitializeStaticStorageFromCode, RETURN_IF_RESULT_IS_NON_ZERO_OR_DELIVER
10561cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe
10571cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe    /*
10581cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe     * Entry from managed code when dex cache misses for a type_idx.
10591cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe     */
10605ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir MarkoONE_ARG_DOWNCALL art_quick_initialize_type, artInitializeTypeFromCode, RETURN_IF_RESULT_IS_NON_ZERO_OR_DELIVER
10611cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe
10621cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe    /*
10631cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe     * Entry from managed code when type_idx needs to be checked for access and dex cache may also
10641cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe     * miss.
10651cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe     */
10665ea536aa4a6414db01beaf6f8bd8cb9adc5cfc92Vladimir MarkoONE_ARG_DOWNCALL art_quick_initialize_type_and_verify_access, artInitializeTypeAndVerifyAccessFromCode, RETURN_IF_RESULT_IS_NON_ZERO_OR_DELIVER
10671cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe
10681cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe    /*
106957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * Called by managed code when the value in rSUSPEND has been decremented to 0.
10705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1071d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artTestSuspendFromCode
1072d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_test_suspend
1073474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers    lh     $a0, THREAD_FLAGS_OFFSET(rSELF)
10747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez   $a0, 1f
1075e34652f15f32666323052a6718a63248244f1e66Duane Sand    addiu  rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL   # reset rSUSPEND to SUSPEND_CHECK_INTERVAL
10768d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr   $zero, $ra
10775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    nop
10785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
10791d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME          # save callee saves for stack crawl
10801d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal    artTestSuspendFromCode              # (Thread*)
10817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    move   $a0, rSELF
10821d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
1083d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_test_suspend
10845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
10855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
10865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Called by managed code that is attempting to call a method on a proxy class. On entry
108757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers     * r0 holds the proxy method; r1, r2 and r3 may contain arguments.
10885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
10895fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    .extern artQuickProxyInvokeHandler
1090d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_proxy_invoke_handler
1091735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME_WITH_METHOD_IN_A0
1092735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    move    $a2, rSELF                  # pass Thread::Current
10935fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao    jal     artQuickProxyInvokeHandler  # (Method* proxy method, receiver, Thread*, SP)
1094735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu   $a3, $sp, ARG_SLOT_SIZE     # pass $sp (remove arg slots)
10957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
1096735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
10977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    bnez    $t0, 1f
1098e34652f15f32666323052a6718a63248244f1e66Duane Sand    # don't care if $v0 and/or $v1 are modified, when exception branch taken
1099e34652f15f32666323052a6718a63248244f1e66Duane Sand    MTD     $v0, $v1, $f0, $f1          # move float value to return value
11008d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr    $zero, $ra
1101e34652f15f32666323052a6718a63248244f1e66Duane Sand    nop
11025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1:
11035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    DELIVER_PENDING_EXCEPTION
1104d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_proxy_invoke_handler
11055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
110688474b416eb257078e590bf9bc7957cee604a186Jeff Hao    /*
110788474b416eb257078e590bf9bc7957cee604a186Jeff Hao     * Called to resolve an imt conflict. t0 is a hidden argument that holds the target method's
110888474b416eb257078e590bf9bc7957cee604a186Jeff Hao     * dex method index.
110988474b416eb257078e590bf9bc7957cee604a186Jeff Hao     */
111013738bf7c769638b7922cb2477471ad382632bc2Douglas LeungENTRY art_quick_imt_conflict_trampoline
111188474b416eb257078e590bf9bc7957cee604a186Jeff Hao    lw      $a0, 0($sp)            # load caller Method*
11121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw      $a0, MIRROR_ART_METHOD_DEX_CACHE_METHODS_OFFSET($a0)  # load dex_cache_resolved_methods
111388474b416eb257078e590bf9bc7957cee604a186Jeff Hao    sll     $t0, 2                 # convert target method offset to bytes
111488474b416eb257078e590bf9bc7957cee604a186Jeff Hao    add     $a0, $t0               # get address of target method
11151d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    lw      $a0, MIRROR_OBJECT_ARRAY_DATA_OFFSET($a0)  # load the target method
111688474b416eb257078e590bf9bc7957cee604a186Jeff Hao    la      $t9, art_quick_invoke_interface_trampoline
11178d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr    $zero, $t9
111888474b416eb257078e590bf9bc7957cee604a186Jeff HaoEND art_quick_imt_conflict_trampoline
111988474b416eb257078e590bf9bc7957cee604a186Jeff Hao
1120468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .extern artQuickResolutionTrampoline
1121468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolution_trampoline
11221d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME
1123735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    move    $a2, rSELF                    # pass Thread::Current
112465d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers    jal     artQuickResolutionTrampoline  # (Method* called, receiver, Thread*, SP)
1125735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu   $a3, $sp, ARG_SLOT_SIZE       # pass $sp (remove arg slots)
1126468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    beqz    $v0, 1f
1127735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw      $a0, ARG_SLOT_SIZE($sp)       # load resolved method to $a0
11281d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
112965d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers    move    $t9, $v0               # code pointer must be in $t9 to generate the global pointer
1130f96e8bdf47cfcbecd8ad8ebceb765e5a257ca143Douglas Leung    jalr    $zero, $t9             # tail call to method
11311984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier    nop
1132468532ea115657709bc32ee498e701a4c71762d4Ian Rogers1:
11331d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
1134468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    DELIVER_PENDING_EXCEPTION
1135468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolution_trampoline
1136468532ea115657709bc32ee498e701a4c71762d4Ian Rogers
1137735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .extern artQuickGenericJniTrampoline
1138735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .extern artQuickGenericJniEndTrampoline
1139735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas LeungENTRY art_quick_generic_jni_trampoline
1140735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME_WITH_METHOD_IN_A0
1141735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    move    $s8, $sp               # save $sp to $s8
1142735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    move    $s3, $gp               # save $gp to $s3
1143735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung
1144735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    # prepare for call to artQuickGenericJniTrampoline(Thread*, SP)
1145735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    move    $a0, rSELF                     # pass Thread::Current
1146735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu   $a1, $sp, ARG_SLOT_SIZE        # save $sp (remove arg slots)
1147735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    jal     artQuickGenericJniTrampoline   # (Thread*, SP)
1148735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu   $sp, $sp, -5120                # reserve space on the stack
1149735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung
1150735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    # The C call will have registered the complete save-frame on success.
1151735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    # The result of the call is:
1152735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    # v0: ptr to native code, 0 on error.
1153735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    # v1: ptr to the bottom of the used area of the alloca, can restore stack till here.
1154735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    beq     $v0, $zero, 1f         # check entry error
1155735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    move    $t9, $v0               # save the code ptr
1156735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    move    $sp, $v1               # release part of the alloca
1157735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung
1158735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    # Load parameters from stack into registers
1159735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw      $a0,   0($sp)
1160735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw      $a1,   4($sp)
1161735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw      $a2,   8($sp)
1162735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung
1163735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    # Load FPRs the same as GPRs. Look at BuildNativeCallFrameStateMachine.
1164735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    jalr    $t9                    # native call
1165735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw      $a3,  12($sp)
1166735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu   $sp, $sp, 16           # remove arg slots
1167735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung
1168735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    move    $gp, $s3               # restore $gp from $s3
1169735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung
1170735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    # result sign extension is handled in C code
1171735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    # prepare for call to artQuickGenericJniEndTrampoline(Thread*, result, result_f)
1172735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    move    $a0, rSELF             # pass Thread::Current
1173735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    move    $a2, $v0               # pass result
1174735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    move    $a3, $v1
1175735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu   $sp, $sp, -24          # reserve arg slots
1176735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    jal     artQuickGenericJniEndTrampoline
1177735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    s.d     $f0, 16($sp)           # pass result_f
1178735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung
1179735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
1180126d65952a03b3e44d5021208673c01920a982a4Nicolas Geoffray    bne     $t0, $zero, 1f         # check for pending exceptions
1181126d65952a03b3e44d5021208673c01920a982a4Nicolas Geoffray
1182735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    move    $sp, $s8               # tear down the alloca
1183735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung
1184735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    # tear dpown the callee-save frame
1185735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
1186735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung
1187e34652f15f32666323052a6718a63248244f1e66Duane Sand    MTD     $v0, $v1, $f0, $f1     # move float value to return value
11888d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr    $zero, $ra
1189e34652f15f32666323052a6718a63248244f1e66Duane Sand    nop
1190735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung
1191735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung1:
1192126d65952a03b3e44d5021208673c01920a982a4Nicolas Geoffray    lw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF)
1193126d65952a03b3e44d5021208673c01920a982a4Nicolas Geoffray    # This will create a new save-all frame, required by the runtime.
1194735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    DELIVER_PENDING_EXCEPTION
1195735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas LeungEND art_quick_generic_jni_trampoline
11962da882315a61072664f7ce3c212307342e907207Andreas Gampe
1197468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .extern artQuickToInterpreterBridge
1198468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_to_interpreter_bridge
11991d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME
1200735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    move    $a1, rSELF                          # pass Thread::Current
1201735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    jal     artQuickToInterpreterBridge         # (Method* method, Thread*, SP)
1202735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu   $a2, $sp, ARG_SLOT_SIZE             # pass $sp (remove arg slots)
12037db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    lw      $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_
1204735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
12057db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    bnez    $t0, 1f
1206e34652f15f32666323052a6718a63248244f1e66Duane Sand    # don't care if $v0 and/or $v1 are modified, when exception branch taken
1207e34652f15f32666323052a6718a63248244f1e66Duane Sand    MTD     $v0, $v1, $f0, $f1                  # move float value to return value
12088d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe    jalr    $zero, $ra
1209e34652f15f32666323052a6718a63248244f1e66Duane Sand    nop
12107db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers1:
12117db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    DELIVER_PENDING_EXCEPTION
1212468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_to_interpreter_bridge
12137db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers
12145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
1215725a957985171d712d5c048cc3d00ff14968784bjeffhao     * Routine that intercepts method calls and returns.
12165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
1217d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodEntryFromCode
1218d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artInstrumentationMethodExitFromCode
1219468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_instrumentation_entry
12201d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME
1221735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    sw       $a0, 28($sp)   # save arg0 in free arg slot
12221d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move     $a3, $ra       # pass $ra
12231d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal      artInstrumentationMethodEntryFromCode  # (Method*, Object*, Thread*, LR)
122462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, rSELF     # pass Thread::Current
12258161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    move     $t9, $v0       # $t9 holds reference to code
1226735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    lw       $a0, 28($sp)   # restore arg0 from free arg slot
12271d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME
12288161c0336b97e11e02c000af357f8f40de2e23e4jeffhao    jalr     $t9            # call method
122962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    nop
1230468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_entry
12315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* intentional fallthrough */
1232468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .global art_quick_instrumentation_exit
1233468532ea115657709bc32ee498e701a4c71762d4Ian Rogersart_quick_instrumentation_exit:
1234d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .cfi_startproc
123512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    addiu    $t9, $ra, 4    # put current address into $t9 to rebuild $gp
12361d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    .cpload  $t9
1237c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung    move     $ra, $zero     # link register is to here, so clobber with 0 for later checks
1238735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung
1239f96e8bdf47cfcbecd8ad8ebceb765e5a257ca143Douglas Leung    SETUP_REFS_ONLY_CALLEE_SAVE_FRAME
1240735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    addiu    $sp, $sp, -16  # allocate temp storage on the stack
1241735b8559d6dd26c610d4b97d72f25a092d9c8947Douglas Leung    .cfi_adjust_cfa_offset 16
1242f96e8bdf47cfcbecd8ad8ebceb765e5a257ca143Douglas Leung    sw       $v0, ARG_SLOT_SIZE+12($sp)
1243f96e8bdf47cfcbecd8ad8ebceb765e5a257ca143Douglas Leung    .cfi_rel_offset 2, ARG_SLOT_SIZE+12
1244f96e8bdf47cfcbecd8ad8ebceb765e5a257ca143Douglas Leung    sw       $v1, ARG_SLOT_SIZE+8($sp)
1245f96e8bdf47cfcbecd8ad8ebceb765e5a257ca143Douglas Leung    .cfi_rel_offset 3, ARG_SLOT_SIZE+8
1246f96e8bdf47cfcbecd8ad8ebceb765e5a257ca143Douglas Leung    s.d      $f0, ARG_SLOT_SIZE($sp)
1247e34652f15f32666323052a6718a63248244f1e66Duane Sand    s.d      $f0, 16($sp)   # pass fpr result
124862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a2, $v0       # pass gpr result
124962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    move     $a3, $v1
1250f96e8bdf47cfcbecd8ad8ebceb765e5a257ca143Douglas Leung    addiu    $a1, $sp, ARG_SLOT_SIZE+16   # pass $sp (remove arg slots and temp storage)
125162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    jal      artInstrumentationMethodExitFromCode  # (Thread*, SP, gpr_res, fpr_res)
125212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $a0, rSELF     # pass Thread::Current
1253f96e8bdf47cfcbecd8ad8ebceb765e5a257ca143Douglas Leung    move     $t9, $v0       # set aside returned link register
125412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    move     $ra, $v1       # set link register for deoptimization
1255f96e8bdf47cfcbecd8ad8ebceb765e5a257ca143Douglas Leung    lw       $v0, ARG_SLOT_SIZE+12($sp)   # restore return values
1256f96e8bdf47cfcbecd8ad8ebceb765e5a257ca143Douglas Leung    lw       $v1, ARG_SLOT_SIZE+8($sp)
1257f96e8bdf47cfcbecd8ad8ebceb765e5a257ca143Douglas Leung    l.d      $f0, ARG_SLOT_SIZE($sp)
1258f96e8bdf47cfcbecd8ad8ebceb765e5a257ca143Douglas Leung    jalr     $zero, $t9     # return
1259f96e8bdf47cfcbecd8ad8ebceb765e5a257ca143Douglas Leung    addiu    $sp, $sp, ARG_SLOT_SIZE+FRAME_SIZE_REFS_ONLY_CALLEE_SAVE+16  # restore stack
1260f96e8bdf47cfcbecd8ad8ebceb765e5a257ca143Douglas Leung    .cfi_adjust_cfa_offset -(ARG_SLOT_SIZE+FRAME_SIZE_REFS_ONLY_CALLEE_SAVE+16)
1261468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_exit
12625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
126312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao    /*
126462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization
126562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers     * will long jump to the upcall with a special exception of -1.
126612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao     */
1267d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao    .extern artDeoptimize
1268d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deoptimize
126914dd5a82ad85a28612bf86e755ff929d767cea4cJeff Hao    SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
12701d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    jal      artDeoptimize  # artDeoptimize(Thread*)
127112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao                            # Returns caller method's frame size.
12721d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers    move     $a0, rSELF     # pass Thread::current
1273d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deoptimize
127412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao
12755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
12765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
12775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
12785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
12795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
12805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
12817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
12827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
12837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
12845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
12851d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_shl_long
12865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* shl-long vAA, vBB, vCC */
12877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v0, $a0, $a2                    #  rlo<- alo << (shift&31)
12887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $v1, $a2                         #  rhi<- 31-shift  (shift is 5b)
12897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, 1
12907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $a0, $v1                         #  alo<- alo >> (32-(shift&31))
12917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $v1, $a1, $a2                    #  rhi<- ahi << (shift&31)
12927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift< shift & 0x20
1293e34652f15f32666323052a6718a63248244f1e66Duane Sand    beqz    $a2, 1f
1294e34652f15f32666323052a6718a63248244f1e66Duane Sand    or      $v1, $a0                         #  rhi<- rhi | alo
1295e34652f15f32666323052a6718a63248244f1e66Duane Sand
1296e34652f15f32666323052a6718a63248244f1e66Duane Sand    move    $v1, $v0                         #  rhi<- rlo (if shift&0x20)
1297e34652f15f32666323052a6718a63248244f1e66Duane Sand    move    $v0, $zero                       #  rlo<- 0 (if shift&0x20)
1298e34652f15f32666323052a6718a63248244f1e66Duane Sand
12998d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe1:  jalr    $zero, $ra
1300e34652f15f32666323052a6718a63248244f1e66Duane Sand    nop
1301d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shl_long
13025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
13035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
13045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
13055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
13065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
13075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
13085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
13097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a0: low word
13107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a1: high word
13117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao     *   $a2: shift count
13125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
13131d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_shr_long
13147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
13157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
13167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sra     $a3, $a1, 31                     #  $a3<- sign(ah)
13177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
13187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
13197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
13207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
1321475cfd8ff9dcc73d1a7502c9310efe0f1a30337fDouglas Leung    beqz    $a2, 1f
1322e34652f15f32666323052a6718a63248244f1e66Duane Sand    or      $v0, $a1                         #  rlo<- rlo | ahi
1323e34652f15f32666323052a6718a63248244f1e66Duane Sand
1324e34652f15f32666323052a6718a63248244f1e66Duane Sand    move    $v0, $v1                         #  rlo<- rhi (if shift&0x20)
1325e34652f15f32666323052a6718a63248244f1e66Duane Sand    move    $v1, $a3                         #  rhi<- sign(ahi) (if shift&0x20)
1326e34652f15f32666323052a6718a63248244f1e66Duane Sand
13278d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe1:  jalr    $zero, $ra
1328e34652f15f32666323052a6718a63248244f1e66Duane Sand    nop
1329d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shr_long
13305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee
13315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /*
13325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * Long integer shift.  This is different from the generic 32/64-bit
13335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * binary operations because vAA/vBB are 64-bit but vCC (the shift
13345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
13355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * 6 bits.
13365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     * On entry:
13375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r0: low word
13385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r1: high word
13395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     *   r2: shift count
13405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee     */
13415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee    /* ushr-long vAA, vBB, vCC */
13421d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_ushr_long
1343fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao    srl     $v1, $a1, $a2                    #  rhi<- ahi >> (shift&31)
13447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    srl     $v0, $a0, $a2                    #  rlo<- alo >> (shift&31)
13457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    not     $a0, $a2                         #  alo<- 31-shift (shift is 5b)
13467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, 1
13477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    sll     $a1, $a0                         #  ahi<- ahi << (32-(shift&31))
13487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao    andi    $a2, 0x20                        #  shift & 0x20
1349e34652f15f32666323052a6718a63248244f1e66Duane Sand    beqz    $a2, 1f
1350e34652f15f32666323052a6718a63248244f1e66Duane Sand    or      $v0, $a1                         #  rlo<- rlo | ahi
1351e34652f15f32666323052a6718a63248244f1e66Duane Sand
1352e34652f15f32666323052a6718a63248244f1e66Duane Sand    move    $v0, $v1                         #  rlo<- rhi (if shift&0x20)
1353e34652f15f32666323052a6718a63248244f1e66Duane Sand    move    $v1, $zero                       #  rhi<- 0 (if shift&0x20)
1354e34652f15f32666323052a6718a63248244f1e66Duane Sand
13558d36591d93920e7b7830c3ffee3759b561f5339eAndreas Gampe1:  jalr    $zero, $ra
1356e34652f15f32666323052a6718a63248244f1e66Duane Sand    nop
1357d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_ushr_long
13587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao
13591d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersUNIMPLEMENTED art_quick_indexof
13601d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersUNIMPLEMENTED art_quick_string_compareto
1361