quick_entrypoints_mips.S revision 2d7210188805292e463be4bcf7a133b654d7e0ea
10f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes/* 20f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Copyright (C) 2012 The Android Open Source Project 30f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * 40f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 50f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * you may not use this file except in compliance with the License. 60f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * You may obtain a copy of the License at 70f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * 80f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 90f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * 100f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Unless required by applicable law or agreed to in writing, software 110f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 120f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * See the License for the specific language governing permissions and 140f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * limitations under the License. 150f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes */ 160f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes 177655f29fabc0a12765de828914a18314382e5a35Ian Rogers#include "asm_support_mips.S" 185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 197410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier#include "arch/quick_alloc_entrypoints.S" 207410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier 210703060875166106af3d490c6c264611aea67ec8jeffhao .set noreorder 225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .balign 4 235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* Deliver the given exception */ 255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artDeliverExceptionFromCode 265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* Deliver an exception pending on a thread */ 278161c0336b97e11e02c000af357f8f40de2e23e4jeffhao .extern artDeliverPendingExceptionFromCode 285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kSaveAll) 321d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers * Callee-save: $s0-$s8 + $gp + $ra, 11 total + 1 word padding + 4 open words for args 331d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers * Clobbers $t0 and $gp 345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 3557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.macro SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 36fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao addiu $sp, $sp, -64 37d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset 64 385c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 395c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe // Ugly compile-time check, but we only have the preprocessor. 405c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_SAVE_ALL_CALLEE_SAVE != 64) 415c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "SAVE_ALL_CALLEE_SAVE_FRAME(MIPS) size not as expected." 425c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif 435c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 44fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $ra, 60($sp) 45d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 31, 60 46fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $s8, 56($sp) 47d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 30, 56 481f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $gp, 52($sp) 491f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 28, 52 501f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s7, 48($sp) 511f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 23, 48 521f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s6, 44($sp) 531f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 22, 44 541f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s5, 40($sp) 551f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 21, 40 561f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s4, 36($sp) 571f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 20, 36 581f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s3, 32($sp) 591f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 19, 32 601f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s2, 28($sp) 611f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 18, 28 621f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s1, 24($sp) 631f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 17, 24 641f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s0, 20($sp) 651f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 16, 20 661f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao # 1 word for alignment, 4 open words for args $a0-$a3, bottom will hold Method* 671d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers 684af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung lw $t0, %got(_ZN3art7Runtime9instance_E)($gp) 694af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung lw $t0, 0($t0) 701d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers THIS_LOAD_REQUIRES_READ_BARRIER 714af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung lw $t0, RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET($t0) 721d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $t0, 0($sp) # Place Method* at bottom of stack. 731d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF) # Place sp in Thread::Current()->top_quick_frame. 745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC. 795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Does not include rSUSPEND or rSELF 801f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao * callee-save: $s2-$s8 + $gp + $ra, 9 total + 3 words padding + 4 open words for args 815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 821d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro SETUP_REFS_ONLY_CALLEE_SAVE_FRAME 834eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, -64 84d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset 64 855c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 865c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe // Ugly compile-time check, but we only have the preprocessor. 875c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_REFS_ONLY_CALLEE_SAVE != 64) 885c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "REFS_ONLY_CALLEE_SAVE_FRAME(MIPS) size not as expected." 895c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif 905c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 914eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $ra, 60($sp) 92d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 31, 60 934eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $s8, 56($sp) 94d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 30, 56 951f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $gp, 52($sp) 961f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 28, 52 971f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s7, 48($sp) 981f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 23, 48 991f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s6, 44($sp) 1001f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 22, 44 1011f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s5, 40($sp) 1021f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 21, 40 1031f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s4, 36($sp) 1041f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 20, 36 1051f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s3, 32($sp) 1061f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 19, 32 1071f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s2, 28($sp) 1081f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 18, 28 109fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao # 3 words for alignment and extra args, 4 open words for args $a0-$a3, bottom will hold Method* 1101d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers 1114af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung lw $t0, %got(_ZN3art7Runtime9instance_E)($gp) 1124af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung lw $t0, 0($t0) 1131d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers THIS_LOAD_REQUIRES_READ_BARRIER 1144af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung lw $t0, RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET($t0) 1151d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $t0, 0($sp) # Place Method* at bottom of stack. 1161d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF) # Place sp in Thread::Current()->top_quick_frame. 1175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1191d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME 1204eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $ra, 60($sp) 121bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 1222a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s8, 56($sp) 123bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 1242a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $gp, 52($sp) 125bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 28 1262a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s7, 48($sp) 127bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 23 1282a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s6, 44($sp) 129bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 22 1302a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s5, 40($sp) 131bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 21 1322a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s4, 36($sp) 133bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 20 1342a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s3, 32($sp) 135bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 19 1362a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s2, 28($sp) 137bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 18 1384eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, 64 139d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -64 1405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1421d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 1434eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $ra, 60($sp) 144bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 1452a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s8, 56($sp) 146bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 1472a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $gp, 52($sp) 148bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 28 1492a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s7, 48($sp) 150bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 23 1512a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s6, 44($sp) 152bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 22 1532a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s5, 40($sp) 154bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 21 1552a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s4, 36($sp) 156bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 20 1572a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s3, 32($sp) 158bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 19 1592a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s2, 28($sp) 160bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 18 1617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1624eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, 64 163d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -64 1645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 1685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC. 1691f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao * callee-save: $a1-$a3, $s2-$s8 + $gp + $ra, 12 total + 3 words padding + method* 1705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1711d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME 1721f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao addiu $sp, $sp, -64 1731f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_adjust_cfa_offset 64 1745c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 1755c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe // Ugly compile-time check, but we only have the preprocessor. 1765c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE != 64) 1775c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "REFS_AND_ARGS_CALLEE_SAVE_FRAME(MIPS) size not as expected." 1785c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif 1795c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 1801f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $ra, 60($sp) 1811f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 31, 60 1821f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s8, 56($sp) 1831f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 30, 56 1841f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $gp, 52($sp) 1851f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 28, 52 1861f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s7, 48($sp) 1871f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 23, 48 1881f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s6, 44($sp) 1891f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 22, 44 1901f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s5, 40($sp) 1911f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 21, 40 1921f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s4, 36($sp) 1931f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 20, 36 1941f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s3, 32($sp) 1951f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 19, 32 1961f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s2, 28($sp) 1971f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 18, 28 1987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a3, 12($sp) 199d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 7, 12 2007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a2, 8($sp) 201d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 6, 8 2027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a1, 4($sp) 203d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 5, 4 204fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao # bottom will hold Method* 2051d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers 2064af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung lw $t0, %got(_ZN3art7Runtime9instance_E)($gp) 2074af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung lw $t0, 0($t0) 2081d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers THIS_LOAD_REQUIRES_READ_BARRIER 2094af77b7636fe98aae443b46a241fd9a29f16e291Douglas Leung lw $t0, RUNTIME_REFS_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET($t0) 2101d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $t0, 0($sp) # Place Method* at bottom of stack. 2111d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF) # Place sp in Thread::Current()->top_quick_frame. 2125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2141d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME 2152a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $ra, 60($sp) 216bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 2172a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s8, 56($sp) 218bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 2192a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $gp, 52($sp) 220bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 28 2212a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s7, 48($sp) 222bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 23 2232a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s6, 44($sp) 224bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 22 2252a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s5, 40($sp) 226bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 21 2272a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s4, 36($sp) 228bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 20 2292a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s3, 32($sp) 230bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 19 2312a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s2, 28($sp) 232bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 18 2332a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $a3, 12($sp) 234bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 7 2352a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $a2, 8($sp) 236bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 6 2372a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $a1, 4($sp) 238bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 5 239468532ea115657709bc32ee498e701a4c71762d4Ian Rogers addiu $sp, $sp, 64 # pop frame 2401f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_adjust_cfa_offset -64 2415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending 2455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * exception is Thread::Current()->exception_ 2465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 2475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro DELIVER_PENDING_EXCEPTION 2488161c0336b97e11e02c000af357f8f40de2e23e4jeffhao SETUP_SAVE_ALL_CALLEE_SAVE_FRAME # save callee saves for throw 2498161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artDeliverPendingExceptionFromCode 2501d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artDeliverPendingExceptionFromCode(Thread*) 2511d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a0, rSELF # pass Thread::Current 2525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NO_EXCEPTION 2557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 2561d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME 2578161c0336b97e11e02c000af357f8f40de2e23e4jeffhao bnez $t0, 1f # success if no exception is pending 2585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 2605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 2625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 2635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_ZERO 2661d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME 2677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $v0, 1f # success? 2685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return on success 2705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 2725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 2735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 275cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro RETURN_IF_RESULT_IS_NON_ZERO 2761d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME 2777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao beqz $v0, 1f # success? 2785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return on success 2805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 2825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 2835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * On entry $a0 is uint32_t* gprs_ and $a1 is uint32_t* fprs_ 2875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * FIXME: just guessing about the shape of the jmpbuf. Where will pc be? 2885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 289d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_do_long_jump 2907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f0, 0($a1) 2917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f1, 4($a1) 2927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f2, 8($a1) 2937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f3, 12($a1) 2947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f4, 16($a1) 2957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f5, 20($a1) 2967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f6, 24($a1) 2977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f7, 28($a1) 2987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f8, 32($a1) 2997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f9, 36($a1) 3007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f10, 40($a1) 3017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f11, 44($a1) 3027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f12, 48($a1) 3037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f13, 52($a1) 3047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f14, 56($a1) 3057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f15, 60($a1) 3067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f16, 64($a1) 3077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f17, 68($a1) 3087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f18, 72($a1) 3097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f19, 76($a1) 3107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f20, 80($a1) 3117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f21, 84($a1) 3127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f22, 88($a1) 3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f23, 92($a1) 3147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f24, 96($a1) 3157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f25, 100($a1) 3167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f26, 104($a1) 3177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f27, 108($a1) 3187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f28, 112($a1) 3197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f29, 116($a1) 3207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f30, 120($a1) 3217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f31, 124($a1) 322748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman .set push 323748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman .set nomacro 324748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman .set noat 3257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $at, 4($a0) 326748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman .set pop 3277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v0, 8($a0) 3287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v1, 12($a0) 3297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 20($a0) 3307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 24($a0) 3317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a3, 28($a0) 3327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, 32($a0) 3337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t1, 36($a0) 3347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t2, 40($a0) 3357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t3, 44($a0) 3367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t4, 48($a0) 3377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t5, 52($a0) 3387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t6, 56($a0) 3397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t7, 60($a0) 3407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s0, 64($a0) 3417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s1, 68($a0) 3427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s2, 72($a0) 3437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s3, 76($a0) 3447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s4, 80($a0) 3457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s5, 84($a0) 3467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s6, 88($a0) 3477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s7, 92($a0) 3487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t8, 96($a0) 3497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t9, 100($a0) 3507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $gp, 112($a0) 3517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $sp, 116($a0) 3527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $fp, 120($a0) 3537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $ra, 124($a0) 3547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a0, 16($a0) 3557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v0, $zero # clear result registers r0 and r1 3567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # do long jump 3577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v1, $zero 358d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_do_long_jump 3595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code, saves most registers (forms basis of long jump context) and passes 3625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at 3635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the thread. On entry r0 holds Throwable* 3645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 365468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_deliver_exception 36657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3678161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artDeliverExceptionFromCode 3681d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artDeliverExceptionFromCode(Throwable*, Thread*) 3691d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a1, rSELF # pass Thread::Current 370468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_deliver_exception 3715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver a NullPointerException 3745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 375d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowNullPointerExceptionFromCode 376468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_null_pointer_exception 37757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3788161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowNullPointerExceptionFromCode 3791d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artThrowNullPointerExceptionFromCode(Thread*) 3801d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a0, rSELF # pass Thread::Current 381468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_null_pointer_exception 3825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArithmeticException 3855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 386d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowDivZeroFromCode 387468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_div_zero 38857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3898161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowDivZeroFromCode 3901d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artThrowDivZeroFromCode(Thread*) 3911d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a0, rSELF # pass Thread::Current 392468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_div_zero 3935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException 3965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 397d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowArrayBoundsFromCode 398468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_array_bounds 39957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 4008161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowArrayBoundsFromCode 4011d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artThrowArrayBoundsFromCode(index, limit, Thread*) 4021d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 403468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_array_bounds 4045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 40557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 40657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a StackOverflowError. 40757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 408d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowStackOverflowFromCode 409468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_stack_overflow 41057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 4118161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowStackOverflowFromCode 4121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artThrowStackOverflowFromCode(Thread*) 4131d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a0, rSELF # pass Thread::Current 414468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_stack_overflow 4155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 41657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 41757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a NoSuchMethodError. 41857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 419d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowNoSuchMethodFromCode 420468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_no_such_method 42157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 4228161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowNoSuchMethodFromCode 4231d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artThrowNoSuchMethodFromCode(method_idx, Thread*) 4241d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a1, rSELF # pass Thread::Current 425468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_no_such_method 4265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 4285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * All generated callsites for interface invokes and invocation slow paths will load arguments 4297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain 4305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the method_idx. This wrapper will save arg1-arg3, load the caller's Method*, align the 4315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * stack and call the appropriate C helper. 4327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1. 4335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 4347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting 4357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * of the target Method* in $v0 and method->code_ in $v1. 4365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 437fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao * If unsuccessful, the helper will return NULL/NULL. There will be a pending exception in the 4385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * thread and we branch to another stub to deliver it. 4395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 4405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On success this wrapper will restore arguments and *jump* to the target, leaving the lr 4415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * pointing back to the original caller. 4425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 4435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name 4445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern \cxx_name 445d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY \c_name 4461d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME # save callee saves in case allocation triggers GC 4471d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE($sp) # pass caller Method* 448fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $t0, $sp # save $sp 44958df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, -32 # make space for extra args 45058df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset 32 4517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 452d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 28, 12 4537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal \cxx_name # (method_idx, this, caller, Thread*, $sp) 454fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $t0, 16($sp) # pass $sp 45558df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, 32 # release out args 45658df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset -32 457fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $a0, $v0 # save target Method* 45830a3317577d84feafa859b3e39d1545a995f0b7cjeffhao move $t9, $v1 # save $v0->code_ 4591d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME 460fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao beqz $v0, 1f 4615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 46230a3317577d84feafa859b3e39d1545a995f0b7cjeffhao jr $t9 4635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 4645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 4655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 466d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND \c_name 4675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 4685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4698dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline 4708dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck 4715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4728dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck 4738dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck 4748dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck 4758dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck 4765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 47779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao /* 478ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Invocation stub for quick code. 4795d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * On entry: 4805d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a0 = method pointer 4815d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a1 = argument array or NULL for no argument methods 4825d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a2 = size of argument array in bytes 4835d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a3 = (managed) thread pointer 4846474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao * [sp + 16] = JValue* result 4850177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers * [sp + 20] = shorty 4865d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao */ 4875d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoENTRY art_quick_invoke_stub 4885d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $a0, 0($sp) # save out a0 4895d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, -16 # spill s0, s1, fp, ra 4905d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_adjust_cfa_offset 16 4915d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $ra, 12($sp) 4925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 31, 12 4935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $fp, 8($sp) 4945d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 30, 8 4955d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $s1, 4($sp) 4965d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 17, 4 4975d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $s0, 0($sp) 4985d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 16, 0 4995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $fp, $sp # save sp in fp 5005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_def_cfa_register 30 5015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $s1, $a3 # move managed thread pointer into s1 5025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $s0, $zero, SUSPEND_CHECK_INTERVAL # reset s0 to suspend check interval 5035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $t0, $a2, 16 # create space for method pointer in frame 504b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung srl $t0, $t0, 4 # shift the frame size right 4 505b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung sll $t0, $t0, 4 # shift the frame size left 4 to align to 16 bytes 5065d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao subu $sp, $sp, $t0 # reserve stack space for argument array 5075d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $a0, $sp, 4 # pass stack pointer + method ptr as dest for memcpy 5085d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jal memcpy # (dest, src, bytes) 5095d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, -16 # make space for argument slots for memcpy 5105d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, 16 # restore stack after memcpy 5115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a0, 16($fp) # restore method* 5125d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a1, 4($sp) # copy arg value for a1 5135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a2, 8($sp) # copy arg value for a2 5145d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a3, 12($sp) # copy arg value for a3 5152d7210188805292e463be4bcf7a133b654d7e0eaMathieu Chartier lw $t9, MIRROR_ART_METHOD_QUICK_CODE_OFFSET_32($a0) # get pointer to the code 5165d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jalr $t9 # call the method 5175d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $zero, 0($sp) # store NULL for method* at bottom of frame 5185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $sp, $fp # restore the stack 5195d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $s0, 0($sp) 520bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 16 5215d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $s1, 4($sp) 522bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 17 5235d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $fp, 8($sp) 524bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 5255d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $ra, 12($sp) 526bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 5275d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, 16 5285d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_adjust_cfa_offset -16 5295d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $t0, 16($sp) # get result pointer 5300177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers lw $t1, 20($sp) # get shorty 5310177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers lb $t1, 0($t1) # get result type char 5326474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao li $t2, 68 # put char 'D' into t2 5336474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao beq $t1, $t2, 1f # branch if result type char == 'D' 5346474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao li $t3, 70 # put char 'F' into t3 5356474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao beq $t1, $t3, 1f # branch if result type char == 'F' 5365d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $v0, 0($t0) # store the result 5376474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao jr $ra 5385d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $v1, 4($t0) # store the other half of the result 5396474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao1: 54019ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao s.s $f0, 0($t0) # store floating point result 5415d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jr $ra 54219ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao s.s $f1, 4($t0) # store other half of floating point result 5435d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoEND art_quick_invoke_stub 5445d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao 5455d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao /* 5465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on 5475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * failure. 5485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 549d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artHandleFillArrayDataFromCode 550468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_handle_fill_data 5511d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 5521d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 5531d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artHandleFillArrayDataFromCode # (payload offset, Array*, method, Thread*) 554832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers move $a3, rSELF # pass Thread::Current 555fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao RETURN_IF_ZERO 556468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_handle_fill_data 5575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 55957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code that calls artLockObjectFromCode, may block for GC. 5605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 561d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artLockObjectFromCode 562468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_lock_object 56386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $a0, .Lart_quick_throw_null_pointer_exception_gp_set 564a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 5651d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case we block 5661d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artLockObjectFromCode # (Object* obj, Thread*) 5677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 5686bcd163d322b867578fbcfe60e4e3b247c42974bIan Rogers RETURN_IF_ZERO 569468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_lock_object 5705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 5725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure. 5735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 574d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artUnlockObjectFromCode 575468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_unlock_object 57686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $a0, .Lart_quick_throw_null_pointer_exception_gp_set 577a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 5781d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 5791d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artUnlockObjectFromCode # (Object* obj, Thread*) 5807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 5815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 582468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_unlock_object 5835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 5855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure. 5865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 587a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .extern artThrowClassCastException 588468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_cast 589a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, -16 590a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset 16 591a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $ra, 12($sp) 592a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_rel_offset 31, 12 593a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $t9, 8($sp) 594a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a1, 4($sp) 595a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a0, 0($sp) 596a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jal artIsAssignableFromCode 597a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 59886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $v0, .Lthrow_class_cast_exception 599a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $ra, 12($sp) 600a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $ra 601a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, 16 602a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset -16 60386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lthrow_class_cast_exception: 604a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t9, 8($sp) 605a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a1, 4($sp) 606a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a0, 0($sp) 607a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, 16 608a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset -16 609a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 610a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers la $t9, artThrowClassCastException 6111d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artThrowClassCastException (Class*, Class*, Thread*) 6121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 613468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_cast 6145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 616a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers * Entry from managed code for array put operations of objects where the value being stored 617a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers * needs to be checked for compatibility. 618a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers * a0 = array, a1 = index, a2 = value 6195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 620a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_null_and_bound_check 62186bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bnez $a0, .Lart_quick_aput_obj_with_bound_check_gp_set 622a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 62386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers b .Lart_quick_throw_null_pointer_exception_gp_set 624a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 625a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_null_and_bound_check 626a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers 627a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_bound_check 6281d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $t0, MIRROR_ARRAY_LENGTH_OFFSET($a0) 629a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sltu $t1, $a1, $t0 63086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bnez $t1, .Lart_quick_aput_obj_gp_set 631a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 632a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a0, $a1 63386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers b .Lart_quick_throw_array_bounds_gp_set 634a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a1, $t0 635a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_bound_check 636a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers 637a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj 63886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $a2, .Ldo_aput_null 639a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 6401d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $t0, MIRROR_OBJECT_CLASS_OFFSET($a0) 6411d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $t1, MIRROR_OBJECT_CLASS_OFFSET($a2) 6421d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $t0, MIRROR_CLASS_COMPONENT_TYPE_OFFSET($t0) 64386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bne $t1, $t0, .Lcheck_assignability # value's type == array's component type - trivial assignability 644a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 64586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput: 646a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sll $a1, $a1, 2 647a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $t0, $a0, $a1 6481d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $a2, MIRROR_OBJECT_ARRAY_DATA_OFFSET($t0) 649a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t0, THREAD_CARD_TABLE_OFFSET(rSELF) 650a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers srl $t1, $a0, 7 651a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $t1, $t1, $t0 652a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sb $t0, ($t1) 653a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $ra 654a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 65586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput_null: 656a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sll $a1, $a1, 2 657a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $t0, $a0, $a1 6581d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $a2, MIRROR_OBJECT_ARRAY_DATA_OFFSET($t0) 659a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $ra 660a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 66186bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lcheck_assignability: 662a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, -32 663a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset 32 664a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $ra, 28($sp) 665a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_rel_offset 31, 28 666a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $t9, 12($sp) 667a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a2, 8($sp) 668a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a1, 4($sp) 669a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a0, 0($sp) 670a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a1, $t1 671a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a0, $t0 672a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jal artIsAssignableFromCode # (Class*, Class*) 673a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 674a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $ra, 28($sp) 675a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t9, 12($sp) 676a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a2, 8($sp) 677a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a1, 4($sp) 678a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a0, 0($sp) 679a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $sp, 32 680a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset -32 68186bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bnez $v0, .Ldo_aput 682a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 683a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 684a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a1, $a2 685a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers la $t9, artThrowArrayStoreException 6861d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artThrowArrayStoreException(Class*, Class*, Thread*) 6871d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 688a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj 6895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 6915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when uninitialized static storage, this stub will run the class 6925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * initializer and deliver the exception on error. On success the static storage base is 6935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * returned. 6945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 695d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeStaticStorageFromCode 696468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_static_storage 6971d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6981d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*) 6995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeStaticStorageFromCode 7001d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 701cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 702468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_static_storage 7035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 70557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code when dex cache misses for a type_idx. 7065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 707d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeTypeFromCode 708468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type 7091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7101d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*) 7115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeFromCode 7121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 713cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 714468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type 7155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 7175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when type_idx needs to be checked for access and dex cache may also 71857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * miss. 7195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 720d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeTypeAndVerifyAccessFromCode 721468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type_and_verify_access 7221d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7231d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*) 7245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeAndVerifyAccessFromCode 7251d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 726cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 727468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type_and_verify_access 72837f05ef45e0393de812d51261dc293240c17294dFred Shih /* 72937f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve a static field and load a boolean primitive value. 73037f05ef45e0393de812d51261dc293240c17294dFred Shih */ 73137f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetBooleanStaticFromCode 73237f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_boolean_static 7331d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7341d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 7351d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetBooleanStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*) 73637f05ef45e0393de812d51261dc293240c17294dFred Shih move $a2, rSELF # pass Thread::Current 73737f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 73837f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_boolean_static 73937f05ef45e0393de812d51261dc293240c17294dFred Shih /* 74037f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve a static field and load a byte primitive value. 74137f05ef45e0393de812d51261dc293240c17294dFred Shih */ 74237f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetByteStaticFromCode 74337f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_byte_static 7441d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7451d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 7461d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetByteStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*) 74737f05ef45e0393de812d51261dc293240c17294dFred Shih move $a2, rSELF # pass Thread::Current 74837f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 74937f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_byte_static 75037f05ef45e0393de812d51261dc293240c17294dFred Shih 75137f05ef45e0393de812d51261dc293240c17294dFred Shih /* 75237f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve a static field and load a char primitive value. 75337f05ef45e0393de812d51261dc293240c17294dFred Shih */ 75437f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetCharStaticFromCode 75537f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_char_static 7561d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7571d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 7581d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetCharStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*) 75937f05ef45e0393de812d51261dc293240c17294dFred Shih move $a2, rSELF # pass Thread::Current 76037f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 76137f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_char_static 76237f05ef45e0393de812d51261dc293240c17294dFred Shih /* 76337f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve a static field and load a short primitive value. 76437f05ef45e0393de812d51261dc293240c17294dFred Shih */ 76537f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetShortStaticFromCode 76637f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_short_static 7671d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7681d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 7691d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetShortStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*) 77037f05ef45e0393de812d51261dc293240c17294dFred Shih move $a2, rSELF # pass Thread::Current 77137f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 77237f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_short_static 7735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 77557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 32-bit primitive value. 7765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 777d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet32StaticFromCode 778468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_static 7791d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7801d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 7811d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGet32StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*) 7827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 784468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_static 7855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 78757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 64-bit primitive value. 7885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 789d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet64StaticFromCode 790468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_static 7911d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7921d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 7931d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGet64StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*) 7947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 796468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_static 7975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 79957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load an object reference. 8005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 801d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGetObjStaticFromCode 802468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_static 8031d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8041d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8051d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetObjStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*) 8067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 8075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 808468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_static 8095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 81137f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve an instance field and load a boolean primitive value. 81237f05ef45e0393de812d51261dc293240c17294dFred Shih */ 81337f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetBooleanInstanceFromCode 81437f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_boolean_instance 8151d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8161d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8171d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetBooleanInstanceFromCode # (field_idx, Object*, referrer, Thread*) 81837f05ef45e0393de812d51261dc293240c17294dFred Shih move $a3, rSELF # pass Thread::Current 81937f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 82037f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_boolean_instance 82137f05ef45e0393de812d51261dc293240c17294dFred Shih /* 82237f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve an instance field and load a byte primitive value. 82337f05ef45e0393de812d51261dc293240c17294dFred Shih */ 82437f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetByteInstanceFromCode 82537f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_byte_instance 8261d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8271d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8281d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetByteInstanceFromCode # (field_idx, Object*, referrer, Thread*) 82937f05ef45e0393de812d51261dc293240c17294dFred Shih move $a3, rSELF # pass Thread::Current 83037f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 83137f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_byte_instance 83237f05ef45e0393de812d51261dc293240c17294dFred Shih 83337f05ef45e0393de812d51261dc293240c17294dFred Shih /* 83437f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve an instance field and load a char primitive value. 83537f05ef45e0393de812d51261dc293240c17294dFred Shih */ 83637f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetCharInstanceFromCode 83737f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_char_instance 8381d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8391d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8401d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetCharInstanceFromCode # (field_idx, Object*, referrer, Thread*) 84137f05ef45e0393de812d51261dc293240c17294dFred Shih move $a3, rSELF # pass Thread::Current 84237f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 84337f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_char_instance 84437f05ef45e0393de812d51261dc293240c17294dFred Shih /* 84537f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve an instance field and load a short primitive value. 84637f05ef45e0393de812d51261dc293240c17294dFred Shih */ 84737f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetShortInstanceFromCode 84837f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_short_instance 8491d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8501d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8511d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetShortInstanceFromCode # (field_idx, Object*, referrer, Thread*) 85237f05ef45e0393de812d51261dc293240c17294dFred Shih move $a3, rSELF # pass Thread::Current 85337f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 85437f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_short_instance 85537f05ef45e0393de812d51261dc293240c17294dFred Shih 85637f05ef45e0393de812d51261dc293240c17294dFred Shih /* 85757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 32-bit primitive value. 8585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 859d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet32InstanceFromCode 860468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_instance 8611d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8621d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 864fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet32InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 8654eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 867468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_instance 8685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 87057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 64-bit primitive value. 8715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 872d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet64InstanceFromCode 873468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_instance 8741d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8751d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 877fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet64InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 8784eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 880468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_instance 8815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 88357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load an object reference. 8845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 885d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGetObjInstanceFromCode 886468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_instance 8871d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8881d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8891d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetObjInstanceFromCode # (field_idx, Object*, referrer, Thread*) 8907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 8915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 892468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_instance 8935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 89537f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve a static field and store a 8-bit primitive value. 89637f05ef45e0393de812d51261dc293240c17294dFred Shih */ 89737f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artSet8StaticFromCode 89837f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set8_static 8991d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9001d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 9011d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSet8StaticFromCode # (field_idx, new_val, referrer, Thread*) 90237f05ef45e0393de812d51261dc293240c17294dFred Shih move $a3, rSELF # pass Thread::Current 90337f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_ZERO 90437f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set8_static 90537f05ef45e0393de812d51261dc293240c17294dFred Shih 90637f05ef45e0393de812d51261dc293240c17294dFred Shih /* 90737f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve a static field and store a 16-bit primitive value. 90837f05ef45e0393de812d51261dc293240c17294dFred Shih */ 90937f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artSet16StaticFromCode 91037f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set16_static 9111d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 91337f05ef45e0393de812d51261dc293240c17294dFred Shih jal artSet16StaticFromCode # (field_idx, new_val, referrer, Thread*, $sp) 9141d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a3, rSELF # pass Thread::Current 91537f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_ZERO 91637f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set16_static 91737f05ef45e0393de812d51261dc293240c17294dFred Shih 91837f05ef45e0393de812d51261dc293240c17294dFred Shih /* 91957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 32-bit primitive value. 9205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 921d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32StaticFromCode 922468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_static 9231d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9241d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 9251d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSet32StaticFromCode # (field_idx, new_val, referrer, Thread*) 9267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 9275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 928468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_static 9295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 93157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 64-bit primitive value. 9325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 93337f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artSet64StaticFromCode 934468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_static 9351d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9361d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 9371d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSet64StaticFromCode # (field_idx, referrer, new_val, Thread*) 938fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 9395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 940468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_static 9415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 94357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store an object reference. 9445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 945d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSetObjStaticFromCode 946468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_static 9471d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9481d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 9491d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSetObjStaticFromCode # (field_idx, new_val, referrer, Thread*) 9507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 9515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 952468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_static 9535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 95537f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve an instance field and store a 8-bit primitive value. 95637f05ef45e0393de812d51261dc293240c17294dFred Shih */ 95737f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artSet8InstanceFromCode 95837f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set8_instance 9591d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9601d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 9611d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSet8InstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*) 96237f05ef45e0393de812d51261dc293240c17294dFred Shih sw rSELF, 16($sp) # pass Thread::Current 96337f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_ZERO 96437f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set8_instance 96537f05ef45e0393de812d51261dc293240c17294dFred Shih 96637f05ef45e0393de812d51261dc293240c17294dFred Shih /* 96737f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve an instance field and store a 16-bit primitive value. 96837f05ef45e0393de812d51261dc293240c17294dFred Shih */ 96937f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artSet16InstanceFromCode 97037f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set16_instance 9711d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9721d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 9731d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSet16InstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*) 97437f05ef45e0393de812d51261dc293240c17294dFred Shih sw rSELF, 16($sp) # pass Thread::Current 97537f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_ZERO 97637f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set16_instance 97737f05ef45e0393de812d51261dc293240c17294dFred Shih 97837f05ef45e0393de812d51261dc293240c17294dFred Shih /* 97957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 32-bit primitive value. 9805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 981d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32InstanceFromCode 982468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_instance 9831d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9841d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 9851d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSet32InstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*) 986fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 9875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 988468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_instance 9895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 99157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 64-bit primitive value. 9925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 99337f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artSet64InstanceFromCode 994468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_instance 9951d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9961d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $t0, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # load referrer's Method* 9971d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw rSELF, 20($sp) # pass Thread::Current 9981d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSet64InstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*) 9991d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $t0, 16($sp) # pass referrer's Method* 10005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 1001468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_instance 10025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 10035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 100457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store an object reference. 10055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1006d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSetObjInstanceFromCode 1007468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_instance 10081d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 10091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 10101d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSetObjInstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*) 1011fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 10125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 1013468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_instance 10145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 10155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 10165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code to resolve a string, this stub will allocate a String and deliver an 10175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * exception on error. On success the String is returned. R0 holds the referring method, 10185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * R1 holds the string index. The fast path check for hit in strings cache has already been 10195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * performed. 10205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1021d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artResolveStringFromCode 1022468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolve_string 10231d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 10241d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*) 10255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artResolveStringFromCode 10261d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 1027cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 1028468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolve_string 10295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 10303b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi 1031cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier// Macro to facilitate adding new allocation entrypoints. 1032cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro TWO_ARG_DOWNCALL name, entrypoint, return 1033cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier .extern \entrypoint 1034cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name 10351d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 1036cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier jal \entrypoint 10371d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 1038cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier \return 1039cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name 1040cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm 10415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1042cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro THREE_ARG_DOWNCALL name, entrypoint, return 1043cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier .extern \entrypoint 1044cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name 10451d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 1046cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier jal \entrypoint 10471d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a3, rSELF # pass Thread::Current 1048cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier \return 1049cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name 1050cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm 10515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 10527410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier// Generate the allocation entrypoints for each allocator. 10537410f29b4dae223befac036ea567d7f33351dad1Mathieu ChartierGENERATE_ALL_ALLOC_ENTRYPOINTS 10543b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi 10555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 105657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code when the value in rSUSPEND has been decremented to 0. 10575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1058d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artTestSuspendFromCode 1059d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_test_suspend 1060474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers lh $a0, THREAD_FLAGS_OFFSET(rSELF) 10617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $a0, 1f 10627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addi rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL # reset rSUSPEND to SUSPEND_CHECK_INTERVAL 10637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 10645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 10655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 10661d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves for stack crawl 10671d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artTestSuspendFromCode # (Thread*) 10687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF 10691d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 1070d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_test_suspend 10715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 10725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 10735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code that is attempting to call a method on a proxy class. On entry 107457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * r0 holds the proxy method; r1, r2 and r3 may contain arguments. 10755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 10765fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao .extern artQuickProxyInvokeHandler 1077d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_proxy_invoke_handler 10781d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME 10797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a0, 0($sp) # place proxy method at bottom of frame 10807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 10815fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao jal artQuickProxyInvokeHandler # (Method* proxy method, receiver, Thread*, SP) 1082af6e67a4816d2593586115b89faa659225363246Ian Rogers move $a3, $sp # pass $sp 10837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 10841d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME 10857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $t0, 1f 1086b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v0, $f0 # place return value to FP return value 10877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1088b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v1, $f1 # place return value to FP return value 10895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 10905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 1091d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_proxy_invoke_handler 10925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 109388474b416eb257078e590bf9bc7957cee604a186Jeff Hao /* 109488474b416eb257078e590bf9bc7957cee604a186Jeff Hao * Called to resolve an imt conflict. t0 is a hidden argument that holds the target method's 109588474b416eb257078e590bf9bc7957cee604a186Jeff Hao * dex method index. 109688474b416eb257078e590bf9bc7957cee604a186Jeff Hao */ 109713738bf7c769638b7922cb2477471ad382632bc2Douglas LeungENTRY art_quick_imt_conflict_trampoline 109888474b416eb257078e590bf9bc7957cee604a186Jeff Hao lw $a0, 0($sp) # load caller Method* 10991d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a0, MIRROR_ART_METHOD_DEX_CACHE_METHODS_OFFSET($a0) # load dex_cache_resolved_methods 110088474b416eb257078e590bf9bc7957cee604a186Jeff Hao sll $t0, 2 # convert target method offset to bytes 110188474b416eb257078e590bf9bc7957cee604a186Jeff Hao add $a0, $t0 # get address of target method 11021d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a0, MIRROR_OBJECT_ARRAY_DATA_OFFSET($a0) # load the target method 110388474b416eb257078e590bf9bc7957cee604a186Jeff Hao la $t9, art_quick_invoke_interface_trampoline 110488474b416eb257078e590bf9bc7957cee604a186Jeff Hao jr $t9 110588474b416eb257078e590bf9bc7957cee604a186Jeff HaoEND art_quick_imt_conflict_trampoline 110688474b416eb257078e590bf9bc7957cee604a186Jeff Hao 1107468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .extern artQuickResolutionTrampoline 1108468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolution_trampoline 11091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME 1110468532ea115657709bc32ee498e701a4c71762d4Ian Rogers move $a2, rSELF # pass Thread::Current 111165d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers jal artQuickResolutionTrampoline # (Method* called, receiver, Thread*, SP) 1112468532ea115657709bc32ee498e701a4c71762d4Ian Rogers move $a3, $sp # pass $sp 1113468532ea115657709bc32ee498e701a4c71762d4Ian Rogers beqz $v0, 1f 1114468532ea115657709bc32ee498e701a4c71762d4Ian Rogers lw $a0, 0($sp) # load resolved method to $a0 11151d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME 111665d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers move $t9, $v0 # code pointer must be in $t9 to generate the global pointer 1117468532ea115657709bc32ee498e701a4c71762d4Ian Rogers jr $v0 # tail call to method 11181984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier nop 1119468532ea115657709bc32ee498e701a4c71762d4Ian Rogers1: 11201d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME 1121468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DELIVER_PENDING_EXCEPTION 1122468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolution_trampoline 1123468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 11242da882315a61072664f7ce3c212307342e907207Andreas GampeUNIMPLEMENTED art_quick_generic_jni_trampoline 11252da882315a61072664f7ce3c212307342e907207Andreas Gampe 1126468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .extern artQuickToInterpreterBridge 1127468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_to_interpreter_bridge 11281d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME 11297db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers move $a1, rSELF # pass Thread::Current 1130468532ea115657709bc32ee498e701a4c71762d4Ian Rogers jal artQuickToInterpreterBridge # (Method* method, Thread*, SP) 11317db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers move $a2, $sp # pass $sp 11327db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 11331d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME 11347db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers bnez $t0, 1f 1135b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v0, $f0 # place return value to FP return value 11367db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers jr $ra 1137b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v1, $f1 # place return value to FP return value 11387db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers1: 11397db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers DELIVER_PENDING_EXCEPTION 1140468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_to_interpreter_bridge 11417db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers 11425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1143725a957985171d712d5c048cc3d00ff14968784bjeffhao * Routine that intercepts method calls and returns. 11445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1145d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInstrumentationMethodEntryFromCode 1146d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInstrumentationMethodExitFromCode 1147468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_instrumentation_entry 11481d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME 114912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $sp # remember bottom of caller's frame 11501d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers addiu $sp, $sp, -32 # space for saved a0, pad (2 words), arguments (4 words) 115162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset 32 115262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $a0, 28($sp) # save arg0 11531d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a3, $ra # pass $ra 11541d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artInstrumentationMethodEntryFromCode # (Method*, Object*, Thread*, LR) 115562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a2, rSELF # pass Thread::Current 11568161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $t9, $v0 # $t9 holds reference to code 115762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $a0, 28($sp) # restore arg0 115862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, 32 # remove args 115962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset -32 11601d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME 11618161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jalr $t9 # call method 116262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers nop 1163468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_entry 11645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* intentional fallthrough */ 1165468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .global art_quick_instrumentation_exit 1166468532ea115657709bc32ee498e701a4c71762d4Ian Rogersart_quick_instrumentation_exit: 1167d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_startproc 116812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao addiu $t9, $ra, 4 # put current address into $t9 to rebuild $gp 11691d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers .cpload $t9 1170c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung move $ra, $zero # link register is to here, so clobber with 0 for later checks 11711d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME 1172c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung move $t0, $sp # remember bottom of caller's frame 117362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, -48 # save return values and set up args 117462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset 48 117562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $v0, 32($sp) 1176c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung .cfi_rel_offset 2, 32 117762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $v1, 36($sp) 1178c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung .cfi_rel_offset 3, 36 117962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f0, 40($sp) 118062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f1, 44($sp) 118162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f0, 16($sp) # pass fpr result 118262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f1, 20($sp) 118362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a2, $v0 # pass gpr result 118462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a3, $v1 118512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $a1, $t0 # pass $sp 118662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artInstrumentationMethodExitFromCode # (Thread*, SP, gpr_res, fpr_res) 118712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $a0, rSELF # pass Thread::Current 118812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $v0 # set aside returned link register 118912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $ra, $v1 # set link register for deoptimization 119062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $v0, 32($sp) # restore return values 119162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $v1, 36($sp) 119262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers l.s $f0, 40($sp) 119362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers l.s $f1, 44($sp) 119412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao jr $t0 # return 119562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, 112 # 48 bytes of args + 64 bytes of callee save frame 119662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset -112 1197468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_exit 11985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 119912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao /* 120062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization 120162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers * will long jump to the upcall with a special exception of -1. 120212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao */ 1203d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artDeoptimize 1204d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deoptimize 120514dd5a82ad85a28612bf86e755ff929d767cea4cJeff Hao SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 12061d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artDeoptimize # artDeoptimize(Thread*) 120712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao # Returns caller method's frame size. 12081d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a0, rSELF # pass Thread::current 1209d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deoptimize 121012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao 12115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 12125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 12135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 12145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 12155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 12165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 12177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 12187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 12197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 12205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 12211d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_shl_long 12225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* shl-long vAA, vBB, vCC */ 12237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v0, $a0, $a2 # rlo<- alo << (shift&31) 12247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $v1, $a2 # rhi<- 31-shift (shift is 5b) 12257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, 1 12267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, $v1 # alo<- alo >> (32-(shift&31)) 12277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v1, $a1, $a2 # rhi<- ahi << (shift&31) 12287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v1, $a0 # rhi<- rhi | alo 12297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift< shift & 0x20 12307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $v0, $a2 # rhi<- rlo (if shift&0x20) 12317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1232fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao movn $v0, $zero, $a2 # rlo<- 0 (if shift&0x20) 1233d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shl_long 12345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 12355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 12365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 12375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 12385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 12395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 12405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 12417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 12427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 12437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 12445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 12451d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_shr_long 12467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 12477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 12487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $a3, $a1, 31 # $a3<- sign(ah) 12497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 12507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 12517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 12527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 12537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 12547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 12557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 12567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $a3, $a2 # rhi<- sign(ahi) (if shift&0x20) 1257d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shr_long 12585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 12595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 12605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 12615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 12625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 12635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 12645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 12655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r0: low word 12665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r1: high word 12675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r2: shift count 12685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 12695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* ushr-long vAA, vBB, vCC */ 12701d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_ushr_long 1271fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao srl $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 12727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 12737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 12747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 12757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 12767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 12777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 12787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 12797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1280fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao movn $v1, $zero, $a2 # rhi<- 0 (if shift&0x20) 1281d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_ushr_long 12827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 12831d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersUNIMPLEMENTED art_quick_indexof 12841d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersUNIMPLEMENTED art_quick_string_compareto 1285