quick_entrypoints_mips.S revision c3d131e1ec030b4ff5c44fe2a45d5fb45b3295af
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) 301748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman .set push 302748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman .set nomacro 303748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman .set noat 3047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $at, 4($a0) 305748dd957eecbce2f379a3182ce95c19be308a54eChris Dearman .set pop 3067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v0, 8($a0) 3077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v1, 12($a0) 3087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 20($a0) 3097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 24($a0) 3107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a3, 28($a0) 3117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, 32($a0) 3127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t1, 36($a0) 3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t2, 40($a0) 3147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t3, 44($a0) 3157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t4, 48($a0) 3167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t5, 52($a0) 3177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t6, 56($a0) 3187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t7, 60($a0) 3197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s0, 64($a0) 3207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s1, 68($a0) 3217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s2, 72($a0) 3227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s3, 76($a0) 3237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s4, 80($a0) 3247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s5, 84($a0) 3257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s6, 88($a0) 3267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s7, 92($a0) 3277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t8, 96($a0) 3287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t9, 100($a0) 3297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $gp, 112($a0) 3307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $sp, 116($a0) 3317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $fp, 120($a0) 3327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $ra, 124($a0) 3337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a0, 16($a0) 3347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v0, $zero # clear result registers r0 and r1 3357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # do long jump 3367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v1, $zero 337d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_do_long_jump 3385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code, saves most registers (forms basis of long jump context) and passes 3415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at 3425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the thread. On entry r0 holds Throwable* 3435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 344468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_deliver_exception 34512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 34657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3478161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, rSELF # pass Thread::Current 3488161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artDeliverExceptionFromCode 3498161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artDeliverExceptionFromCode(Throwable*, Thread*, $sp) 3508161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a2, $sp # pass $sp 351468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_deliver_exception 3525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver a NullPointerException 3555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 356d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowNullPointerExceptionFromCode 357468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_null_pointer_exception 35812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 35986bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_throw_null_pointer_exception_gp_set: 36057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3618161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a0, rSELF # pass Thread::Current 3628161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowNullPointerExceptionFromCode 3638161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowNullPointerExceptionFromCode(Thread*, $sp) 3648161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, $sp # pass $sp 365468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_null_pointer_exception 3665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArithmeticException 3695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 370d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowDivZeroFromCode 371468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_div_zero 37212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 37357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF # pass Thread::Current 3758161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowDivZeroFromCode 3768161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowDivZeroFromCode(Thread*, $sp) 3777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp # pass $sp 378468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_div_zero 3795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException 3825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 383d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowArrayBoundsFromCode 384468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_array_bounds 38512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 38686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_throw_array_bounds_gp_set: 38757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3888161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a2, rSELF # pass Thread::Current 3898161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowArrayBoundsFromCode 3908161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowArrayBoundsFromCode(index, limit, Thread*, $sp) 3918161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a3, $sp # pass $sp 392468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_array_bounds 3935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 39457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 39557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a StackOverflowError. 39657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 397d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowStackOverflowFromCode 398468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_stack_overflow 39912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 40057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 4018161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a0, rSELF # pass Thread::Current 4028161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowStackOverflowFromCode 4038161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowStackOverflowFromCode(Thread*, $sp) 4048161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, $sp # pass $sp 405468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_stack_overflow 4065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 40757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 40857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a NoSuchMethodError. 40957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 410d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowNoSuchMethodFromCode 411468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_no_such_method 41212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 41357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 4148161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, rSELF # pass Thread::Current 4158161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowNoSuchMethodFromCode 4168161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowNoSuchMethodFromCode(method_idx, Thread*, $sp) 4178161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a2, $sp # pass $sp 418468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_no_such_method 4195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 4215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * All generated callsites for interface invokes and invocation slow paths will load arguments 4227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain 4235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the method_idx. This wrapper will save arg1-arg3, load the caller's Method*, align the 4245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * stack and call the appropriate C helper. 4257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1. 4265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 4277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting 4287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * of the target Method* in $v0 and method->code_ in $v1. 4295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 430fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao * If unsuccessful, the helper will return NULL/NULL. There will be a pending exception in the 4315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * thread and we branch to another stub to deliver it. 4325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 4335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On success this wrapper will restore arguments and *jump* to the target, leaving the lr 4345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * pointing back to the original caller. 4355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 4365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name 4375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern \cxx_name 438d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY \c_name 43912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 4407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME # save callee saves in case allocation triggers GC 4411f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao lw $a2, 64($sp) # pass caller Method* 442fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $t0, $sp # save $sp 44358df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, -32 # make space for extra args 44458df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset 32 4457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 446d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 28, 12 4477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal \cxx_name # (method_idx, this, caller, Thread*, $sp) 448fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $t0, 16($sp) # pass $sp 44958df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, 32 # release out args 45058df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset -32 451fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $a0, $v0 # save target Method* 45230a3317577d84feafa859b3e39d1545a995f0b7cjeffhao move $t9, $v1 # save $v0->code_ 4535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 454fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao beqz $v0, 1f 4555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 45630a3317577d84feafa859b3e39d1545a995f0b7cjeffhao jr $t9 4575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 4585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 4595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 460d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND \c_name 4615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 4625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4638dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline 4648dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck 4655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4668dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck 4678dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck 4688dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck 4698dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck 4705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 47179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao /* 472ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Invocation stub for quick code. 4735d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * On entry: 4745d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a0 = method pointer 4755d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a1 = argument array or NULL for no argument methods 4765d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a2 = size of argument array in bytes 4775d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a3 = (managed) thread pointer 4786474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao * [sp + 16] = JValue* result 4790177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers * [sp + 20] = shorty 4805d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao */ 4815d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoENTRY art_quick_invoke_stub 4825d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao GENERATE_GLOBAL_POINTER 4835d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $a0, 0($sp) # save out a0 4845d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, -16 # spill s0, s1, fp, ra 4855d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_adjust_cfa_offset 16 4865d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $ra, 12($sp) 4875d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 31, 12 4885d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $fp, 8($sp) 4895d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 30, 8 4905d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $s1, 4($sp) 4915d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 17, 4 4925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $s0, 0($sp) 4935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 16, 0 4945d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $fp, $sp # save sp in fp 4955d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_def_cfa_register 30 4965d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $s1, $a3 # move managed thread pointer into s1 4975d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $s0, $zero, SUSPEND_CHECK_INTERVAL # reset s0 to suspend check interval 4985d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $t0, $a2, 16 # create space for method pointer in frame 499b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung srl $t0, $t0, 4 # shift the frame size right 4 500b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung sll $t0, $t0, 4 # shift the frame size left 4 to align to 16 bytes 5015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao subu $sp, $sp, $t0 # reserve stack space for argument array 5025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $a0, $sp, 4 # pass stack pointer + method ptr as dest for memcpy 5035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jal memcpy # (dest, src, bytes) 5045d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, -16 # make space for argument slots for memcpy 5055d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, 16 # restore stack after memcpy 5065d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a0, 16($fp) # restore method* 5075d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a1, 4($sp) # copy arg value for a1 5085d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a2, 8($sp) # copy arg value for a2 5095d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a3, 12($sp) # copy arg value for a3 510ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers lw $t9, METHOD_QUICK_CODE_OFFSET($a0) # get pointer to the code 5115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jalr $t9 # call the method 5125d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $zero, 0($sp) # store NULL for method* at bottom of frame 5135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $sp, $fp # restore the stack 5145d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $s0, 0($sp) 515bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 16 5165d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $s1, 4($sp) 517bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 17 5185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $fp, 8($sp) 519bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 5205d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $ra, 12($sp) 521bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 5225d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, 16 5235d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_adjust_cfa_offset -16 5245d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $t0, 16($sp) # get result pointer 5250177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers lw $t1, 20($sp) # get shorty 5260177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers lb $t1, 0($t1) # get result type char 5276474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao li $t2, 68 # put char 'D' into t2 5286474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao beq $t1, $t2, 1f # branch if result type char == 'D' 5296474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao li $t3, 70 # put char 'F' into t3 5306474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao beq $t1, $t3, 1f # branch if result type char == 'F' 5315d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $v0, 0($t0) # store the result 5326474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao jr $ra 5335d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $v1, 4($t0) # store the other half of the result 5346474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao1: 53519ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao s.s $f0, 0($t0) # store floating point result 5365d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jr $ra 53719ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao s.s $f1, 4($t0) # store other half of floating point result 5385d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoEND art_quick_invoke_stub 5395d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao 5405d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao /* 5415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on 5425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * failure. 5435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 544d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artHandleFillArrayDataFromCode 545468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_handle_fill_data 54612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 5477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 5487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 5497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artHandleFillArrayDataFromCode # (Array*, const DexFile::Payload*, Thread*, $sp) 5507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 551fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao RETURN_IF_ZERO 552468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_handle_fill_data 5535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 55557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code that calls artLockObjectFromCode, may block for GC. 5565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 557d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artLockObjectFromCode 558468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_lock_object 55912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 56086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $a0, .Lart_quick_throw_null_pointer_exception_gp_set 561a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 5627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case we block 5637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 5647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artLockObjectFromCode # (Object* obj, Thread*, $sp) 5657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # pass $sp 5666bcd163d322b867578fbcfe60e4e3b247c42974bIan Rogers RETURN_IF_ZERO 567468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_lock_object 5685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 5705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure. 5715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 572d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artUnlockObjectFromCode 573468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_unlock_object 57412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 57586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $a0, .Lart_quick_throw_null_pointer_exception_gp_set 576a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 5777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 5787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 5797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artUnlockObjectFromCode # (Object* obj, Thread*, $sp) 5807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # pass $sp 5815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 582468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_unlock_object 5835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 5855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure. 5865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 587a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .extern artThrowClassCastException 588468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_cast 58912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 590a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, -16 591a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset 16 592a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $ra, 12($sp) 593a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_rel_offset 31, 12 594a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $t9, 8($sp) 595a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a1, 4($sp) 596a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a0, 0($sp) 597a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jal artIsAssignableFromCode 598a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 59986bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $v0, .Lthrow_class_cast_exception 600a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $ra, 12($sp) 601a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $ra 602a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, 16 603a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset -16 60486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lthrow_class_cast_exception: 605a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t9, 8($sp) 606a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a1, 4($sp) 607a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a0, 0($sp) 608a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, 16 609a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset -16 610a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 611a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a2, rSELF # pass Thread::Current 612a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers la $t9, artThrowClassCastException 613a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $t9 # artThrowClassCastException (Class*, Class*, Thread*, SP) 614a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a3, $sp # pass $sp 615468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_cast 6165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 618a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers * Entry from managed code for array put operations of objects where the value being stored 619a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers * needs to be checked for compatibility. 620a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers * a0 = array, a1 = index, a2 = value 6215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 622a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_null_and_bound_check 62312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 62486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bnez $a0, .Lart_quick_aput_obj_with_bound_check_gp_set 625a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 62686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers b .Lart_quick_throw_null_pointer_exception_gp_set 627a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 628a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_null_and_bound_check 629a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers 630a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_bound_check 631a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers GENERATE_GLOBAL_POINTER 63286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_aput_obj_with_bound_check_gp_set: 633a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t0, ARRAY_LENGTH_OFFSET($a0) 634a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sltu $t1, $a1, $t0 63586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bnez $t1, .Lart_quick_aput_obj_gp_set 636a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 637a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a0, $a1 63886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers b .Lart_quick_throw_array_bounds_gp_set 639a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a1, $t0 640a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_bound_check 641a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers 642a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj 643a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers GENERATE_GLOBAL_POINTER 64486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_aput_obj_gp_set: 64586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $a2, .Ldo_aput_null 646a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 647a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t0, CLASS_OFFSET($a0) 648a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t1, CLASS_OFFSET($a2) 649a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t0, CLASS_COMPONENT_TYPE_OFFSET($t0) 65086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bne $t1, $t0, .Lcheck_assignability # value's type == array's component type - trivial assignability 651a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 65286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput: 653a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sll $a1, $a1, 2 654a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $t0, $a0, $a1 655a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a2, OBJECT_ARRAY_DATA_OFFSET($t0) 656a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t0, THREAD_CARD_TABLE_OFFSET(rSELF) 657a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers srl $t1, $a0, 7 658a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $t1, $t1, $t0 659a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sb $t0, ($t1) 660a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $ra 661a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 66286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput_null: 663a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sll $a1, $a1, 2 664a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $t0, $a0, $a1 665a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a2, OBJECT_ARRAY_DATA_OFFSET($t0) 666a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $ra 667a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 66886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lcheck_assignability: 669a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, -32 670a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset 32 671a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $ra, 28($sp) 672a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_rel_offset 31, 28 673a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $t9, 12($sp) 674a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a2, 8($sp) 675a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a1, 4($sp) 676a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a0, 0($sp) 677a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a1, $t1 678a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a0, $t0 679a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jal artIsAssignableFromCode # (Class*, Class*) 680a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 681a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $ra, 28($sp) 682a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t9, 12($sp) 683a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a2, 8($sp) 684a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a1, 4($sp) 685a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a0, 0($sp) 686a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $sp, 32 687a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset -32 68886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bnez $v0, .Ldo_aput 689a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 690a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 691a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a1, $a2 692a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a2, rSELF # pass Thread::Current 693a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers la $t9, artThrowArrayStoreException 694a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $t9 # artThrowArrayStoreException(Class*, Class*, Thread*, SP) 695a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a3, $sp # pass $sp 696a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj 6975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 6995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when uninitialized static storage, this stub will run the class 7005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * initializer and deliver the exception on error. On success the static storage base is 7015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * returned. 7025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 703d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeStaticStorageFromCode 704468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_static_storage 70512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 7095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeStaticStorageFromCode 7107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 711cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 712468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_static_storage 7135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 71557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code when dex cache misses for a type_idx. 7165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 717d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeTypeFromCode 718468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type 71912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 7235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeFromCode 7247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 725cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 726468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type 7275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 7295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when type_idx needs to be checked for access and dex cache may also 73057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * miss. 7315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 732d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeTypeAndVerifyAccessFromCode 733468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type_and_verify_access 73412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 7385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeAndVerifyAccessFromCode 7397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 740cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 741468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type_and_verify_access 7425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 74457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 32-bit primitive value. 7455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 746d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet32StaticFromCode 747468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_static 74812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7504eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 7517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 752fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet32StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 7537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 7545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 755468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_static 7565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 75857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 64-bit primitive value. 7595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 760d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet64StaticFromCode 761468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_static 76212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7644eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 7657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 766fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet64StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 7677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 7685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 769468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_static 7705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 77257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load an object reference. 7735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 774d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGetObjStaticFromCode 775468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_static 77612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7784eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 7797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 780fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGetObjStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 7817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 7825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 783468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_static 7845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 78657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 32-bit primitive value. 7875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 788d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet32InstanceFromCode 789468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_instance 79012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7924eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 7937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 794fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet32InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 7954eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 7965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 797468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_instance 7985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 80057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 64-bit primitive value. 8015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 802d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet64InstanceFromCode 803468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_instance 80412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8064eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 8077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 808fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet64InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 8094eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 811468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_instance 8125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 81457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load an object reference. 8155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 816d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGetObjInstanceFromCode 817468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_instance 81812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8204eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 8217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 822fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGetObjInstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 8234eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 825468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_instance 8265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 82857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 32-bit primitive value. 8295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 830d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32StaticFromCode 831468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_static 83212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8344eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 8357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 836fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSet32StaticFromCode # (field_idx, new_val, referrer, Thread*, $sp) 8374eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 839468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_static 8405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 84257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 64-bit primitive value. 8435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 844d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32StaticFromCode 845468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_static 84612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8484eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 849fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 8507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSet64StaticFromCode # (field_idx, referrer, new_val, Thread*, $sp) 8514eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 8525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 853468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_static 8545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 85657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store an object reference. 8575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 858d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSetObjStaticFromCode 859468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_static 86012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8624eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 8637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 864fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSetObjStaticFromCode # (field_idx, new_val, referrer, Thread*, $sp) 8654eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 867468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_static 8685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 87057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 32-bit primitive value. 8715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 872d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32InstanceFromCode 873468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_instance 87412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8764eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a3, 64($sp) # pass referrer's Method* 877fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 8787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSet32InstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*, $sp) 8794eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 8805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 881468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_instance 8825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 88457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 64-bit primitive value. 8855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 886d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32InstanceFromCode 887468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_instance 88812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 890fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 891fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSet64InstanceFromCode # (field_idx, Object*, new_val, Thread*, $sp) 8924eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 8935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 894468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_instance 8955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 89757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store an object reference. 8985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 899d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSetObjInstanceFromCode 900468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_instance 90112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 9027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9034eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a3, 64($sp) # pass referrer's Method* 904fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 905fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSetObjInstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*, $sp) 9064eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 9075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 908468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_instance 9095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 9115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code to resolve a string, this stub will allocate a String and deliver an 9125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * exception on error. On success the String is returned. R0 holds the referring method, 9135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * R1 holds the string index. The fast path check for hit in strings cache has already been 9145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * performed. 9155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 916d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artResolveStringFromCode 917468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolve_string 91812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 9197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 9217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*, $sp) 9225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artResolveStringFromCode 9237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 924cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 925468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolve_string 9265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9273b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi 928cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier// Macro to facilitate adding new allocation entrypoints. 929cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro TWO_ARG_DOWNCALL name, entrypoint, return 930cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier .extern \entrypoint 931cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name 93212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 9337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 935cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier jal \entrypoint 9367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 937cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier \return 938cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name 939cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm 9405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 941cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro THREE_ARG_DOWNCALL name, entrypoint, return 942cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier .extern \entrypoint 943cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name 9443b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi GENERATE_GLOBAL_POINTER 9453b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9463b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi move $a3, rSELF # pass Thread::Current 947cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier jal \entrypoint 9483b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi sw $sp, 16($sp) # pass $sp 949cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier \return 950cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name 951cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm 9525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9537410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier// Generate the allocation entrypoints for each allocator. 9547410f29b4dae223befac036ea567d7f33351dad1Mathieu ChartierGENERATE_ALL_ALLOC_ENTRYPOINTS 9553b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi 9565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 95757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code when the value in rSUSPEND has been decremented to 0. 9585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 959d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artTestSuspendFromCode 960d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_test_suspend 96112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 962474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers lh $a0, THREAD_FLAGS_OFFSET(rSELF) 9637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $a0, 1f 9647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addi rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL # reset rSUSPEND to SUSPEND_CHECK_INTERVAL 9657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 9665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 9675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 9687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF 9697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves for stack crawl 9707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artTestSuspendFromCode # (Thread*, $sp) 9717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp 9725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 973d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_test_suspend 9745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 9765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code that is attempting to call a method on a proxy class. On entry 97757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * r0 holds the proxy method; r1, r2 and r3 may contain arguments. 9785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 9795fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao .extern artQuickProxyInvokeHandler 980d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_proxy_invoke_handler 98112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 9825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 9837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a0, 0($sp) # place proxy method at bottom of frame 9847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 9855fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao jal artQuickProxyInvokeHandler # (Method* proxy method, receiver, Thread*, SP) 986af6e67a4816d2593586115b89faa659225363246Ian Rogers move $a3, $sp # pass $sp 9877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 9881984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 9897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $t0, 1f 990b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v0, $f0 # place return value to FP return value 9917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 992b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v1, $f1 # place return value to FP return value 9935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 9945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 995d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_proxy_invoke_handler 9965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 99788474b416eb257078e590bf9bc7957cee604a186Jeff Hao /* 99888474b416eb257078e590bf9bc7957cee604a186Jeff Hao * Called to resolve an imt conflict. t0 is a hidden argument that holds the target method's 99988474b416eb257078e590bf9bc7957cee604a186Jeff Hao * dex method index. 100088474b416eb257078e590bf9bc7957cee604a186Jeff Hao */ 100188474b416eb257078e590bf9bc7957cee604a186Jeff HaoENTRY art_quick_imt_conflict_trampoline 100288474b416eb257078e590bf9bc7957cee604a186Jeff Hao GENERATE_GLOBAL_POINTER 100388474b416eb257078e590bf9bc7957cee604a186Jeff Hao lw $a0, 0($sp) # load caller Method* 100488474b416eb257078e590bf9bc7957cee604a186Jeff Hao lw $a0, METHOD_DEX_CACHE_METHODS_OFFSET($a0) # load dex_cache_resolved_methods 100588474b416eb257078e590bf9bc7957cee604a186Jeff Hao sll $t0, 2 # convert target method offset to bytes 100688474b416eb257078e590bf9bc7957cee604a186Jeff Hao add $a0, $t0 # get address of target method 100788474b416eb257078e590bf9bc7957cee604a186Jeff Hao lw $a0, OBJECT_ARRAY_DATA_OFFSET($a0) # load the target method 100888474b416eb257078e590bf9bc7957cee604a186Jeff Hao la $t9, art_quick_invoke_interface_trampoline 100988474b416eb257078e590bf9bc7957cee604a186Jeff Hao jr $t9 101088474b416eb257078e590bf9bc7957cee604a186Jeff HaoEND art_quick_imt_conflict_trampoline 101188474b416eb257078e590bf9bc7957cee604a186Jeff Hao 1012468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .extern artQuickResolutionTrampoline 1013468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolution_trampoline 1014468532ea115657709bc32ee498e701a4c71762d4Ian Rogers GENERATE_GLOBAL_POINTER 1015468532ea115657709bc32ee498e701a4c71762d4Ian Rogers SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 1016468532ea115657709bc32ee498e701a4c71762d4Ian Rogers move $a2, rSELF # pass Thread::Current 101765d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers jal artQuickResolutionTrampoline # (Method* called, receiver, Thread*, SP) 1018468532ea115657709bc32ee498e701a4c71762d4Ian Rogers move $a3, $sp # pass $sp 1019468532ea115657709bc32ee498e701a4c71762d4Ian Rogers beqz $v0, 1f 1020468532ea115657709bc32ee498e701a4c71762d4Ian Rogers lw $a0, 0($sp) # load resolved method to $a0 10211984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 102265d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers move $t9, $v0 # code pointer must be in $t9 to generate the global pointer 1023468532ea115657709bc32ee498e701a4c71762d4Ian Rogers jr $v0 # tail call to method 10241984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier nop 1025468532ea115657709bc32ee498e701a4c71762d4Ian Rogers1: 10261984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 1027468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DELIVER_PENDING_EXCEPTION 1028468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolution_trampoline 1029468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 10302da882315a61072664f7ce3c212307342e907207Andreas GampeUNIMPLEMENTED art_quick_generic_jni_trampoline 10312da882315a61072664f7ce3c212307342e907207Andreas Gampe 1032468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .extern artQuickToInterpreterBridge 1033468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_to_interpreter_bridge 10347db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers GENERATE_GLOBAL_POINTER 10357db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 10367db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers move $a1, rSELF # pass Thread::Current 1037468532ea115657709bc32ee498e701a4c71762d4Ian Rogers jal artQuickToInterpreterBridge # (Method* method, Thread*, SP) 10387db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers move $a2, $sp # pass $sp 10397db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 10401984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 10417db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers bnez $t0, 1f 1042b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v0, $f0 # place return value to FP return value 10437db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers jr $ra 1044b264937893fd12bce84681a6d9da6de99ebe6aa4Douglas Leung mtc1 $v1, $f1 # place return value to FP return value 10457db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers1: 10467db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers DELIVER_PENDING_EXCEPTION 1047468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_to_interpreter_bridge 10487db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers 10495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1050725a957985171d712d5c048cc3d00ff14968784bjeffhao * Routine that intercepts method calls and returns. 10515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1052d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInstrumentationMethodEntryFromCode 1053d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInstrumentationMethodExitFromCode 1054468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_instrumentation_entry 105512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 105662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 105712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $sp # remember bottom of caller's frame 105862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, -32 # space for args, pad (3 words), arguments (5 words) 105962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset 32 106062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $a0, 28($sp) # save arg0 106162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $ra, 16($sp) # pass $ra 106262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a3, $t0 # pass $sp 106362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artInstrumentationMethodEntryFromCode # (Method*, Object*, Thread*, SP, LR) 106462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a2, rSELF # pass Thread::Current 10658161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $t9, $v0 # $t9 holds reference to code 106662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $a0, 28($sp) # restore arg0 106762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, 32 # remove args 106862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset -32 106962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 10708161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jalr $t9 # call method 107162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers nop 1072468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_entry 10735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* intentional fallthrough */ 1074468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .global art_quick_instrumentation_exit 1075468532ea115657709bc32ee498e701a4c71762d4Ian Rogersart_quick_instrumentation_exit: 1076d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_startproc 107712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao addiu $t9, $ra, 4 # put current address into $t9 to rebuild $gp 107812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 1079c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung move $ra, $zero # link register is to here, so clobber with 0 for later checks 108062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers SETUP_REF_ONLY_CALLEE_SAVE_FRAME 1081c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung move $t0, $sp # remember bottom of caller's frame 108262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, -48 # save return values and set up args 108362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset 48 108462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $v0, 32($sp) 1085c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung .cfi_rel_offset 2, 32 108662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $v1, 36($sp) 1087c3d131e1ec030b4ff5c44fe2a45d5fb45b3295afDouglas Leung .cfi_rel_offset 3, 36 108862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f0, 40($sp) 108962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f1, 44($sp) 109062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f0, 16($sp) # pass fpr result 109162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f1, 20($sp) 109262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a2, $v0 # pass gpr result 109362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a3, $v1 109412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $a1, $t0 # pass $sp 109562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artInstrumentationMethodExitFromCode # (Thread*, SP, gpr_res, fpr_res) 109612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $a0, rSELF # pass Thread::Current 109712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $v0 # set aside returned link register 109812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $ra, $v1 # set link register for deoptimization 109962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $v0, 32($sp) # restore return values 110062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $v1, 36($sp) 110162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers l.s $f0, 40($sp) 110262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers l.s $f1, 44($sp) 110312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao jr $t0 # return 110462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, 112 # 48 bytes of args + 64 bytes of callee save frame 110562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset -112 1106468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_exit 11075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 110812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao /* 110962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization 111062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers * will long jump to the upcall with a special exception of -1. 111112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao */ 1112d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artDeoptimize 1113d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artEnterInterpreterFromDeoptimize 1114d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deoptimize 111512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 111614dd5a82ad85a28612bf86e755ff929d767cea4cJeff Hao SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 111762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a0, rSELF # pass Thread::current 111862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artDeoptimize # artDeoptimize(Thread*, SP) 111912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao # Returns caller method's frame size. 112062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a1, $sp # pass $sp 1121d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deoptimize 112212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao 11235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 11245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 11255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 11265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 11275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 11285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 11297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 11307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 11317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 11325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1133d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shl_long 11345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* shl-long vAA, vBB, vCC */ 11357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v0, $a0, $a2 # rlo<- alo << (shift&31) 11367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $v1, $a2 # rhi<- 31-shift (shift is 5b) 11377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, 1 11387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, $v1 # alo<- alo >> (32-(shift&31)) 11397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v1, $a1, $a2 # rhi<- ahi << (shift&31) 11407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v1, $a0 # rhi<- rhi | alo 11417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift< shift & 0x20 11427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $v0, $a2 # rhi<- rlo (if shift&0x20) 11437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1144fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao movn $v0, $zero, $a2 # rlo<- 0 (if shift&0x20) 1145d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shl_long 11465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 11475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 11485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 11495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 11505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 11515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 11525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 11537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 11547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 11557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 11565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1157d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .global art_quick_shr_long 1158d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shr_long 11597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 11607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 11617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $a3, $a1, 31 # $a3<- sign(ah) 11627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 11637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 11647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 11657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 11667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 11677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 11687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 11697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $a3, $a2 # rhi<- sign(ahi) (if shift&0x20) 1170d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shr_long 11715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 11725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 11735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 11745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 11755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 11765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 11775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 11785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r0: low word 11795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r1: high word 11805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r2: shift count 11815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 11825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* ushr-long vAA, vBB, vCC */ 1183d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .global art_quick_ushr_long 1184d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_ushr_long 1185fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao srl $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 11867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 11877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 11887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 11897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 11907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 11917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 11927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 11937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1194fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao movn $v1, $zero, $a2 # rhi<- 0 (if shift&0x20) 1195d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_ushr_long 11967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1197d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_indexof 11987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 11990703060875166106af3d490c6c264611aea67ec8jeffhao nop 1200d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_indexof 12017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1202d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_string_compareto 12037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 12040703060875166106af3d490c6c264611aea67ec8jeffhao nop 1205d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_string_compareto 1206