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