quick_entrypoints_mips.S revision b264937893fd12bce84681a6d9da6de99ebe6aa4
10f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes/* 20f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Copyright (C) 2012 The Android Open Source Project 30f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * 40f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 50f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * you may not use this file except in compliance with the License. 60f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * You may obtain a copy of the License at 70f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * 80f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 90f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * 100f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * Unless required by applicable law or agreed to in writing, software 110f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 120f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * See the License for the specific language governing permissions and 140f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes * limitations under the License. 150f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes */ 160f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes 177655f29fabc0a12765de828914a18314382e5a35Ian Rogers#include "asm_support_mips.S" 185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 197410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier#include "arch/quick_alloc_entrypoints.S" 207410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier 210703060875166106af3d490c6c264611aea67ec8jeffhao .set noreorder 225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .balign 4 235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* Deliver the given exception */ 255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artDeliverExceptionFromCode 265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* Deliver an exception pending on a thread */ 278161c0336b97e11e02c000af357f8f40de2e23e4jeffhao .extern artDeliverPendingExceptionFromCode 285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kSaveAll) 321f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao * callee-save: $s0-$s8 + $gp + $ra, 11 total + 1 word padding + 4 open words for args 335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 3457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.macro SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 35fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao addiu $sp, $sp, -64 36d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset 64 375c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 385c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe // Ugly compile-time check, but we only have the preprocessor. 395c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_SAVE_ALL_CALLEE_SAVE != 64) 405c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "SAVE_ALL_CALLEE_SAVE_FRAME(MIPS) size not as expected." 415c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif 425c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 43fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $ra, 60($sp) 44d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 31, 60 45fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $s8, 56($sp) 46d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 30, 56 471f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $gp, 52($sp) 481f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 28, 52 491f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s7, 48($sp) 501f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 23, 48 511f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s6, 44($sp) 521f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 22, 44 531f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s5, 40($sp) 541f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 21, 40 551f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s4, 36($sp) 561f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 20, 36 571f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s3, 32($sp) 581f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 19, 32 591f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s2, 28($sp) 601f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 18, 28 611f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s1, 24($sp) 621f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 17, 24 631f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s0, 20($sp) 641f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 16, 20 651f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao # 1 word for alignment, 4 open words for args $a0-$a3, bottom will hold Method* 665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC. 715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Does not include rSUSPEND or rSELF 721f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao * callee-save: $s2-$s8 + $gp + $ra, 9 total + 3 words padding + 4 open words for args 735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_ONLY_CALLEE_SAVE_FRAME 754eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, -64 76d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset 64 775c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 785c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe // Ugly compile-time check, but we only have the preprocessor. 795c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_REFS_ONLY_CALLEE_SAVE != 64) 805c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "REFS_ONLY_CALLEE_SAVE_FRAME(MIPS) size not as expected." 815c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif 825c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 834eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $ra, 60($sp) 84d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 31, 60 854eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $s8, 56($sp) 86d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 30, 56 871f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $gp, 52($sp) 881f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 28, 52 891f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s7, 48($sp) 901f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 23, 48 911f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s6, 44($sp) 921f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 22, 44 931f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s5, 40($sp) 941f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 21, 40 951f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s4, 36($sp) 961f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 20, 36 971f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s3, 32($sp) 981f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 19, 32 991f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s2, 28($sp) 1001f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 18, 28 101fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao # 3 words for alignment and extra args, 4 open words for args $a0-$a3, bottom will hold Method* 1025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 1054eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $ra, 60($sp) 106bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 1072a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s8, 56($sp) 108bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 1092a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $gp, 52($sp) 110bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 28 1112a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s7, 48($sp) 112bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 23 1132a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s6, 44($sp) 114bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 22 1152a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s5, 40($sp) 116bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 21 1172a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s4, 36($sp) 118bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 20 1192a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s3, 32($sp) 120bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 19 1212a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s2, 28($sp) 122bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 18 1234eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, 64 124d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -64 1255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 1284eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $ra, 60($sp) 129bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 1302a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s8, 56($sp) 131bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 1322a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $gp, 52($sp) 133bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 28 1342a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s7, 48($sp) 135bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 23 1362a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s6, 44($sp) 137bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 22 1382a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s5, 40($sp) 139bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 21 1402a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s4, 36($sp) 141bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 20 1422a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s3, 32($sp) 143bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 19 1442a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s2, 28($sp) 145bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 18 1467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1474eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, 64 148d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -64 1495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 1535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC. 1541f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao * callee-save: $a1-$a3, $s2-$s8 + $gp + $ra, 12 total + 3 words padding + method* 1555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 1571f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao addiu $sp, $sp, -64 1581f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_adjust_cfa_offset 64 1595c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 1605c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe // Ugly compile-time check, but we only have the preprocessor. 1615c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#if (FRAME_SIZE_REFS_AND_ARGS_CALLEE_SAVE != 64) 1625c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#error "REFS_AND_ARGS_CALLEE_SAVE_FRAME(MIPS) size not as expected." 1635c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe#endif 1645c1e4352614d61fed6868567e58b96682828cb4dAndreas Gampe 1651f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $ra, 60($sp) 1661f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 31, 60 1671f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s8, 56($sp) 1681f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 30, 56 1691f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $gp, 52($sp) 1701f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 28, 52 1711f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s7, 48($sp) 1721f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 23, 48 1731f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s6, 44($sp) 1741f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 22, 44 1751f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s5, 40($sp) 1761f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 21, 40 1771f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s4, 36($sp) 1781f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 20, 36 1791f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s3, 32($sp) 1801f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 19, 32 1811f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s2, 28($sp) 1821f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 18, 28 1837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a3, 12($sp) 184d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 7, 12 1857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a2, 8($sp) 186d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 6, 8 1877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a1, 4($sp) 188d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 5, 4 189fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao # bottom will hold Method* 1905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 1932a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $ra, 60($sp) 194bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 1952a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s8, 56($sp) 196bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 1972a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $gp, 52($sp) 198bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 28 1992a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s7, 48($sp) 200bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 23 2012a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s6, 44($sp) 202bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 22 2032a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s5, 40($sp) 204bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 21 2052a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s4, 36($sp) 206bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 20 2072a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s3, 32($sp) 208bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 19 2092a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s2, 28($sp) 210bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 18 2112a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $a3, 12($sp) 212bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 7 2132a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $a2, 8($sp) 214bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 6 2152a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $a1, 4($sp) 216bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 5 217468532ea115657709bc32ee498e701a4c71762d4Ian Rogers addiu $sp, $sp, 64 # pop frame 2181f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_adjust_cfa_offset -64 2195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending 2235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * exception is Thread::Current()->exception_ 2245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 2255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro DELIVER_PENDING_EXCEPTION 2268161c0336b97e11e02c000af357f8f40de2e23e4jeffhao SETUP_SAVE_ALL_CALLEE_SAVE_FRAME # save callee saves for throw 2278161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a0, rSELF # pass Thread::Current 2288161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artDeliverPendingExceptionFromCode 2298161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artDeliverPendingExceptionFromCode(Thread*, $sp) 2308161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, $sp # pass $sp 2315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NO_EXCEPTION 2347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 2355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 2368161c0336b97e11e02c000af357f8f40de2e23e4jeffhao bnez $t0, 1f # success if no exception is pending 2375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 2395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 2415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 2425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_ZERO 2455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 2467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $v0, 1f # success? 2475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return on success 2495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 2515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 2525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 254cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro RETURN_IF_RESULT_IS_NON_ZERO 2555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 2567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao beqz $v0, 1f # success? 2575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return on success 2595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 2615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 2625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * On entry $a0 is uint32_t* gprs_ and $a1 is uint32_t* fprs_ 2665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * FIXME: just guessing about the shape of the jmpbuf. Where will pc be? 2675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 268d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_do_long_jump 2697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f0, 0($a1) 2707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f1, 4($a1) 2717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f2, 8($a1) 2727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f3, 12($a1) 2737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f4, 16($a1) 2747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f5, 20($a1) 2757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f6, 24($a1) 2767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f7, 28($a1) 2777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f8, 32($a1) 2787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f9, 36($a1) 2797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f10, 40($a1) 2807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f11, 44($a1) 2817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f12, 48($a1) 2827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f13, 52($a1) 2837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f14, 56($a1) 2847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f15, 60($a1) 2857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f16, 64($a1) 2867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f17, 68($a1) 2877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f18, 72($a1) 2887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f19, 76($a1) 2897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f20, 80($a1) 2907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f21, 84($a1) 2917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f22, 88($a1) 2927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f23, 92($a1) 2937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f24, 96($a1) 2947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f25, 100($a1) 2957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f26, 104($a1) 2967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f27, 108($a1) 2977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f28, 112($a1) 2987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f29, 116($a1) 2997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f30, 120($a1) 3007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f31, 124($a1) 3017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $at, 4($a0) 3027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v0, 8($a0) 3037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v1, 12($a0) 3047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 20($a0) 3057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 24($a0) 3067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a3, 28($a0) 3077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, 32($a0) 3087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t1, 36($a0) 3097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t2, 40($a0) 3107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t3, 44($a0) 3117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t4, 48($a0) 3127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t5, 52($a0) 3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t6, 56($a0) 3147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t7, 60($a0) 3157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s0, 64($a0) 3167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s1, 68($a0) 3177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s2, 72($a0) 3187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s3, 76($a0) 3197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s4, 80($a0) 3207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s5, 84($a0) 3217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s6, 88($a0) 3227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s7, 92($a0) 3237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t8, 96($a0) 3247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t9, 100($a0) 3257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $k0, 104($a0) 3267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $k1, 108($a0) 3277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $gp, 112($a0) 3287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $sp, 116($a0) 3297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $fp, 120($a0) 3307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $ra, 124($a0) 3317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a0, 16($a0) 3327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v0, $zero # clear result registers r0 and r1 3337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # do long jump 3347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v1, $zero 335d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_do_long_jump 3365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code, saves most registers (forms basis of long jump context) and passes 3395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at 3405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the thread. On entry r0 holds Throwable* 3415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 342468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_deliver_exception 34312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 34457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3458161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, rSELF # pass Thread::Current 3468161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artDeliverExceptionFromCode 3478161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artDeliverExceptionFromCode(Throwable*, Thread*, $sp) 3488161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a2, $sp # pass $sp 349468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_deliver_exception 3505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver a NullPointerException 3535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 354d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowNullPointerExceptionFromCode 355468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_null_pointer_exception 35612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 35786bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_throw_null_pointer_exception_gp_set: 35857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3598161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a0, rSELF # pass Thread::Current 3608161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowNullPointerExceptionFromCode 3618161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowNullPointerExceptionFromCode(Thread*, $sp) 3628161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, $sp # pass $sp 363468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_null_pointer_exception 3645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArithmeticException 3675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 368d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowDivZeroFromCode 369468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_div_zero 37012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 37157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF # pass Thread::Current 3738161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowDivZeroFromCode 3748161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowDivZeroFromCode(Thread*, $sp) 3757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp # pass $sp 376468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_div_zero 3775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException 3805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 381d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowArrayBoundsFromCode 382468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_array_bounds 38312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 38486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_throw_array_bounds_gp_set: 38557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3868161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a2, rSELF # pass Thread::Current 3878161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowArrayBoundsFromCode 3888161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowArrayBoundsFromCode(index, limit, Thread*, $sp) 3898161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a3, $sp # pass $sp 390468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_array_bounds 3915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 39257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 39357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a StackOverflowError. 39457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 395d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowStackOverflowFromCode 396468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_stack_overflow 39712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 39857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3998161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a0, rSELF # pass Thread::Current 4008161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowStackOverflowFromCode 4018161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowStackOverflowFromCode(Thread*, $sp) 4028161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, $sp # pass $sp 403468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_stack_overflow 4045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 40557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 40657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a NoSuchMethodError. 40757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 408d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowNoSuchMethodFromCode 409468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_no_such_method 41012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 41157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 4128161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, rSELF # pass Thread::Current 4138161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowNoSuchMethodFromCode 4148161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowNoSuchMethodFromCode(method_idx, Thread*, $sp) 4158161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a2, $sp # pass $sp 416468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_no_such_method 4175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 4195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * All generated callsites for interface invokes and invocation slow paths will load arguments 4207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain 4215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the method_idx. This wrapper will save arg1-arg3, load the caller's Method*, align the 4225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * stack and call the appropriate C helper. 4237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1. 4245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 4257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting 4267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * of the target Method* in $v0 and method->code_ in $v1. 4275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 428fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao * If unsuccessful, the helper will return NULL/NULL. There will be a pending exception in the 4295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * thread and we branch to another stub to deliver it. 4305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 4315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On success this wrapper will restore arguments and *jump* to the target, leaving the lr 4325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * pointing back to the original caller. 4335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 4345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name 4355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern \cxx_name 436d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY \c_name 43712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 4387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME # save callee saves in case allocation triggers GC 4391f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao lw $a2, 64($sp) # pass caller Method* 440fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $t0, $sp # save $sp 44158df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, -32 # make space for extra args 44258df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset 32 4437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 444d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 28, 12 4457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal \cxx_name # (method_idx, this, caller, Thread*, $sp) 446fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $t0, 16($sp) # pass $sp 44758df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, 32 # release out args 44858df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset -32 449fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $a0, $v0 # save target Method* 45030a3317577d84feafa859b3e39d1545a995f0b7cjeffhao move $t9, $v1 # save $v0->code_ 4515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 452fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao beqz $v0, 1f 4535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 45430a3317577d84feafa859b3e39d1545a995f0b7cjeffhao jr $t9 4555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 4565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 4575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 458d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND \c_name 4595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 4605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4618dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline 4628dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck 4635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4648dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck 4658dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck 4668dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck 4678dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck 4685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 46979fe539587d4c09244172d0168eeed0ec9770466Jeff Hao /* 470ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Invocation stub for quick code. 4715d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * On entry: 4725d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a0 = method pointer 4735d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a1 = argument array or NULL for no argument methods 4745d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a2 = size of argument array in bytes 4755d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a3 = (managed) thread pointer 4766474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao * [sp + 16] = JValue* result 4770177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers * [sp + 20] = shorty 4785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao */ 4795d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoENTRY art_quick_invoke_stub 4805d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao GENERATE_GLOBAL_POINTER 4815d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $a0, 0($sp) # save out a0 4825d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, -16 # spill s0, s1, fp, ra 4835d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_adjust_cfa_offset 16 4845d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $ra, 12($sp) 4855d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 31, 12 4865d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $fp, 8($sp) 4875d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 30, 8 4885d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $s1, 4($sp) 4895d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 17, 4 4905d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $s0, 0($sp) 4915d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 16, 0 4925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $fp, $sp # save sp in fp 4935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_def_cfa_register 30 4945d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $s1, $a3 # move managed thread pointer into s1 4955d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $s0, $zero, SUSPEND_CHECK_INTERVAL # reset s0 to suspend check interval 4965d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $t0, $a2, 16 # create space for method pointer in frame 497b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung srl $t0, $t0, 4 # shift the frame size right 4 498b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung sll $t0, $t0, 4 # shift the frame size left 4 to align to 16 bytes 4995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao subu $sp, $sp, $t0 # reserve stack space for argument array 5005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $a0, $sp, 4 # pass stack pointer + method ptr as dest for memcpy 5015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jal memcpy # (dest, src, bytes) 5025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, -16 # make space for argument slots for memcpy 5035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, 16 # restore stack after memcpy 5045d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a0, 16($fp) # restore method* 5055d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a1, 4($sp) # copy arg value for a1 5065d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a2, 8($sp) # copy arg value for a2 5075d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a3, 12($sp) # copy arg value for a3 508ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers lw $t9, METHOD_QUICK_CODE_OFFSET($a0) # get pointer to the code 5095d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jalr $t9 # call the method 5105d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $zero, 0($sp) # store NULL for method* at bottom of frame 5115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $sp, $fp # restore the stack 5125d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $s0, 0($sp) 513bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 16 5145d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $s1, 4($sp) 515bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 17 5165d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $fp, 8($sp) 517bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 5185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $ra, 12($sp) 519bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 5205d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, 16 5215d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_adjust_cfa_offset -16 5225d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $t0, 16($sp) # get result pointer 5230177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers lw $t1, 20($sp) # get shorty 5240177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers lb $t1, 0($t1) # get result type char 5256474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao li $t2, 68 # put char 'D' into t2 5266474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao beq $t1, $t2, 1f # branch if result type char == 'D' 5276474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao li $t3, 70 # put char 'F' into t3 5286474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao beq $t1, $t3, 1f # branch if result type char == 'F' 5295d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $v0, 0($t0) # store the result 5306474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao jr $ra 5315d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $v1, 4($t0) # store the other half of the result 5326474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao1: 53319ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao s.s $f0, 0($t0) # store floating point result 5345d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jr $ra 53519ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao s.s $f1, 4($t0) # store other half of floating point result 5365d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoEND art_quick_invoke_stub 5375d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao 5385d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao /* 5395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on 5405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * failure. 5415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 542d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artHandleFillArrayDataFromCode 543468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_handle_fill_data 54412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 5457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 5467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 5477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artHandleFillArrayDataFromCode # (Array*, const DexFile::Payload*, Thread*, $sp) 5487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 549fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao RETURN_IF_ZERO 550468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_handle_fill_data 5515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 55357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code that calls artLockObjectFromCode, may block for GC. 5545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 555d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artLockObjectFromCode 556468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_lock_object 55712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 55886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $a0, .Lart_quick_throw_null_pointer_exception_gp_set 559a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 5607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case we block 5617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 5627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artLockObjectFromCode # (Object* obj, Thread*, $sp) 5637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # pass $sp 5646bcd163d322b867578fbcfe60e4e3b247c42974bIan Rogers RETURN_IF_ZERO 565468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_lock_object 5665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 5685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure. 5695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 570d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artUnlockObjectFromCode 571468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_unlock_object 57212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 57386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $a0, .Lart_quick_throw_null_pointer_exception_gp_set 574a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 5757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 5767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 5777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artUnlockObjectFromCode # (Object* obj, Thread*, $sp) 5787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # pass $sp 5795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 580468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_unlock_object 5815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 5835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure. 5845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 585a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .extern artThrowClassCastException 586468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_cast 58712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 588a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, -16 589a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset 16 590a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $ra, 12($sp) 591a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_rel_offset 31, 12 592a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $t9, 8($sp) 593a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a1, 4($sp) 594a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a0, 0($sp) 595a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jal artIsAssignableFromCode 596a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 59786bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $v0, .Lthrow_class_cast_exception 598a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $ra, 12($sp) 599a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $ra 600a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, 16 601a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset -16 60286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lthrow_class_cast_exception: 603a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t9, 8($sp) 604a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a1, 4($sp) 605a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a0, 0($sp) 606a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, 16 607a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset -16 608a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 609a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a2, rSELF # pass Thread::Current 610a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers la $t9, artThrowClassCastException 611a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $t9 # artThrowClassCastException (Class*, Class*, Thread*, SP) 612a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a3, $sp # pass $sp 613468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_cast 6145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 616a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers * Entry from managed code for array put operations of objects where the value being stored 617a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers * needs to be checked for compatibility. 618a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers * a0 = array, a1 = index, a2 = value 6195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 620a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_null_and_bound_check 62112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 62286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bnez $a0, .Lart_quick_aput_obj_with_bound_check_gp_set 623a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 62486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers b .Lart_quick_throw_null_pointer_exception_gp_set 625a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 626a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_null_and_bound_check 627a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers 628a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_bound_check 629a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers GENERATE_GLOBAL_POINTER 63086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_aput_obj_with_bound_check_gp_set: 631a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t0, ARRAY_LENGTH_OFFSET($a0) 632a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sltu $t1, $a1, $t0 63386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bnez $t1, .Lart_quick_aput_obj_gp_set 634a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 635a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a0, $a1 63686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers b .Lart_quick_throw_array_bounds_gp_set 637a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a1, $t0 638a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_bound_check 639a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers 640a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj 641a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers GENERATE_GLOBAL_POINTER 64286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_aput_obj_gp_set: 64386bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $a2, .Ldo_aput_null 644a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 645a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t0, CLASS_OFFSET($a0) 646a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t1, CLASS_OFFSET($a2) 647a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t0, CLASS_COMPONENT_TYPE_OFFSET($t0) 64886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bne $t1, $t0, .Lcheck_assignability # value's type == array's component type - trivial assignability 649a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 65086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput: 651a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sll $a1, $a1, 2 652a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $t0, $a0, $a1 653a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a2, OBJECT_ARRAY_DATA_OFFSET($t0) 654a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t0, THREAD_CARD_TABLE_OFFSET(rSELF) 655a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers srl $t1, $a0, 7 656a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $t1, $t1, $t0 657a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sb $t0, ($t1) 658a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $ra 659a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 66086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput_null: 661a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sll $a1, $a1, 2 662a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $t0, $a0, $a1 663a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a2, OBJECT_ARRAY_DATA_OFFSET($t0) 664a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $ra 665a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 66686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lcheck_assignability: 667a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, -32 668a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset 32 669a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $ra, 28($sp) 670a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_rel_offset 31, 28 671a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $t9, 12($sp) 672a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a2, 8($sp) 673a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a1, 4($sp) 674a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a0, 0($sp) 675a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a1, $t1 676a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a0, $t0 677a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jal artIsAssignableFromCode # (Class*, Class*) 678a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 679a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $ra, 28($sp) 680a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t9, 12($sp) 681a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a2, 8($sp) 682a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a1, 4($sp) 683a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a0, 0($sp) 684a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $sp, 32 685a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset -32 68686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bnez $v0, .Ldo_aput 687a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 688a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 689a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a1, $a2 690a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a2, rSELF # pass Thread::Current 691a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers la $t9, artThrowArrayStoreException 692a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $t9 # artThrowArrayStoreException(Class*, Class*, Thread*, SP) 693a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a3, $sp # pass $sp 694a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj 6955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 6975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when uninitialized static storage, this stub will run the class 6985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * initializer and deliver the exception on error. On success the static storage base is 6995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * returned. 7005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 701d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeStaticStorageFromCode 702468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_static_storage 70312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 7075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeStaticStorageFromCode 7087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 709cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 710468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_static_storage 7115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 71357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code when dex cache misses for a type_idx. 7145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 715d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeTypeFromCode 716468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type 71712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 7215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeFromCode 7227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 723cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 724468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type 7255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 7275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when type_idx needs to be checked for access and dex cache may also 72857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * miss. 7295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 730d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeTypeAndVerifyAccessFromCode 731468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type_and_verify_access 73212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 7365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeAndVerifyAccessFromCode 7377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 738cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 739468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type_and_verify_access 7405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 74257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 32-bit primitive value. 7435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 744d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet32StaticFromCode 745468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_static 74612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7484eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 7497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 750fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet32StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 7517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 7525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 753468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_static 7545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 75657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 64-bit primitive value. 7575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 758d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet64StaticFromCode 759468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_static 76012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7624eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 7637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 764fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet64StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 7657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 7665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 767468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_static 7685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 77057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load an object reference. 7715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 772d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGetObjStaticFromCode 773468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_static 77412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7764eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 7777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 778fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGetObjStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 7797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 7805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 781468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_static 7825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 78457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 32-bit primitive value. 7855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 786d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet32InstanceFromCode 787468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_instance 78812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7904eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 7917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 792fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet32InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 7934eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 7945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 795468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_instance 7965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 79857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 64-bit primitive value. 7995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 800d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet64InstanceFromCode 801468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_instance 80212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8044eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 8057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 806fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet64InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 8074eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 809468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_instance 8105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 81257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load an object reference. 8135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 814d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGetObjInstanceFromCode 815468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_instance 81612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8184eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 8197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 820fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGetObjInstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 8214eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 823468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_instance 8245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 82657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 32-bit primitive value. 8275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 828d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32StaticFromCode 829468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_static 83012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8324eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 8337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 834fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSet32StaticFromCode # (field_idx, new_val, referrer, Thread*, $sp) 8354eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 837468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_static 8385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 84057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 64-bit primitive value. 8415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 842d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32StaticFromCode 843468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_static 84412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8464eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 847fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 8487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSet64StaticFromCode # (field_idx, referrer, new_val, Thread*, $sp) 8494eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 8505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 851468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_static 8525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 85457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store an object reference. 8555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 856d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSetObjStaticFromCode 857468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_static 85812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8604eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 8617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 862fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSetObjStaticFromCode # (field_idx, new_val, referrer, Thread*, $sp) 8634eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 865468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_static 8665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 86857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 32-bit primitive value. 8695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 870d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32InstanceFromCode 871468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_instance 87212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8744eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a3, 64($sp) # pass referrer's Method* 875fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 8767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSet32InstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*, $sp) 8774eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 8785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 879468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_instance 8805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 88257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 64-bit primitive value. 8835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 884d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32InstanceFromCode 885468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_instance 88612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 888fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 889fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSet64InstanceFromCode # (field_idx, Object*, new_val, Thread*, $sp) 8904eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 8915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 892468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_instance 8935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 89557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store an object reference. 8965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 897d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSetObjInstanceFromCode 898468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_instance 89912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 9007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9014eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a3, 64($sp) # pass referrer's Method* 902fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 903fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSetObjInstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*, $sp) 9044eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 9055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 906468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_instance 9075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 9095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code to resolve a string, this stub will allocate a String and deliver an 9105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * exception on error. On success the String is returned. R0 holds the referring method, 9115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * R1 holds the string index. The fast path check for hit in strings cache has already been 9125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * performed. 9135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 914d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artResolveStringFromCode 915468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolve_string 91612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 9177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 9197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*, $sp) 9205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artResolveStringFromCode 9217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 922cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 923468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolve_string 9245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9253b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi 926cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier// Macro to facilitate adding new allocation entrypoints. 927cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro TWO_ARG_DOWNCALL name, entrypoint, return 928cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier .extern \entrypoint 929cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name 93012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 9317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 933cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier jal \entrypoint 9347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 935cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier \return 936cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name 937cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm 9385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 939cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro THREE_ARG_DOWNCALL name, entrypoint, return 940cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier .extern \entrypoint 941cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name 9423b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi GENERATE_GLOBAL_POINTER 9433b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9443b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi move $a3, rSELF # pass Thread::Current 945cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier jal \entrypoint 9463b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi sw $sp, 16($sp) # pass $sp 947cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier \return 948cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name 949cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm 9505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9517410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier// Generate the allocation entrypoints for each allocator. 9527410f29b4dae223befac036ea567d7f33351dad1Mathieu ChartierGENERATE_ALL_ALLOC_ENTRYPOINTS 9533b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi 9545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 95557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code when the value in rSUSPEND has been decremented to 0. 9565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 957d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artTestSuspendFromCode 958d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_test_suspend 95912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 960474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers lh $a0, THREAD_FLAGS_OFFSET(rSELF) 9617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $a0, 1f 9627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addi rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL # reset rSUSPEND to SUSPEND_CHECK_INTERVAL 9637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 9645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 9655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 9667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF 9677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves for stack crawl 9687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artTestSuspendFromCode # (Thread*, $sp) 9697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp 9705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 971d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_test_suspend 9725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 9745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code that is attempting to call a method on a proxy class. On entry 97557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * r0 holds the proxy method; r1, r2 and r3 may contain arguments. 9765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 9775fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao .extern artQuickProxyInvokeHandler 978d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_proxy_invoke_handler 97912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 9805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 9817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a0, 0($sp) # place proxy method at bottom of frame 9827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 9835fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao jal artQuickProxyInvokeHandler # (Method* proxy method, receiver, Thread*, SP) 984af6e67a4816d2593586115b89faa659225363246Ian Rogers move $a3, $sp # pass $sp 9857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 9861984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 9877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $t0, 1f 988b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v0, $f0 # place return value to FP return value 9897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 990b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v1, $f1 # place return value to FP return value 9915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 9925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 993d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_proxy_invoke_handler 9945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 99588474b416eb257078e590bf9bc7957cee604a186Jeff Hao /* 99688474b416eb257078e590bf9bc7957cee604a186Jeff Hao * Called to resolve an imt conflict. t0 is a hidden argument that holds the target method's 99788474b416eb257078e590bf9bc7957cee604a186Jeff Hao * dex method index. 99888474b416eb257078e590bf9bc7957cee604a186Jeff Hao */ 99988474b416eb257078e590bf9bc7957cee604a186Jeff HaoENTRY art_quick_imt_conflict_trampoline 100088474b416eb257078e590bf9bc7957cee604a186Jeff Hao GENERATE_GLOBAL_POINTER 100188474b416eb257078e590bf9bc7957cee604a186Jeff Hao lw $a0, 0($sp) # load caller Method* 100288474b416eb257078e590bf9bc7957cee604a186Jeff Hao lw $a0, METHOD_DEX_CACHE_METHODS_OFFSET($a0) # load dex_cache_resolved_methods 100388474b416eb257078e590bf9bc7957cee604a186Jeff Hao sll $t0, 2 # convert target method offset to bytes 100488474b416eb257078e590bf9bc7957cee604a186Jeff Hao add $a0, $t0 # get address of target method 100588474b416eb257078e590bf9bc7957cee604a186Jeff Hao lw $a0, OBJECT_ARRAY_DATA_OFFSET($a0) # load the target method 100688474b416eb257078e590bf9bc7957cee604a186Jeff Hao la $t9, art_quick_invoke_interface_trampoline 100788474b416eb257078e590bf9bc7957cee604a186Jeff Hao jr $t9 100888474b416eb257078e590bf9bc7957cee604a186Jeff HaoEND art_quick_imt_conflict_trampoline 100988474b416eb257078e590bf9bc7957cee604a186Jeff Hao 1010468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .extern artQuickResolutionTrampoline 1011468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolution_trampoline 1012468532ea115657709bc32ee498e701a4c71762d4Ian Rogers GENERATE_GLOBAL_POINTER 1013468532ea115657709bc32ee498e701a4c71762d4Ian Rogers SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 1014468532ea115657709bc32ee498e701a4c71762d4Ian Rogers move $a2, rSELF # pass Thread::Current 101565d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers jal artQuickResolutionTrampoline # (Method* called, receiver, Thread*, SP) 1016468532ea115657709bc32ee498e701a4c71762d4Ian Rogers move $a3, $sp # pass $sp 1017468532ea115657709bc32ee498e701a4c71762d4Ian Rogers beqz $v0, 1f 1018468532ea115657709bc32ee498e701a4c71762d4Ian Rogers lw $a0, 0($sp) # load resolved method to $a0 10191984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 102065d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers move $t9, $v0 # code pointer must be in $t9 to generate the global pointer 1021468532ea115657709bc32ee498e701a4c71762d4Ian Rogers jr $v0 # tail call to method 10221984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier nop 1023468532ea115657709bc32ee498e701a4c71762d4Ian Rogers1: 10241984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 1025468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DELIVER_PENDING_EXCEPTION 1026468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolution_trampoline 1027468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 10282da882315a61072664f7ce3c212307342e907207Andreas GampeUNIMPLEMENTED art_quick_generic_jni_trampoline 10292da882315a61072664f7ce3c212307342e907207Andreas Gampe 1030468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .extern artQuickToInterpreterBridge 1031468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_to_interpreter_bridge 10327db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers GENERATE_GLOBAL_POINTER 10337db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 10347db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers move $a1, rSELF # pass Thread::Current 1035468532ea115657709bc32ee498e701a4c71762d4Ian Rogers jal artQuickToInterpreterBridge # (Method* method, Thread*, SP) 10367db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers move $a2, $sp # pass $sp 10377db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 10381984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 10397db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers bnez $t0, 1f 1040b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v0, $f0 # place return value to FP return value 10417db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers jr $ra 1042b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v1, $f1 # place return value to FP return value 10437db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers1: 10447db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers DELIVER_PENDING_EXCEPTION 1045468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_to_interpreter_bridge 10467db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers 10475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1048725a957985171d712d5c048cc3d00ff14968784bjeffhao * Routine that intercepts method calls and returns. 10495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1050d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInstrumentationMethodEntryFromCode 1051d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInstrumentationMethodExitFromCode 1052468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_instrumentation_entry 105312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 105462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 105512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $sp # remember bottom of caller's frame 105662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, -32 # space for args, pad (3 words), arguments (5 words) 105762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset 32 105862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $a0, 28($sp) # save arg0 105962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $ra, 16($sp) # pass $ra 106062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a3, $t0 # pass $sp 106162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artInstrumentationMethodEntryFromCode # (Method*, Object*, Thread*, SP, LR) 106262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a2, rSELF # pass Thread::Current 10638161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $t9, $v0 # $t9 holds reference to code 106462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $a0, 28($sp) # restore arg0 106562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, 32 # remove args 106662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset -32 106762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 10688161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jalr $t9 # call method 106962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers nop 1070468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_entry 10715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* intentional fallthrough */ 1072468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .global art_quick_instrumentation_exit 1073468532ea115657709bc32ee498e701a4c71762d4Ian Rogersart_quick_instrumentation_exit: 1074d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_startproc 107512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao addiu $t9, $ra, 4 # put current address into $t9 to rebuild $gp 107612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 107712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $sp # remember bottom of caller's frame 107862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers SETUP_REF_ONLY_CALLEE_SAVE_FRAME 107962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, -48 # save return values and set up args 108062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset 48 108162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $v0, 32($sp) 1082d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 2, 0 108362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $v1, 36($sp) 1084d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 3, 4 108562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f0, 40($sp) 108662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f1, 44($sp) 108762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f0, 16($sp) # pass fpr result 108862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f1, 20($sp) 108962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a2, $v0 # pass gpr result 109062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a3, $v1 109112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $a1, $t0 # pass $sp 109262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artInstrumentationMethodExitFromCode # (Thread*, SP, gpr_res, fpr_res) 109312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $a0, rSELF # pass Thread::Current 109412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $v0 # set aside returned link register 109512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $ra, $v1 # set link register for deoptimization 109662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $v0, 32($sp) # restore return values 109762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $v1, 36($sp) 109862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers l.s $f0, 40($sp) 109962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers l.s $f1, 44($sp) 110012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao jr $t0 # return 110162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, 112 # 48 bytes of args + 64 bytes of callee save frame 110262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset -112 1103468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_exit 11045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 110512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao /* 110662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization 110762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers * will long jump to the upcall with a special exception of -1. 110812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao */ 1109d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artDeoptimize 1110d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artEnterInterpreterFromDeoptimize 1111d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deoptimize 111212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 111314dd5a82ad85a28612bf86e755ff929d767cea4cJeff Hao SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 111462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a0, rSELF # pass Thread::current 111562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artDeoptimize # artDeoptimize(Thread*, SP) 111612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao # Returns caller method's frame size. 111762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a1, $sp # pass $sp 1118d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deoptimize 111912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao 11205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 11215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 11225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 11235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 11245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 11255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 11267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 11277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 11287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 11295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1130d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shl_long 11315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* shl-long vAA, vBB, vCC */ 11327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v0, $a0, $a2 # rlo<- alo << (shift&31) 11337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $v1, $a2 # rhi<- 31-shift (shift is 5b) 11347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, 1 11357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, $v1 # alo<- alo >> (32-(shift&31)) 11367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v1, $a1, $a2 # rhi<- ahi << (shift&31) 11377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v1, $a0 # rhi<- rhi | alo 11387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift< shift & 0x20 11397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $v0, $a2 # rhi<- rlo (if shift&0x20) 11407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1141fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao movn $v0, $zero, $a2 # rlo<- 0 (if shift&0x20) 1142d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shl_long 11435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 11445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 11455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 11465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 11475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 11485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 11495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 11507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 11517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 11527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 11535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1154d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .global art_quick_shr_long 1155d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shr_long 11567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 11577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 11587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $a3, $a1, 31 # $a3<- sign(ah) 11597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 11607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 11617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 11627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 11637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 11647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 11657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 11667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $a3, $a2 # rhi<- sign(ahi) (if shift&0x20) 1167d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shr_long 11685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 11695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 11705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 11715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 11725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 11735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 11745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 11755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r0: low word 11765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r1: high word 11775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r2: shift count 11785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 11795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* ushr-long vAA, vBB, vCC */ 1180d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .global art_quick_ushr_long 1181d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_ushr_long 1182fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao srl $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 11837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 11847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 11857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 11867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 11877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 11887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 11897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 11907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1191fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao movn $v1, $zero, $a2 # rhi<- 0 (if shift&0x20) 1192d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_ushr_long 11937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1194d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_indexof 11957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 11960703060875166106af3d490c6c264611aea67ec8jeffhao nop 1197d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_indexof 11987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1199d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_string_compareto 12007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 12010703060875166106af3d490c6c264611aea67ec8jeffhao nop 1202d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_string_compareto 1203