quick_entrypoints_mips.S revision 1d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5
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 681d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ld $t0, _ZN3art7Runtime9instance_E 691d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers THIS_LOAD_REQUIRES_READ_BARRIER 701d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ld $t0, RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET($t0) 711d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $t0, 0($sp) # Place Method* at bottom of stack. 721d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF) # Place sp in Thread::Current()->top_quick_frame. 735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC. 785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Does not include rSUSPEND or rSELF 791f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao * callee-save: $s2-$s8 + $gp + $ra, 9 total + 3 words padding + 4 open words for args 805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 811d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro SETUP_REFS_ONLY_CALLEE_SAVE_FRAME 824eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, -64 83d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset 64 845c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 855c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe // Ugly compile-time check, but we only have the preprocessor. 865c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_REFS_ONLY_CALLEE_SAVE != 64) 875c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "REFS_ONLY_CALLEE_SAVE_FRAME(MIPS) size not as expected." 885c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif 895c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 904eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $ra, 60($sp) 91d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 31, 60 924eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $s8, 56($sp) 93d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 30, 56 941f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $gp, 52($sp) 951f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 28, 52 961f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s7, 48($sp) 971f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 23, 48 981f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s6, 44($sp) 991f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 22, 44 1001f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s5, 40($sp) 1011f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 21, 40 1021f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s4, 36($sp) 1031f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 20, 36 1041f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s3, 32($sp) 1051f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 19, 32 1061f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s2, 28($sp) 1071f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 18, 28 108fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao # 3 words for alignment and extra args, 4 open words for args $a0-$a3, bottom will hold Method* 1091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers 1101d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ld $t0, _ZN3art7Runtime9instance_E 1111d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers THIS_LOAD_REQUIRES_READ_BARRIER 1121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ld $t0, RUNTIME_REFS_ONLY_CALLEE_SAVE_FRAME_OFFSET($t0) 1131d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $t0, 0($sp) # Place Method* at bottom of stack. 1141d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF) # Place sp in Thread::Current()->top_quick_frame. 1155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1171d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME 1184eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $ra, 60($sp) 119bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 1202a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s8, 56($sp) 121bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 1222a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $gp, 52($sp) 123bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 28 1242a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s7, 48($sp) 125bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 23 1262a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s6, 44($sp) 127bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 22 1282a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s5, 40($sp) 129bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 21 1302a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s4, 36($sp) 131bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 20 1322a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s3, 32($sp) 133bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 19 1342a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s2, 28($sp) 135bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 18 1364eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, 64 137d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -64 1385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1401d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 1414eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $ra, 60($sp) 142bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 1432a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s8, 56($sp) 144bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 1452a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $gp, 52($sp) 146bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 28 1472a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s7, 48($sp) 148bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 23 1492a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s6, 44($sp) 150bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 22 1512a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s5, 40($sp) 152bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 21 1532a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s4, 36($sp) 154bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 20 1552a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s3, 32($sp) 156bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 19 1572a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s2, 28($sp) 158bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 18 1597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1604eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, 64 161d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -64 1625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 1665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC. 1671f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao * callee-save: $a1-$a3, $s2-$s8 + $gp + $ra, 12 total + 3 words padding + method* 1685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1691d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME 1701f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao addiu $sp, $sp, -64 1711f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_adjust_cfa_offset 64 1725c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 1735c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe // Ugly compile-time check, but we only have the preprocessor. 1745c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE != 64) 1755c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "REFS_AND_ARGS_CALLEE_SAVE_FRAME(MIPS) size not as expected." 1765c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif 1775c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 1781f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $ra, 60($sp) 1791f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 31, 60 1801f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s8, 56($sp) 1811f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 30, 56 1821f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $gp, 52($sp) 1831f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 28, 52 1841f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s7, 48($sp) 1851f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 23, 48 1861f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s6, 44($sp) 1871f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 22, 44 1881f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s5, 40($sp) 1891f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 21, 40 1901f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s4, 36($sp) 1911f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 20, 36 1921f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s3, 32($sp) 1931f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 19, 32 1941f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s2, 28($sp) 1951f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 18, 28 1967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a3, 12($sp) 197d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 7, 12 1987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a2, 8($sp) 199d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 6, 8 2007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a1, 4($sp) 201d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 5, 4 202fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao # bottom will hold Method* 2031d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers 2041d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ld $t0, _ZN3art7Runtime9instance_E 2051d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers THIS_LOAD_REQUIRES_READ_BARRIER 2061d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers ld $t0, RUNTIME_REFS_AND_ARGS_CALLEE_SAVE_FRAME_OFFSET($t0) 2071d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $t0, 0($sp) # Place Method* at bottom of stack. 2081d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $sp, THREAD_TOP_QUICK_FRAME_OFFSET(rSELF) # Place sp in Thread::Current()->top_quick_frame. 2095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2111d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers.macro RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME 2122a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $ra, 60($sp) 213bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 2142a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s8, 56($sp) 215bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 2162a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $gp, 52($sp) 217bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 28 2182a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s7, 48($sp) 219bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 23 2202a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s6, 44($sp) 221bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 22 2222a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s5, 40($sp) 223bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 21 2242a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s4, 36($sp) 225bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 20 2262a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s3, 32($sp) 227bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 19 2282a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s2, 28($sp) 229bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 18 2302a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $a3, 12($sp) 231bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 7 2322a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $a2, 8($sp) 233bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 6 2342a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $a1, 4($sp) 235bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 5 236468532ea115657709bc32ee498e701a4c71762d4Ian Rogers addiu $sp, $sp, 64 # pop frame 2371f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_adjust_cfa_offset -64 2385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending 2425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * exception is Thread::Current()->exception_ 2435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 2445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro DELIVER_PENDING_EXCEPTION 2458161c0336b97e11e02c000af357f8f40de2e23e4jeffhao SETUP_SAVE_ALL_CALLEE_SAVE_FRAME # save callee saves for throw 2468161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artDeliverPendingExceptionFromCode 2471d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artDeliverPendingExceptionFromCode(Thread*) 2481d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a0, rSELF # pass Thread::Current 2495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NO_EXCEPTION 2527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 2531d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME 2548161c0336b97e11e02c000af357f8f40de2e23e4jeffhao bnez $t0, 1f # success if no exception is pending 2555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 2575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 2595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 2605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_ZERO 2631d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME 2647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $v0, 1f # success? 2655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return on success 2675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 2695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 2705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 272cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro RETURN_IF_RESULT_IS_NON_ZERO 2731d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME 2747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao beqz $v0, 1f # success? 2755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return on success 2775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 2795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 2805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * On entry $a0 is uint32_t* gprs_ and $a1 is uint32_t* fprs_ 2845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * FIXME: just guessing about the shape of the jmpbuf. Where will pc be? 2855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 286d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_do_long_jump 2877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f0, 0($a1) 2887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f1, 4($a1) 2897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f2, 8($a1) 2907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f3, 12($a1) 2917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f4, 16($a1) 2927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f5, 20($a1) 2937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f6, 24($a1) 2947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f7, 28($a1) 2957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f8, 32($a1) 2967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f9, 36($a1) 2977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f10, 40($a1) 2987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f11, 44($a1) 2997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f12, 48($a1) 3007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f13, 52($a1) 3017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f14, 56($a1) 3027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f15, 60($a1) 3037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f16, 64($a1) 3047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f17, 68($a1) 3057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f18, 72($a1) 3067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f19, 76($a1) 3077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f20, 80($a1) 3087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f21, 84($a1) 3097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f22, 88($a1) 3107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f23, 92($a1) 3117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f24, 96($a1) 3127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f25, 100($a1) 3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f26, 104($a1) 3147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f27, 108($a1) 3157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f28, 112($a1) 3167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f29, 116($a1) 3177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f30, 120($a1) 3187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f31, 124($a1) 319748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman .set push 320748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman .set nomacro 321748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman .set noat 3227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $at, 4($a0) 323748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman .set pop 3247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v0, 8($a0) 3257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v1, 12($a0) 3267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 20($a0) 3277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 24($a0) 3287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a3, 28($a0) 3297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, 32($a0) 3307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t1, 36($a0) 3317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t2, 40($a0) 3327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t3, 44($a0) 3337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t4, 48($a0) 3347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t5, 52($a0) 3357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t6, 56($a0) 3367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t7, 60($a0) 3377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s0, 64($a0) 3387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s1, 68($a0) 3397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s2, 72($a0) 3407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s3, 76($a0) 3417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s4, 80($a0) 3427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s5, 84($a0) 3437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s6, 88($a0) 3447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s7, 92($a0) 3457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t8, 96($a0) 3467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t9, 100($a0) 3477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $gp, 112($a0) 3487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $sp, 116($a0) 3497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $fp, 120($a0) 3507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $ra, 124($a0) 3517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a0, 16($a0) 3527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v0, $zero # clear result registers r0 and r1 3537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # do long jump 3547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v1, $zero 355d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_do_long_jump 3565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code, saves most registers (forms basis of long jump context) and passes 3595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at 3605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the thread. On entry r0 holds Throwable* 3615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 362468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_deliver_exception 36357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3648161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artDeliverExceptionFromCode 3651d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artDeliverExceptionFromCode(Throwable*, Thread*) 3661d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a1, rSELF # pass Thread::Current 367468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_deliver_exception 3685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver a NullPointerException 3715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 372d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowNullPointerExceptionFromCode 373468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_null_pointer_exception 37457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3758161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowNullPointerExceptionFromCode 3761d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artThrowNullPointerExceptionFromCode(Thread*) 3771d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a0, rSELF # pass Thread::Current 378468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_null_pointer_exception 3795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArithmeticException 3825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 383d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowDivZeroFromCode 384468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_div_zero 38557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3868161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowDivZeroFromCode 3871d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artThrowDivZeroFromCode(Thread*) 3881d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a0, rSELF # pass Thread::Current 389468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_div_zero 3905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException 3935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 394d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowArrayBoundsFromCode 395468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_array_bounds 39657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3978161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowArrayBoundsFromCode 3981d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artThrowArrayBoundsFromCode(index, limit, Thread*) 3991d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 400468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_array_bounds 4015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 40257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 40357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a StackOverflowError. 40457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 405d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowStackOverflowFromCode 406468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_stack_overflow 40757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 4088161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowStackOverflowFromCode 4091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artThrowStackOverflowFromCode(Thread*) 4101d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a0, rSELF # pass Thread::Current 411468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_stack_overflow 4125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 41357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 41457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a NoSuchMethodError. 41557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 416d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowNoSuchMethodFromCode 417468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_no_such_method 41857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 4198161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowNoSuchMethodFromCode 4201d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artThrowNoSuchMethodFromCode(method_idx, Thread*) 4211d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a1, rSELF # pass Thread::Current 422468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_no_such_method 4235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 4255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * All generated callsites for interface invokes and invocation slow paths will load arguments 4267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain 4275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the method_idx. This wrapper will save arg1-arg3, load the caller's Method*, align the 4285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * stack and call the appropriate C helper. 4297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1. 4305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 4317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting 4327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * of the target Method* in $v0 and method->code_ in $v1. 4335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 434fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao * If unsuccessful, the helper will return NULL/NULL. There will be a pending exception in the 4355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * thread and we branch to another stub to deliver it. 4365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 4375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On success this wrapper will restore arguments and *jump* to the target, leaving the lr 4385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * pointing back to the original caller. 4395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 4405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name 4415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern \cxx_name 442d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY \c_name 4431d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME # save callee saves in case allocation triggers GC 4441d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE($sp) # pass caller Method* 445fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $t0, $sp # save $sp 44658df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, -32 # make space for extra args 44758df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset 32 4487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 449d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 28, 12 4507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal \cxx_name # (method_idx, this, caller, Thread*, $sp) 451fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $t0, 16($sp) # pass $sp 45258df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, 32 # release out args 45358df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset -32 454fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $a0, $v0 # save target Method* 45530a3317577d84feafa859b3e39d1545a995f0b7cjeffhao move $t9, $v1 # save $v0->code_ 4561d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME 457fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao beqz $v0, 1f 4585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 45930a3317577d84feafa859b3e39d1545a995f0b7cjeffhao jr $t9 4605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 4615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 4625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 463d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND \c_name 4645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 4655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4668dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline 4678dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck 4685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4698dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck 4708dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck 4718dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck 4728dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck 4735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 47479fe539587d4c09244172d0168eeed0ec9770466Jeff Hao /* 475ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Invocation stub for quick code. 4765d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * On entry: 4775d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a0 = method pointer 4785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a1 = argument array or NULL for no argument methods 4795d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a2 = size of argument array in bytes 4805d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a3 = (managed) thread pointer 4816474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao * [sp + 16] = JValue* result 4820177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers * [sp + 20] = shorty 4835d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao */ 4845d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoENTRY art_quick_invoke_stub 4855d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $a0, 0($sp) # save out a0 4865d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, -16 # spill s0, s1, fp, ra 4875d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_adjust_cfa_offset 16 4885d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $ra, 12($sp) 4895d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 31, 12 4905d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $fp, 8($sp) 4915d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 30, 8 4925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $s1, 4($sp) 4935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 17, 4 4945d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $s0, 0($sp) 4955d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 16, 0 4965d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $fp, $sp # save sp in fp 4975d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_def_cfa_register 30 4985d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $s1, $a3 # move managed thread pointer into s1 4995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $s0, $zero, SUSPEND_CHECK_INTERVAL # reset s0 to suspend check interval 5005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $t0, $a2, 16 # create space for method pointer in frame 501b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung srl $t0, $t0, 4 # shift the frame size right 4 502b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung sll $t0, $t0, 4 # shift the frame size left 4 to align to 16 bytes 5035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao subu $sp, $sp, $t0 # reserve stack space for argument array 5045d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $a0, $sp, 4 # pass stack pointer + method ptr as dest for memcpy 5055d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jal memcpy # (dest, src, bytes) 5065d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, -16 # make space for argument slots for memcpy 5075d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, 16 # restore stack after memcpy 5085d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a0, 16($fp) # restore method* 5095d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a1, 4($sp) # copy arg value for a1 5105d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a2, 8($sp) # copy arg value for a2 5115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a3, 12($sp) # copy arg value for a3 5121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $t9, MIRROR_ART_METHOD_QUICK_CODE_OFFSET($a0) # get pointer to the code 5135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jalr $t9 # call the method 5145d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $zero, 0($sp) # store NULL for method* at bottom of frame 5155d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $sp, $fp # restore the stack 5165d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $s0, 0($sp) 517bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 16 5185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $s1, 4($sp) 519bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 17 5205d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $fp, 8($sp) 521bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 5225d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $ra, 12($sp) 523bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 5245d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, 16 5255d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_adjust_cfa_offset -16 5265d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $t0, 16($sp) # get result pointer 5270177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers lw $t1, 20($sp) # get shorty 5280177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers lb $t1, 0($t1) # get result type char 5296474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao li $t2, 68 # put char 'D' into t2 5306474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao beq $t1, $t2, 1f # branch if result type char == 'D' 5316474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao li $t3, 70 # put char 'F' into t3 5326474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao beq $t1, $t3, 1f # branch if result type char == 'F' 5335d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $v0, 0($t0) # store the result 5346474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao jr $ra 5355d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $v1, 4($t0) # store the other half of the result 5366474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao1: 53719ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao s.s $f0, 0($t0) # store floating point result 5385d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jr $ra 53919ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao s.s $f1, 4($t0) # store other half of floating point result 5405d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoEND art_quick_invoke_stub 5415d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao 5425d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao /* 5435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on 5445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * failure. 5455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 546d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artHandleFillArrayDataFromCode 547468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_handle_fill_data 5481d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 5491d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 5501d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artHandleFillArrayDataFromCode # (payload offset, Array*, method, Thread*) 551832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers move $a3, rSELF # pass Thread::Current 552fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao RETURN_IF_ZERO 553468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_handle_fill_data 5545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 55657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code that calls artLockObjectFromCode, may block for GC. 5575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 558d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artLockObjectFromCode 559468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_lock_object 56086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $a0, .Lart_quick_throw_null_pointer_exception_gp_set 561a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 5621d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case we block 5631d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artLockObjectFromCode # (Object* obj, Thread*) 5647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 5656bcd163d322b867578fbcfe60e4e3b247c42974bIan Rogers RETURN_IF_ZERO 566468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_lock_object 5675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 5695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure. 5705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 571d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artUnlockObjectFromCode 572468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_unlock_object 57386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $a0, .Lart_quick_throw_null_pointer_exception_gp_set 574a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 5751d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 5761d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artUnlockObjectFromCode # (Object* obj, Thread*) 5777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 5785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 579468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_unlock_object 5805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 5825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure. 5835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 584a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .extern artThrowClassCastException 585468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_cast 586a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, -16 587a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset 16 588a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $ra, 12($sp) 589a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_rel_offset 31, 12 590a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $t9, 8($sp) 591a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a1, 4($sp) 592a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a0, 0($sp) 593a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jal artIsAssignableFromCode 594a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 59586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $v0, .Lthrow_class_cast_exception 596a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $ra, 12($sp) 597a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $ra 598a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, 16 599a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset -16 60086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lthrow_class_cast_exception: 601a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t9, 8($sp) 602a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a1, 4($sp) 603a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a0, 0($sp) 604a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, 16 605a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset -16 606a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 607a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers la $t9, artThrowClassCastException 6081d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artThrowClassCastException (Class*, Class*, Thread*) 6091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 610468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_cast 6115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 613a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers * Entry from managed code for array put operations of objects where the value being stored 614a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers * needs to be checked for compatibility. 615a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers * a0 = array, a1 = index, a2 = value 6165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 617a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_null_and_bound_check 61886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bnez $a0, .Lart_quick_aput_obj_with_bound_check_gp_set 619a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 62086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers b .Lart_quick_throw_null_pointer_exception_gp_set 621a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 622a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_null_and_bound_check 623a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers 624a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_bound_check 6251d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $t0, MIRROR_ARRAY_LENGTH_OFFSET($a0) 626a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sltu $t1, $a1, $t0 62786bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bnez $t1, .Lart_quick_aput_obj_gp_set 628a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 629a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a0, $a1 63086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers b .Lart_quick_throw_array_bounds_gp_set 631a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a1, $t0 632a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_bound_check 633a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers 634a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj 63586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $a2, .Ldo_aput_null 636a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 6371d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $t0, MIRROR_OBJECT_CLASS_OFFSET($a0) 6381d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $t1, MIRROR_OBJECT_CLASS_OFFSET($a2) 6391d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $t0, MIRROR_CLASS_COMPONENT_TYPE_OFFSET($t0) 64086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bne $t1, $t0, .Lcheck_assignability # value's type == array's component type - trivial assignability 641a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 64286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput: 643a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sll $a1, $a1, 2 644a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $t0, $a0, $a1 6451d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $a2, MIRROR_OBJECT_ARRAY_DATA_OFFSET($t0) 646a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t0, THREAD_CARD_TABLE_OFFSET(rSELF) 647a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers srl $t1, $a0, 7 648a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $t1, $t1, $t0 649a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sb $t0, ($t1) 650a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $ra 651a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 65286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput_null: 653a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sll $a1, $a1, 2 654a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $t0, $a0, $a1 6551d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $a2, MIRROR_OBJECT_ARRAY_DATA_OFFSET($t0) 656a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $ra 657a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 65886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lcheck_assignability: 659a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, -32 660a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset 32 661a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $ra, 28($sp) 662a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_rel_offset 31, 28 663a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $t9, 12($sp) 664a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a2, 8($sp) 665a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a1, 4($sp) 666a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a0, 0($sp) 667a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a1, $t1 668a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a0, $t0 669a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jal artIsAssignableFromCode # (Class*, Class*) 670a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 671a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $ra, 28($sp) 672a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t9, 12($sp) 673a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a2, 8($sp) 674a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a1, 4($sp) 675a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a0, 0($sp) 676a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $sp, 32 677a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset -32 67886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bnez $v0, .Ldo_aput 679a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 680a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 681a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a1, $a2 682a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers la $t9, artThrowArrayStoreException 6831d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jr $t9 # artThrowArrayStoreException(Class*, Class*, Thread*) 6841d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 685a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj 6865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 6885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when uninitialized static storage, this stub will run the class 6895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * initializer and deliver the exception on error. On success the static storage base is 6905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * returned. 6915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 692d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeStaticStorageFromCode 693468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_static_storage 6941d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6951d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*) 6965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeStaticStorageFromCode 6971d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 698cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 699468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_static_storage 7005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 70257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code when dex cache misses for a type_idx. 7035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 704d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeTypeFromCode 705468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type 7061d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7071d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*) 7085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeFromCode 7091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 710cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 711468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type 7125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 7145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when type_idx needs to be checked for access and dex cache may also 71557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * miss. 7165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 717d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeTypeAndVerifyAccessFromCode 718468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type_and_verify_access 7191d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7201d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*) 7215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeAndVerifyAccessFromCode 7221d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 723cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 724468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type_and_verify_access 72537f05ef45e0393de812d51261dc293240c17294dFred Shih /* 72637f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve a static field and load a boolean primitive value. 72737f05ef45e0393de812d51261dc293240c17294dFred Shih */ 72837f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetBooleanStaticFromCode 72937f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_boolean_static 7301d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7311d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 7321d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetBooleanStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*) 73337f05ef45e0393de812d51261dc293240c17294dFred Shih move $a2, rSELF # pass Thread::Current 73437f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 73537f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_boolean_static 73637f05ef45e0393de812d51261dc293240c17294dFred Shih /* 73737f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve a static field and load a byte primitive value. 73837f05ef45e0393de812d51261dc293240c17294dFred Shih */ 73937f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetByteStaticFromCode 74037f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_byte_static 7411d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7421d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 7431d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetByteStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*) 74437f05ef45e0393de812d51261dc293240c17294dFred Shih move $a2, rSELF # pass Thread::Current 74537f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 74637f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_byte_static 74737f05ef45e0393de812d51261dc293240c17294dFred Shih 74837f05ef45e0393de812d51261dc293240c17294dFred Shih /* 74937f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve a static field and load a char primitive value. 75037f05ef45e0393de812d51261dc293240c17294dFred Shih */ 75137f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetCharStaticFromCode 75237f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_char_static 7531d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7541d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 7551d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetCharStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*) 75637f05ef45e0393de812d51261dc293240c17294dFred Shih move $a2, rSELF # pass Thread::Current 75737f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 75837f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_char_static 75937f05ef45e0393de812d51261dc293240c17294dFred Shih /* 76037f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve a static field and load a short primitive value. 76137f05ef45e0393de812d51261dc293240c17294dFred Shih */ 76237f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetShortStaticFromCode 76337f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_short_static 7641d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7651d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 7661d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetShortStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*) 76737f05ef45e0393de812d51261dc293240c17294dFred Shih move $a2, rSELF # pass Thread::Current 76837f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 76937f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_short_static 7705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 77257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 32-bit primitive value. 7735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 774d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet32StaticFromCode 775468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_static 7761d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7771d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 7781d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGet32StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*) 7797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 781468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_static 7825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 78457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 64-bit primitive value. 7855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 786d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet64StaticFromCode 787468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_static 7881d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7891d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 7901d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGet64StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*) 7917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 793468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_static 7945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 79657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load an object reference. 7975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 798d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGetObjStaticFromCode 799468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_static 8001d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8011d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8021d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetObjStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*) 8037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 8045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 805468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_static 8065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 80837f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve an instance field and load a boolean primitive value. 80937f05ef45e0393de812d51261dc293240c17294dFred Shih */ 81037f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetBooleanInstanceFromCode 81137f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_boolean_instance 8121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8131d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8141d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetBooleanInstanceFromCode # (field_idx, Object*, referrer, Thread*) 81537f05ef45e0393de812d51261dc293240c17294dFred Shih move $a3, rSELF # pass Thread::Current 81637f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 81737f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_boolean_instance 81837f05ef45e0393de812d51261dc293240c17294dFred Shih /* 81937f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve an instance field and load a byte primitive value. 82037f05ef45e0393de812d51261dc293240c17294dFred Shih */ 82137f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetByteInstanceFromCode 82237f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_byte_instance 8231d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8241d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8251d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetByteInstanceFromCode # (field_idx, Object*, referrer, Thread*) 82637f05ef45e0393de812d51261dc293240c17294dFred Shih move $a3, rSELF # pass Thread::Current 82737f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 82837f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_byte_instance 82937f05ef45e0393de812d51261dc293240c17294dFred Shih 83037f05ef45e0393de812d51261dc293240c17294dFred Shih /* 83137f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve an instance field and load a char primitive value. 83237f05ef45e0393de812d51261dc293240c17294dFred Shih */ 83337f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetCharInstanceFromCode 83437f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_char_instance 8351d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8361d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8371d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetCharInstanceFromCode # (field_idx, Object*, referrer, Thread*) 83837f05ef45e0393de812d51261dc293240c17294dFred Shih move $a3, rSELF # pass Thread::Current 83937f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 84037f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_char_instance 84137f05ef45e0393de812d51261dc293240c17294dFred Shih /* 84237f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve an instance field and load a short primitive value. 84337f05ef45e0393de812d51261dc293240c17294dFred Shih */ 84437f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artGetShortInstanceFromCode 84537f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_get_short_instance 8461d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8471d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8481d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetShortInstanceFromCode # (field_idx, Object*, referrer, Thread*) 84937f05ef45e0393de812d51261dc293240c17294dFred Shih move $a3, rSELF # pass Thread::Current 85037f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_NO_EXCEPTION 85137f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_get_short_instance 85237f05ef45e0393de812d51261dc293240c17294dFred Shih 85337f05ef45e0393de812d51261dc293240c17294dFred Shih /* 85457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 32-bit primitive value. 8555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 856d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet32InstanceFromCode 857468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_instance 8581d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8591d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 861fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet32InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 8624eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 864468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_instance 8655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 86757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 64-bit primitive value. 8685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 869d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet64InstanceFromCode 870468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_instance 8711d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8721d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 874fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet64InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 8754eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 877468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_instance 8785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 88057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load an object reference. 8815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 882d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGetObjInstanceFromCode 883468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_instance 8841d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8851d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8861d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artGetObjInstanceFromCode # (field_idx, Object*, referrer, Thread*) 8877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 8885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 889468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_instance 8905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 89237f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve a static field and store a 8-bit primitive value. 89337f05ef45e0393de812d51261dc293240c17294dFred Shih */ 89437f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artSet8StaticFromCode 89537f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set8_static 8961d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8971d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 8981d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSet8StaticFromCode # (field_idx, new_val, referrer, Thread*) 89937f05ef45e0393de812d51261dc293240c17294dFred Shih move $a3, rSELF # pass Thread::Current 90037f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_ZERO 90137f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set8_static 90237f05ef45e0393de812d51261dc293240c17294dFred Shih 90337f05ef45e0393de812d51261dc293240c17294dFred Shih /* 90437f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve a static field and store a 16-bit primitive value. 90537f05ef45e0393de812d51261dc293240c17294dFred Shih */ 90637f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artSet16StaticFromCode 90737f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set16_static 9081d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9091d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 91037f05ef45e0393de812d51261dc293240c17294dFred Shih jal artSet16StaticFromCode # (field_idx, new_val, referrer, Thread*, $sp) 9111d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a3, rSELF # pass Thread::Current 91237f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_ZERO 91337f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set16_static 91437f05ef45e0393de812d51261dc293240c17294dFred Shih 91537f05ef45e0393de812d51261dc293240c17294dFred Shih /* 91657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 32-bit primitive value. 9175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 918d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32StaticFromCode 919468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_static 9201d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9211d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 9221d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSet32StaticFromCode # (field_idx, new_val, referrer, Thread*) 9237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 9245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 925468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_static 9265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 92857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 64-bit primitive value. 9295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 93037f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artSet64StaticFromCode 931468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_static 9321d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9331d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a1, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 9341d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSet64StaticFromCode # (field_idx, referrer, new_val, Thread*) 935fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 9365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 937468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_static 9385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 94057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store an object reference. 9415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 942d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSetObjStaticFromCode 943468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_static 9441d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9451d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a2, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 9461d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSetObjStaticFromCode # (field_idx, new_val, referrer, Thread*) 9477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 9485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 949468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_static 9505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 95237f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve an instance field and store a 8-bit primitive value. 95337f05ef45e0393de812d51261dc293240c17294dFred Shih */ 95437f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artSet8InstanceFromCode 95537f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set8_instance 9561d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9571d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 9581d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSet8InstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*) 95937f05ef45e0393de812d51261dc293240c17294dFred Shih sw rSELF, 16($sp) # pass Thread::Current 96037f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_ZERO 96137f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set8_instance 96237f05ef45e0393de812d51261dc293240c17294dFred Shih 96337f05ef45e0393de812d51261dc293240c17294dFred Shih /* 96437f05ef45e0393de812d51261dc293240c17294dFred Shih * Called by managed code to resolve an instance field and store a 16-bit primitive value. 96537f05ef45e0393de812d51261dc293240c17294dFred Shih */ 96637f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artSet16InstanceFromCode 96737f05ef45e0393de812d51261dc293240c17294dFred ShihENTRY art_quick_set16_instance 9681d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9691d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 9701d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSet16InstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*) 97137f05ef45e0393de812d51261dc293240c17294dFred Shih sw rSELF, 16($sp) # pass Thread::Current 97237f05ef45e0393de812d51261dc293240c17294dFred Shih RETURN_IF_ZERO 97337f05ef45e0393de812d51261dc293240c17294dFred ShihEND art_quick_set16_instance 97437f05ef45e0393de812d51261dc293240c17294dFred Shih 97537f05ef45e0393de812d51261dc293240c17294dFred Shih /* 97657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 32-bit primitive value. 9775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 978d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32InstanceFromCode 979468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_instance 9801d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9811d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 9821d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSet32InstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*) 983fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 9845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 985468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_instance 9865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 98857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 64-bit primitive value. 9895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 99037f05ef45e0393de812d51261dc293240c17294dFred Shih .extern artSet64InstanceFromCode 991468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_instance 9921d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9931d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $t0, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # load referrer's Method* 9941d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw rSELF, 20($sp) # pass Thread::Current 9951d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSet64InstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*) 9961d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers sw $t0, 16($sp) # pass referrer's Method* 9975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 998468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_instance 9995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 10005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 100157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store an object reference. 10025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1003d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSetObjInstanceFromCode 1004468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_instance 10051d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 10061d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a3, FRAME_SIZE_REFS_ONLY_CALLEE_SAVE($sp) # pass referrer's Method* 10071d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artSetObjInstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*) 1008fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 10095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 1010468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_instance 10115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 10125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 10135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code to resolve a string, this stub will allocate a String and deliver an 10145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * exception on error. On success the String is returned. R0 holds the referring method, 10155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * R1 holds the string index. The fast path check for hit in strings cache has already been 10165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * performed. 10175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1018d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artResolveStringFromCode 1019468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolve_string 10201d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 10211d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*) 10225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artResolveStringFromCode 10231d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 1024cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 1025468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolve_string 10265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 10273b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi 1028cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier// Macro to facilitate adding new allocation entrypoints. 1029cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro TWO_ARG_DOWNCALL name, entrypoint, return 1030cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier .extern \entrypoint 1031cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name 10321d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 1033cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier jal \entrypoint 10341d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a2, rSELF # pass Thread::Current 1035cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier \return 1036cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name 1037cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm 10385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1039cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro THREE_ARG_DOWNCALL name, entrypoint, return 1040cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier .extern \entrypoint 1041cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name 10421d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 1043cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier jal \entrypoint 10441d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a3, rSELF # pass Thread::Current 1045cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier \return 1046cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name 1047cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm 10485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 10497410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier// Generate the allocation entrypoints for each allocator. 10507410f29b4dae223befac036ea567d7f33351dad1Mathieu ChartierGENERATE_ALL_ALLOC_ENTRYPOINTS 10513b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi 10525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 105357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code when the value in rSUSPEND has been decremented to 0. 10545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1055d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artTestSuspendFromCode 1056d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_test_suspend 1057474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers lh $a0, THREAD_FLAGS_OFFSET(rSELF) 10587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $a0, 1f 10597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addi rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL # reset rSUSPEND to SUSPEND_CHECK_INTERVAL 10607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 10615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 10625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 10631d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME # save callee saves for stack crawl 10641d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artTestSuspendFromCode # (Thread*) 10657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF 10661d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 1067d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_test_suspend 10685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 10695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 10705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code that is attempting to call a method on a proxy class. On entry 107157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * r0 holds the proxy method; r1, r2 and r3 may contain arguments. 10725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 10735fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao .extern artQuickProxyInvokeHandler 1074d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_proxy_invoke_handler 10751d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME 10767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a0, 0($sp) # place proxy method at bottom of frame 10777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 10785fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao jal artQuickProxyInvokeHandler # (Method* proxy method, receiver, Thread*, SP) 1079af6e67a4816d2593586115b89faa659225363246Ian Rogers move $a3, $sp # pass $sp 10807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 10811d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME 10827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $t0, 1f 1083b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v0, $f0 # place return value to FP return value 10847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1085b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v1, $f1 # place return value to FP return value 10865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 10875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 1088d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_proxy_invoke_handler 10895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 109088474b416eb257078e590bf9bc7957cee604a186Jeff Hao /* 109188474b416eb257078e590bf9bc7957cee604a186Jeff Hao * Called to resolve an imt conflict. t0 is a hidden argument that holds the target method's 109288474b416eb257078e590bf9bc7957cee604a186Jeff Hao * dex method index. 109388474b416eb257078e590bf9bc7957cee604a186Jeff Hao */ 10941d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_imt_conflict_trampoline 109588474b416eb257078e590bf9bc7957cee604a186Jeff Hao lw $a0, 0($sp) # load caller Method* 10961d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a0, MIRROR_ART_METHOD_DEX_CACHE_METHODS_OFFSET($a0) # load dex_cache_resolved_methods 109788474b416eb257078e590bf9bc7957cee604a186Jeff Hao sll $t0, 2 # convert target method offset to bytes 109888474b416eb257078e590bf9bc7957cee604a186Jeff Hao add $a0, $t0 # get address of target method 10991d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers lw $a0, MIRROR_OBJECT_ARRAY_DATA_OFFSET($a0) # load the target method 110088474b416eb257078e590bf9bc7957cee604a186Jeff Hao la $t9, art_quick_invoke_interface_trampoline 110188474b416eb257078e590bf9bc7957cee604a186Jeff Hao jr $t9 110288474b416eb257078e590bf9bc7957cee604a186Jeff HaoEND art_quick_imt_conflict_trampoline 110388474b416eb257078e590bf9bc7957cee604a186Jeff Hao 1104468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .extern artQuickResolutionTrampoline 1105468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolution_trampoline 11061d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME 1107468532ea115657709bc32ee498e701a4c71762d4Ian Rogers move $a2, rSELF # pass Thread::Current 110865d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers jal artQuickResolutionTrampoline # (Method* called, receiver, Thread*, SP) 1109468532ea115657709bc32ee498e701a4c71762d4Ian Rogers move $a3, $sp # pass $sp 1110468532ea115657709bc32ee498e701a4c71762d4Ian Rogers beqz $v0, 1f 1111468532ea115657709bc32ee498e701a4c71762d4Ian Rogers lw $a0, 0($sp) # load resolved method to $a0 11121d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME 111365d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers move $t9, $v0 # code pointer must be in $t9 to generate the global pointer 1114468532ea115657709bc32ee498e701a4c71762d4Ian Rogers jr $v0 # tail call to method 11151984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier nop 1116468532ea115657709bc32ee498e701a4c71762d4Ian Rogers1: 11171d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME 1118468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DELIVER_PENDING_EXCEPTION 1119468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolution_trampoline 1120468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 11212da882315a61072664f7ce3c212307342e907207Andreas GampeUNIMPLEMENTED art_quick_generic_jni_trampoline 11222da882315a61072664f7ce3c212307342e907207Andreas Gampe 1123468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .extern artQuickToInterpreterBridge 1124468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_to_interpreter_bridge 11251d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME 11267db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers move $a1, rSELF # pass Thread::Current 1127468532ea115657709bc32ee498e701a4c71762d4Ian Rogers jal artQuickToInterpreterBridge # (Method* method, Thread*, SP) 11287db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers move $a2, $sp # pass $sp 11297db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 11301d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME 11317db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers bnez $t0, 1f 1132b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v0, $f0 # place return value to FP return value 11337db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers jr $ra 1134b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v1, $f1 # place return value to FP return value 11357db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers1: 11367db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers DELIVER_PENDING_EXCEPTION 1137468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_to_interpreter_bridge 11387db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers 11395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1140725a957985171d712d5c048cc3d00ff14968784bjeffhao * Routine that intercepts method calls and returns. 11415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1142d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInstrumentationMethodEntryFromCode 1143d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInstrumentationMethodExitFromCode 1144468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_instrumentation_entry 11451d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_AND_ARGS_CALLEE_SAVE_FRAME 114612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $sp # remember bottom of caller's frame 11471d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers addiu $sp, $sp, -32 # space for saved a0, pad (2 words), arguments (4 words) 114862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset 32 114962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $a0, 28($sp) # save arg0 11501d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a3, $ra # pass $ra 11511d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artInstrumentationMethodEntryFromCode # (Method*, Object*, Thread*, LR) 115262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a2, rSELF # pass Thread::Current 11538161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $t9, $v0 # $t9 holds reference to code 115462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $a0, 28($sp) # restore arg0 115562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, 32 # remove args 115662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset -32 11571d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers RESTORE_REFS_AND_ARGS_CALLEE_SAVE_FRAME 11588161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jalr $t9 # call method 115962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers nop 1160468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_entry 11615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* intentional fallthrough */ 1162468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .global art_quick_instrumentation_exit 1163468532ea115657709bc32ee498e701a4c71762d4Ian Rogersart_quick_instrumentation_exit: 1164d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_startproc 116512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao addiu $t9, $ra, 4 # put current address into $t9 to rebuild $gp 11661d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers .cpload $t9 1167c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung move $ra, $zero # link register is to here, so clobber with 0 for later checks 11681d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers SETUP_REFS_ONLY_CALLEE_SAVE_FRAME 1169c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung move $t0, $sp # remember bottom of caller's frame 117062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, -48 # save return values and set up args 117162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset 48 117262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $v0, 32($sp) 1173c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung .cfi_rel_offset 2, 32 117462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $v1, 36($sp) 1175c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung .cfi_rel_offset 3, 36 117662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f0, 40($sp) 117762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f1, 44($sp) 117862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f0, 16($sp) # pass fpr result 117962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f1, 20($sp) 118062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a2, $v0 # pass gpr result 118162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a3, $v1 118212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $a1, $t0 # pass $sp 118362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artInstrumentationMethodExitFromCode # (Thread*, SP, gpr_res, fpr_res) 118412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $a0, rSELF # pass Thread::Current 118512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $v0 # set aside returned link register 118612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $ra, $v1 # set link register for deoptimization 118762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $v0, 32($sp) # restore return values 118862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $v1, 36($sp) 118962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers l.s $f0, 40($sp) 119062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers l.s $f1, 44($sp) 119112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao jr $t0 # return 119262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, 112 # 48 bytes of args + 64 bytes of callee save frame 119362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset -112 1194468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_exit 11955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 119612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao /* 119762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization 119862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers * will long jump to the upcall with a special exception of -1. 119912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao */ 1200d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artDeoptimize 1201d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deoptimize 120214dd5a82ad85a28612bf86e755ff929d767cea4cJeff Hao SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 12031d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers jal artDeoptimize # artDeoptimize(Thread*) 120412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao # Returns caller method's frame size. 12051d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian Rogers move $a0, rSELF # pass Thread::current 1206d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deoptimize 120712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao 12085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 12095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 12105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 12115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 12125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 12135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 12147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 12157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 12167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 12175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 12181d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_shl_long 12195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* shl-long vAA, vBB, vCC */ 12207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v0, $a0, $a2 # rlo<- alo << (shift&31) 12217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $v1, $a2 # rhi<- 31-shift (shift is 5b) 12227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, 1 12237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, $v1 # alo<- alo >> (32-(shift&31)) 12247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v1, $a1, $a2 # rhi<- ahi << (shift&31) 12257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v1, $a0 # rhi<- rhi | alo 12267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift< shift & 0x20 12277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $v0, $a2 # rhi<- rlo (if shift&0x20) 12287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1229fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao movn $v0, $zero, $a2 # rlo<- 0 (if shift&0x20) 1230d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shl_long 12315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 12325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 12335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 12345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 12355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 12365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 12375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 12387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 12397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 12407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 12415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 12421d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_shr_long 12437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 12447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 12457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $a3, $a1, 31 # $a3<- sign(ah) 12467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 12477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 12487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 12497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 12507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 12517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 12527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 12537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $a3, $a2 # rhi<- sign(ahi) (if shift&0x20) 1254d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shr_long 12555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 12565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 12575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 12585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 12595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 12605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 12615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 12625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r0: low word 12635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r1: high word 12645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r2: shift count 12655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 12665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* ushr-long vAA, vBB, vCC */ 12671d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersENTRY_NO_GP art_quick_ushr_long 1268fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao srl $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 12697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 12707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 12717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 12727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 12737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 12747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 12757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 12767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1277fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao movn $v1, $zero, $a2 # rhi<- 0 (if shift&0x20) 1278d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_ushr_long 12797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 12801d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersUNIMPLEMENTED art_quick_indexof 12811d8cdbc5202378a5f1a4b3a1fba610675ed4dcd5Ian RogersUNIMPLEMENTED art_quick_string_compareto 1282