quick_entrypoints_mips.S revision 86bcdc251f5ae22fcedd18c096ea538b7dbfa8cb
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 37fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $ra, 60($sp) 38d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 31, 60 39fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $s8, 56($sp) 40d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 30, 56 411f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $gp, 52($sp) 421f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 28, 52 431f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s7, 48($sp) 441f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 23, 48 451f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s6, 44($sp) 461f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 22, 44 471f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s5, 40($sp) 481f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 21, 40 491f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s4, 36($sp) 501f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 20, 36 511f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s3, 32($sp) 521f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 19, 32 531f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s2, 28($sp) 541f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 18, 28 551f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s1, 24($sp) 561f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 17, 24 571f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s0, 20($sp) 581f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 16, 20 591f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao # 1 word for alignment, 4 open words for args $a0-$a3, bottom will hold Method* 605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC. 655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Does not include rSUSPEND or rSELF 661f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao * callee-save: $s2-$s8 + $gp + $ra, 9 total + 3 words padding + 4 open words for args 675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_ONLY_CALLEE_SAVE_FRAME 694eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, -64 70d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset 64 714eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $ra, 60($sp) 72d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 31, 60 734eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $s8, 56($sp) 74d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 30, 56 751f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $gp, 52($sp) 761f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 28, 52 771f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s7, 48($sp) 781f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 23, 48 791f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s6, 44($sp) 801f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 22, 44 811f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s5, 40($sp) 821f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 21, 40 831f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s4, 36($sp) 841f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 20, 36 851f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s3, 32($sp) 861f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 19, 32 871f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s2, 28($sp) 881f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 18, 28 89fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao # 3 words for alignment and extra args, 4 open words for args $a0-$a3, bottom will hold Method* 905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 934eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $ra, 60($sp) 94bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 952a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s8, 56($sp) 96bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 972a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $gp, 52($sp) 98bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 28 992a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s7, 48($sp) 100bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 23 1012a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s6, 44($sp) 102bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 22 1032a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s5, 40($sp) 104bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 21 1052a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s4, 36($sp) 106bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 20 1072a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s3, 32($sp) 108bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 19 1092a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s2, 28($sp) 110bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 18 1114eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, 64 112d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -64 1135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 1164eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $ra, 60($sp) 117bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 1182a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s8, 56($sp) 119bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 1202a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $gp, 52($sp) 121bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 28 1222a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s7, 48($sp) 123bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 23 1242a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s6, 44($sp) 125bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 22 1262a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s5, 40($sp) 127bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 21 1282a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s4, 36($sp) 129bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 20 1302a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s3, 32($sp) 131bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 19 1322a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s2, 28($sp) 133bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 18 1347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1354eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, 64 136d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -64 1375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 1415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC. 1421f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao * callee-save: $a1-$a3, $s2-$s8 + $gp + $ra, 12 total + 3 words padding + method* 1435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 1451f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao addiu $sp, $sp, -64 1461f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_adjust_cfa_offset 64 1471f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $ra, 60($sp) 1481f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 31, 60 1491f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s8, 56($sp) 1501f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 30, 56 1511f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $gp, 52($sp) 1521f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 28, 52 1531f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s7, 48($sp) 1541f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 23, 48 1551f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s6, 44($sp) 1561f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 22, 44 1571f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s5, 40($sp) 1581f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 21, 40 1591f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s4, 36($sp) 1601f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 20, 36 1611f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s3, 32($sp) 1621f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 19, 32 1631f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s2, 28($sp) 1641f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 18, 28 1657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a3, 12($sp) 166d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 7, 12 1677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a2, 8($sp) 168d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 6, 8 1697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a1, 4($sp) 170d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 5, 4 171fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao # bottom will hold Method* 1725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 1752a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $ra, 60($sp) 176bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 1772a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s8, 56($sp) 178bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 1792a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $gp, 52($sp) 180bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 28 1812a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s7, 48($sp) 182bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 23 1832a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s6, 44($sp) 184bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 22 1852a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s5, 40($sp) 186bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 21 1872a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s4, 36($sp) 188bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 20 1892a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s3, 32($sp) 190bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 19 1912a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $s2, 28($sp) 192bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 18 1932a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $a3, 12($sp) 194bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 7 1952a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $a2, 8($sp) 196bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 6 1972a6c7b7c21adcd4493542604305585b852ccf554Mathieu Chartier lw $a1, 4($sp) 198bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 5 199468532ea115657709bc32ee498e701a4c71762d4Ian Rogers addiu $sp, $sp, 64 # pop frame 2001f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_adjust_cfa_offset -64 2015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending 2055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * exception is Thread::Current()->exception_ 2065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 2075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro DELIVER_PENDING_EXCEPTION 2088161c0336b97e11e02c000af357f8f40de2e23e4jeffhao SETUP_SAVE_ALL_CALLEE_SAVE_FRAME # save callee saves for throw 2098161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a0, rSELF # pass Thread::Current 2108161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artDeliverPendingExceptionFromCode 2118161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artDeliverPendingExceptionFromCode(Thread*, $sp) 2128161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, $sp # pass $sp 2135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NO_EXCEPTION 2167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 2175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 2188161c0336b97e11e02c000af357f8f40de2e23e4jeffhao bnez $t0, 1f # success if no exception is pending 2195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 2215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 2235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 2245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_ZERO 2275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 2287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $v0, 1f # success? 2295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return on success 2315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 2335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 2345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 236cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro RETURN_IF_RESULT_IS_NON_ZERO 2375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 2387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao beqz $v0, 1f # success? 2395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return on success 2415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 2435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 2445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * On entry $a0 is uint32_t* gprs_ and $a1 is uint32_t* fprs_ 2485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * FIXME: just guessing about the shape of the jmpbuf. Where will pc be? 2495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 250d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_do_long_jump 2517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f0, 0($a1) 2527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f1, 4($a1) 2537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f2, 8($a1) 2547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f3, 12($a1) 2557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f4, 16($a1) 2567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f5, 20($a1) 2577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f6, 24($a1) 2587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f7, 28($a1) 2597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f8, 32($a1) 2607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f9, 36($a1) 2617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f10, 40($a1) 2627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f11, 44($a1) 2637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f12, 48($a1) 2647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f13, 52($a1) 2657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f14, 56($a1) 2667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f15, 60($a1) 2677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f16, 64($a1) 2687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f17, 68($a1) 2697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f18, 72($a1) 2707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f19, 76($a1) 2717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f20, 80($a1) 2727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f21, 84($a1) 2737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f22, 88($a1) 2747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f23, 92($a1) 2757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f24, 96($a1) 2767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f25, 100($a1) 2777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f26, 104($a1) 2787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f27, 108($a1) 2797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f28, 112($a1) 2807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f29, 116($a1) 2817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f30, 120($a1) 2827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f31, 124($a1) 2837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $at, 4($a0) 2847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v0, 8($a0) 2857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v1, 12($a0) 2867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 20($a0) 2877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 24($a0) 2887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a3, 28($a0) 2897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, 32($a0) 2907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t1, 36($a0) 2917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t2, 40($a0) 2927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t3, 44($a0) 2937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t4, 48($a0) 2947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t5, 52($a0) 2957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t6, 56($a0) 2967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t7, 60($a0) 2977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s0, 64($a0) 2987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s1, 68($a0) 2997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s2, 72($a0) 3007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s3, 76($a0) 3017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s4, 80($a0) 3027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s5, 84($a0) 3037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s6, 88($a0) 3047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s7, 92($a0) 3057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t8, 96($a0) 3067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t9, 100($a0) 3077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $k0, 104($a0) 3087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $k1, 108($a0) 3097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $gp, 112($a0) 3107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $sp, 116($a0) 3117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $fp, 120($a0) 3127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $ra, 124($a0) 3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a0, 16($a0) 3147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v0, $zero # clear result registers r0 and r1 3157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # do long jump 3167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v1, $zero 317d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_do_long_jump 3185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code, saves most registers (forms basis of long jump context) and passes 3215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at 3225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the thread. On entry r0 holds Throwable* 3235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 324468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_deliver_exception 32512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 32657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3278161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, rSELF # pass Thread::Current 3288161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artDeliverExceptionFromCode 3298161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artDeliverExceptionFromCode(Throwable*, Thread*, $sp) 3308161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a2, $sp # pass $sp 331468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_deliver_exception 3325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver a NullPointerException 3355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 336d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowNullPointerExceptionFromCode 337468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_null_pointer_exception 33812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 33986bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_throw_null_pointer_exception_gp_set: 34057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3418161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a0, rSELF # pass Thread::Current 3428161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowNullPointerExceptionFromCode 3438161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowNullPointerExceptionFromCode(Thread*, $sp) 3448161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, $sp # pass $sp 345468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_null_pointer_exception 3465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArithmeticException 3495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 350d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowDivZeroFromCode 351468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_div_zero 35212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 35357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF # pass Thread::Current 3558161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowDivZeroFromCode 3568161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowDivZeroFromCode(Thread*, $sp) 3577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp # pass $sp 358468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_div_zero 3595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException 3625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 363d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowArrayBoundsFromCode 364468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_array_bounds 36512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 36686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_throw_array_bounds_gp_set: 36757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3688161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a2, rSELF # pass Thread::Current 3698161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowArrayBoundsFromCode 3708161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowArrayBoundsFromCode(index, limit, Thread*, $sp) 3718161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a3, $sp # pass $sp 372468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_array_bounds 3735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 37457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 37557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a StackOverflowError. 37657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 377d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowStackOverflowFromCode 378468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_stack_overflow 37912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 38057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3818161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a0, rSELF # pass Thread::Current 3828161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowStackOverflowFromCode 3838161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowStackOverflowFromCode(Thread*, $sp) 3848161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, $sp # pass $sp 385468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_stack_overflow 3865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 38757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 38857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a NoSuchMethodError. 38957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 390d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowNoSuchMethodFromCode 391468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_no_such_method 39212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 39357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3948161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, rSELF # pass Thread::Current 3958161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowNoSuchMethodFromCode 3968161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowNoSuchMethodFromCode(method_idx, Thread*, $sp) 3978161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a2, $sp # pass $sp 398468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_no_such_method 3995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 4015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * All generated callsites for interface invokes and invocation slow paths will load arguments 4027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain 4035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the method_idx. This wrapper will save arg1-arg3, load the caller's Method*, align the 4045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * stack and call the appropriate C helper. 4057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1. 4065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 4077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting 4087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * of the target Method* in $v0 and method->code_ in $v1. 4095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 410fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao * If unsuccessful, the helper will return NULL/NULL. There will be a pending exception in the 4115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * thread and we branch to another stub to deliver it. 4125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 4135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On success this wrapper will restore arguments and *jump* to the target, leaving the lr 4145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * pointing back to the original caller. 4155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 4165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name 4175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern \cxx_name 418d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY \c_name 41912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 4207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME # save callee saves in case allocation triggers GC 4211f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao lw $a2, 64($sp) # pass caller Method* 422fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $t0, $sp # save $sp 42358df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, -32 # make space for extra args 42458df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset 32 4257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 426d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 28, 12 4277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal \cxx_name # (method_idx, this, caller, Thread*, $sp) 428fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $t0, 16($sp) # pass $sp 42958df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, 32 # release out args 43058df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset -32 431fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $a0, $v0 # save target Method* 43230a3317577d84feafa859b3e39d1545a995f0b7cjeffhao move $t9, $v1 # save $v0->code_ 4335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 434fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao beqz $v0, 1f 4355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 43630a3317577d84feafa859b3e39d1545a995f0b7cjeffhao jr $t9 4375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 4385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 4395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 440d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND \c_name 4415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 4425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4438dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline 4448dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck 4455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4468dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck 4478dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck 4488dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck 4498dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck 4505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 45179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao /* 452ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Invocation stub for quick code. 4535d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * On entry: 4545d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a0 = method pointer 4555d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a1 = argument array or NULL for no argument methods 4565d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a2 = size of argument array in bytes 4575d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a3 = (managed) thread pointer 4586474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao * [sp + 16] = JValue* result 4590177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers * [sp + 20] = shorty 4605d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao */ 4615d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoENTRY art_quick_invoke_stub 4625d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao GENERATE_GLOBAL_POINTER 4635d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $a0, 0($sp) # save out a0 4645d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, -16 # spill s0, s1, fp, ra 4655d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_adjust_cfa_offset 16 4665d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $ra, 12($sp) 4675d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 31, 12 4685d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $fp, 8($sp) 4695d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 30, 8 4705d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $s1, 4($sp) 4715d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 17, 4 4725d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $s0, 0($sp) 4735d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 16, 0 4745d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $fp, $sp # save sp in fp 4755d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_def_cfa_register 30 4765d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $s1, $a3 # move managed thread pointer into s1 4775d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $s0, $zero, SUSPEND_CHECK_INTERVAL # reset s0 to suspend check interval 4785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $t0, $a2, 16 # create space for method pointer in frame 4795d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao srl $t0, $t0, 3 # shift the frame size right 3 4805d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sll $t0, $t0, 3 # shift the frame size left 3 to align to 16 bytes 4815d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao subu $sp, $sp, $t0 # reserve stack space for argument array 4825d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $a0, $sp, 4 # pass stack pointer + method ptr as dest for memcpy 4835d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jal memcpy # (dest, src, bytes) 4845d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, -16 # make space for argument slots for memcpy 4855d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, 16 # restore stack after memcpy 4865d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a0, 16($fp) # restore method* 4875d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a1, 4($sp) # copy arg value for a1 4885d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a2, 8($sp) # copy arg value for a2 4895d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a3, 12($sp) # copy arg value for a3 490ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers lw $t9, METHOD_QUICK_CODE_OFFSET($a0) # get pointer to the code 4915d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jalr $t9 # call the method 4925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $zero, 0($sp) # store NULL for method* at bottom of frame 4935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $sp, $fp # restore the stack 4945d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $s0, 0($sp) 495bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 16 4965d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $s1, 4($sp) 497bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 17 4985d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $fp, 8($sp) 499bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 30 5005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $ra, 12($sp) 501bbb32c277b800a8ee378c16a3645ab6d4d19aef1Dave Allison .cfi_restore 31 5025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, 16 5035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_adjust_cfa_offset -16 5045d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $t0, 16($sp) # get result pointer 5050177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers lw $t1, 20($sp) # get shorty 5060177e53ea521ad58b70c305700dab32f1ac773b7Ian Rogers lb $t1, 0($t1) # get result type char 5076474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao li $t2, 68 # put char 'D' into t2 5086474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao beq $t1, $t2, 1f # branch if result type char == 'D' 5096474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao li $t3, 70 # put char 'F' into t3 5106474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao beq $t1, $t3, 1f # branch if result type char == 'F' 5115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $v0, 0($t0) # store the result 5126474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao jr $ra 5135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $v1, 4($t0) # store the other half of the result 5146474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao1: 51519ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao s.s $f0, 0($t0) # store floating point result 5165d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jr $ra 51719ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao s.s $f1, 4($t0) # store other half of floating point result 5185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoEND art_quick_invoke_stub 5195d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao 5205d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao /* 5215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on 5225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * failure. 5235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 524d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artHandleFillArrayDataFromCode 525468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_handle_fill_data 52612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 5277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 5287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 5297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artHandleFillArrayDataFromCode # (Array*, const DexFile::Payload*, Thread*, $sp) 5307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 531fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao RETURN_IF_ZERO 532468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_handle_fill_data 5335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 53557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code that calls artLockObjectFromCode, may block for GC. 5365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 537d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artLockObjectFromCode 538468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_lock_object 53912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 54086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $a0, .Lart_quick_throw_null_pointer_exception_gp_set 541a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 5427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case we block 5437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 5447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artLockObjectFromCode # (Object* obj, Thread*, $sp) 5457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # pass $sp 5466bcd163d322b867578fbcfe60e4e3b247c42974bIan Rogers RETURN_IF_ZERO 547468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_lock_object 5485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 5505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure. 5515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 552d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artUnlockObjectFromCode 553468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_unlock_object 55412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 55586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $a0, .Lart_quick_throw_null_pointer_exception_gp_set 556a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 5577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 5587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 5597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artUnlockObjectFromCode # (Object* obj, Thread*, $sp) 5607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # pass $sp 5615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 562468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_unlock_object 5635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 5655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure. 5665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 567a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .extern artThrowClassCastException 568468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_cast 56912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 570a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, -16 571a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset 16 572a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $ra, 12($sp) 573a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_rel_offset 31, 12 574a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $t9, 8($sp) 575a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a1, 4($sp) 576a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a0, 0($sp) 577a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jal artIsAssignableFromCode 578a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 57986bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $v0, .Lthrow_class_cast_exception 580a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $ra, 12($sp) 581a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $ra 582a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, 16 583a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset -16 58486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lthrow_class_cast_exception: 585a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t9, 8($sp) 586a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a1, 4($sp) 587a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a0, 0($sp) 588a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, 16 589a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset -16 590a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 591a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a2, rSELF # pass Thread::Current 592a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers la $t9, artThrowClassCastException 593a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $t9 # artThrowClassCastException (Class*, Class*, Thread*, SP) 594a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a3, $sp # pass $sp 595468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_cast 5965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 598a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers * Entry from managed code for array put operations of objects where the value being stored 599a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers * needs to be checked for compatibility. 600a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers * a0 = array, a1 = index, a2 = value 6015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 602a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_null_and_bound_check 60312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 60486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bnez $a0, .Lart_quick_aput_obj_with_bound_check_gp_set 605a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 60686bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers b .Lart_quick_throw_null_pointer_exception_gp_set 607a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 608a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_null_and_bound_check 609a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers 610a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj_with_bound_check 611a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers GENERATE_GLOBAL_POINTER 61286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_aput_obj_with_bound_check_gp_set: 613a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t0, ARRAY_LENGTH_OFFSET($a0) 614a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sltu $t1, $a1, $t0 61586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bnez $t1, .Lart_quick_aput_obj_gp_set 616a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 617a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a0, $a1 61886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers b .Lart_quick_throw_array_bounds_gp_set 619a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a1, $t0 620a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj_with_bound_check 621a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers 622a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersENTRY art_quick_aput_obj 623a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers GENERATE_GLOBAL_POINTER 62486bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lart_quick_aput_obj_gp_set: 62586bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers beqz $a2, .Ldo_aput_null 626a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 627a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t0, CLASS_OFFSET($a0) 628a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t1, CLASS_OFFSET($a2) 629a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t0, CLASS_COMPONENT_TYPE_OFFSET($t0) 63086bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bne $t1, $t0, .Lcheck_assignability # value's type == array's component type - trivial assignability 631a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 63286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput: 633a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sll $a1, $a1, 2 634a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $t0, $a0, $a1 635a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a2, OBJECT_ARRAY_DATA_OFFSET($t0) 636a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t0, THREAD_CARD_TABLE_OFFSET(rSELF) 637a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers srl $t1, $a0, 7 638a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $t1, $t1, $t0 639a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sb $t0, ($t1) 640a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $ra 641a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 64286bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Ldo_aput_null: 643a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sll $a1, $a1, 2 644a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $t0, $a0, $a1 645a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a2, OBJECT_ARRAY_DATA_OFFSET($t0) 646a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $ra 647a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 64886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers.Lcheck_assignability: 649a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers addiu $sp, $sp, -32 650a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset 32 651a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $ra, 28($sp) 652a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_rel_offset 31, 28 653a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $t9, 12($sp) 654a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a2, 8($sp) 655a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a1, 4($sp) 656a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers sw $a0, 0($sp) 657a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a1, $t1 658a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a0, $t0 659a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jal artIsAssignableFromCode # (Class*, Class*) 660a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 661a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $ra, 28($sp) 662a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $t9, 12($sp) 663a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a2, 8($sp) 664a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a1, 4($sp) 665a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers lw $a0, 0($sp) 666a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers add $sp, 32 667a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers .cfi_adjust_cfa_offset -32 66886bcdc251f5ae22fcedd18c096ea538b7dbfa8cbIan Rogers bnez $v0, .Ldo_aput 669a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers nop 670a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 671a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a1, $a2 672a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a2, rSELF # pass Thread::Current 673a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers la $t9, artThrowArrayStoreException 674a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers jr $t9 # artThrowArrayStoreException(Class*, Class*, Thread*, SP) 675a9a8254c920ce8e22210abfc16c9842ce0aea28fIan Rogers move $a3, $sp # pass $sp 676a9a8254c920ce8e22210abfc16c9842ce0aea28fIan RogersEND art_quick_aput_obj 6775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 6795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when uninitialized static storage, this stub will run the class 6805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * initializer and deliver the exception on error. On success the static storage base is 6815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * returned. 6825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 683d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeStaticStorageFromCode 684468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_static_storage 68512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 6867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 6887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 6895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeStaticStorageFromCode 6907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 691cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 692468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_static_storage 6935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 69557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code when dex cache misses for a type_idx. 6965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 697d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeTypeFromCode 698468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type 69912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 7035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeFromCode 7047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 705cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 706468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type 7075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 7095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when type_idx needs to be checked for access and dex cache may also 71057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * miss. 7115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 712d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeTypeAndVerifyAccessFromCode 713468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type_and_verify_access 71412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 7185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeAndVerifyAccessFromCode 7197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 720cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 721468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type_and_verify_access 7225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 72457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 32-bit primitive value. 7255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 726d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet32StaticFromCode 727468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_static 72812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7304eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 7317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 732fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet32StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 7337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 7345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 735468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_static 7365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 73857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 64-bit primitive value. 7395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 740d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet64StaticFromCode 741468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_static 74212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7444eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 7457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 746fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet64StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 7477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 7485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 749468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_static 7505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 75257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load an object reference. 7535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 754d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGetObjStaticFromCode 755468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_static 75612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7584eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 7597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 760fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGetObjStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 7617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 7625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 763468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_static 7645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 76657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 32-bit primitive value. 7675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 768d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet32InstanceFromCode 769468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_instance 77012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7724eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 7737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 774fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet32InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 7754eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 7765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 777468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_instance 7785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 78057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 64-bit primitive value. 7815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 782d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet64InstanceFromCode 783468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_instance 78412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7864eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 7877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 788fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet64InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 7894eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 7905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 791468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_instance 7925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 79457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load an object reference. 7955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 796d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGetObjInstanceFromCode 797468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_instance 79812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8004eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 8017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 802fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGetObjInstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 8034eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 805468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_instance 8065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 80857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 32-bit primitive value. 8095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 810d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32StaticFromCode 811468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_static 81212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8144eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 8157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 816fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSet32StaticFromCode # (field_idx, new_val, referrer, Thread*, $sp) 8174eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 819468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_static 8205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 82257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 64-bit primitive value. 8235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 824d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32StaticFromCode 825468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_static 82612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8284eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 829fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 8307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSet64StaticFromCode # (field_idx, referrer, new_val, Thread*, $sp) 8314eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 8325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 833468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_static 8345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 83657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store an object reference. 8375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 838d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSetObjStaticFromCode 839468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_static 84012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8424eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 8437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 844fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSetObjStaticFromCode # (field_idx, new_val, referrer, Thread*, $sp) 8454eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 847468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_static 8485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 85057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 32-bit primitive value. 8515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 852d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32InstanceFromCode 853468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_instance 85412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8564eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a3, 64($sp) # pass referrer's Method* 857fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 8587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSet32InstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*, $sp) 8594eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 8605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 861468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_instance 8625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 86457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 64-bit primitive value. 8655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 866d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32InstanceFromCode 867468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_instance 86812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 870fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 871fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSet64InstanceFromCode # (field_idx, Object*, new_val, Thread*, $sp) 8724eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 8735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 874468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_instance 8755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 87757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store an object reference. 8785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 879d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSetObjInstanceFromCode 880468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_instance 88112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8834eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a3, 64($sp) # pass referrer's Method* 884fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 885fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSetObjInstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*, $sp) 8864eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 8875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 888468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_instance 8895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 8915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code to resolve a string, this stub will allocate a String and deliver an 8925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * exception on error. On success the String is returned. R0 holds the referring method, 8935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * R1 holds the string index. The fast path check for hit in strings cache has already been 8945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * performed. 8955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 896d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artResolveStringFromCode 897468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolve_string 89812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 9017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*, $sp) 9025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artResolveStringFromCode 9037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 904cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier RETURN_IF_RESULT_IS_NON_ZERO 905468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolve_string 9065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9073b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi 908cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier// Macro to facilitate adding new allocation entrypoints. 909cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro TWO_ARG_DOWNCALL name, entrypoint, return 910cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier .extern \entrypoint 911cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name 91212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 9137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 915cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier jal \entrypoint 9167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 917cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier \return 918cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name 919cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm 9205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 921cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.macro THREE_ARG_DOWNCALL name, entrypoint, return 922cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier .extern \entrypoint 923cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierENTRY \name 9243b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi GENERATE_GLOBAL_POINTER 9253b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9263b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi move $a3, rSELF # pass Thread::Current 927cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier jal \entrypoint 9283b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi sw $sp, 16($sp) # pass $sp 929cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier \return 930cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu ChartierEND \name 931cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier.endm 9325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9337410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartier// Generate the allocation entrypoints for each allocator. 9347410f29b4dae223befac036ea567d7f33351dad1Mathieu ChartierGENERATE_ALL_ALLOC_ENTRYPOINTS 9353b4c18933c24b8a33f38573c2ebcdb9aa16efeb5Hiroshi Yamauchi 9365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 93757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code when the value in rSUSPEND has been decremented to 0. 9385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 939d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artTestSuspendFromCode 940d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_test_suspend 94112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 942474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers lh $a0, THREAD_FLAGS_OFFSET(rSELF) 9437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $a0, 1f 9447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addi rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL # reset rSUSPEND to SUSPEND_CHECK_INTERVAL 9457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 9465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 9475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 9487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF 9497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves for stack crawl 9507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artTestSuspendFromCode # (Thread*, $sp) 9517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp 9525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 953d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_test_suspend 9545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 9565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code that is attempting to call a method on a proxy class. On entry 95757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * r0 holds the proxy method; r1, r2 and r3 may contain arguments. 9585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 9595fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao .extern artQuickProxyInvokeHandler 960d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_proxy_invoke_handler 96112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 9625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 9637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a0, 0($sp) # place proxy method at bottom of frame 9647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 9655fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao jal artQuickProxyInvokeHandler # (Method* proxy method, receiver, Thread*, SP) 966af6e67a4816d2593586115b89faa659225363246Ian Rogers move $a3, $sp # pass $sp 9677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 9681984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 9697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $t0, 1f 9701984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier nop 9717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 9725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 9735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 9745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 975d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_proxy_invoke_handler 9765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 97788474b416eb257078e590bf9bc7957cee604a186Jeff Hao /* 97888474b416eb257078e590bf9bc7957cee604a186Jeff Hao * Called to resolve an imt conflict. t0 is a hidden argument that holds the target method's 97988474b416eb257078e590bf9bc7957cee604a186Jeff Hao * dex method index. 98088474b416eb257078e590bf9bc7957cee604a186Jeff Hao */ 98188474b416eb257078e590bf9bc7957cee604a186Jeff HaoENTRY art_quick_imt_conflict_trampoline 98288474b416eb257078e590bf9bc7957cee604a186Jeff Hao GENERATE_GLOBAL_POINTER 98388474b416eb257078e590bf9bc7957cee604a186Jeff Hao lw $a0, 0($sp) # load caller Method* 98488474b416eb257078e590bf9bc7957cee604a186Jeff Hao lw $a0, METHOD_DEX_CACHE_METHODS_OFFSET($a0) # load dex_cache_resolved_methods 98588474b416eb257078e590bf9bc7957cee604a186Jeff Hao sll $t0, 2 # convert target method offset to bytes 98688474b416eb257078e590bf9bc7957cee604a186Jeff Hao add $a0, $t0 # get address of target method 98788474b416eb257078e590bf9bc7957cee604a186Jeff Hao lw $a0, OBJECT_ARRAY_DATA_OFFSET($a0) # load the target method 98888474b416eb257078e590bf9bc7957cee604a186Jeff Hao la $t9, art_quick_invoke_interface_trampoline 98988474b416eb257078e590bf9bc7957cee604a186Jeff Hao jr $t9 99088474b416eb257078e590bf9bc7957cee604a186Jeff HaoEND art_quick_imt_conflict_trampoline 99188474b416eb257078e590bf9bc7957cee604a186Jeff Hao 992468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .extern artQuickResolutionTrampoline 993468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolution_trampoline 994468532ea115657709bc32ee498e701a4c71762d4Ian Rogers GENERATE_GLOBAL_POINTER 995468532ea115657709bc32ee498e701a4c71762d4Ian Rogers SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 996468532ea115657709bc32ee498e701a4c71762d4Ian Rogers move $a2, rSELF # pass Thread::Current 99765d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers jal artQuickResolutionTrampoline # (Method* called, receiver, Thread*, SP) 998468532ea115657709bc32ee498e701a4c71762d4Ian Rogers move $a3, $sp # pass $sp 999468532ea115657709bc32ee498e701a4c71762d4Ian Rogers beqz $v0, 1f 1000468532ea115657709bc32ee498e701a4c71762d4Ian Rogers lw $a0, 0($sp) # load resolved method to $a0 10011984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 100265d1b22d0b02fb0111f69013163c8170e68392f1Ian Rogers move $t9, $v0 # code pointer must be in $t9 to generate the global pointer 1003468532ea115657709bc32ee498e701a4c71762d4Ian Rogers jr $v0 # tail call to method 10041984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier nop 1005468532ea115657709bc32ee498e701a4c71762d4Ian Rogers1: 10061984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 1007468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DELIVER_PENDING_EXCEPTION 1008468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolution_trampoline 1009468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 1010468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .extern artQuickToInterpreterBridge 1011468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_to_interpreter_bridge 10127db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers GENERATE_GLOBAL_POINTER 10137db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 10147db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers move $a1, rSELF # pass Thread::Current 1015468532ea115657709bc32ee498e701a4c71762d4Ian Rogers jal artQuickToInterpreterBridge # (Method* method, Thread*, SP) 10167db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers move $a2, $sp # pass $sp 10177db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 10181984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 10197db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers bnez $t0, 1f 10201984152ac92aad244ae15184d12f9ceade686b7bMathieu Chartier nop 10217db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers jr $ra 10227db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers nop 10237db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers1: 10247db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers DELIVER_PENDING_EXCEPTION 1025468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_to_interpreter_bridge 10267db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers 10275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1028725a957985171d712d5c048cc3d00ff14968784bjeffhao * Routine that intercepts method calls and returns. 10295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1030d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInstrumentationMethodEntryFromCode 1031d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInstrumentationMethodExitFromCode 1032468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_instrumentation_entry 103312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 103462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 103512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $sp # remember bottom of caller's frame 103662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, -32 # space for args, pad (3 words), arguments (5 words) 103762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset 32 103862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $a0, 28($sp) # save arg0 103962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $ra, 16($sp) # pass $ra 104062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a3, $t0 # pass $sp 104162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artInstrumentationMethodEntryFromCode # (Method*, Object*, Thread*, SP, LR) 104262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a2, rSELF # pass Thread::Current 10438161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $t9, $v0 # $t9 holds reference to code 104462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $a0, 28($sp) # restore arg0 104562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, 32 # remove args 104662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset -32 104762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 10488161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jalr $t9 # call method 104962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers nop 1050468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_entry 10515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* intentional fallthrough */ 1052468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .global art_quick_instrumentation_exit 1053468532ea115657709bc32ee498e701a4c71762d4Ian Rogersart_quick_instrumentation_exit: 1054d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_startproc 105512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao addiu $t9, $ra, 4 # put current address into $t9 to rebuild $gp 105612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 105712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $sp # remember bottom of caller's frame 105862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers SETUP_REF_ONLY_CALLEE_SAVE_FRAME 105962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, -48 # save return values and set up args 106062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset 48 106162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $v0, 32($sp) 1062d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 2, 0 106362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $v1, 36($sp) 1064d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 3, 4 106562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f0, 40($sp) 106662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f1, 44($sp) 106762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f0, 16($sp) # pass fpr result 106862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f1, 20($sp) 106962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a2, $v0 # pass gpr result 107062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a3, $v1 107112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $a1, $t0 # pass $sp 107262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artInstrumentationMethodExitFromCode # (Thread*, SP, gpr_res, fpr_res) 107312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $a0, rSELF # pass Thread::Current 107412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $v0 # set aside returned link register 107512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $ra, $v1 # set link register for deoptimization 107662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $v0, 32($sp) # restore return values 107762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $v1, 36($sp) 107862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers l.s $f0, 40($sp) 107962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers l.s $f1, 44($sp) 108012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao jr $t0 # return 108162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, 112 # 48 bytes of args + 64 bytes of callee save frame 108262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset -112 1083468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_exit 10845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 108512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao /* 108662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization 108762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers * will long jump to the upcall with a special exception of -1. 108812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao */ 1089d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artDeoptimize 1090d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artEnterInterpreterFromDeoptimize 1091d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deoptimize 109212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 109314dd5a82ad85a28612bf86e755ff929d767cea4cJeff Hao SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 109462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a0, rSELF # pass Thread::current 109562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artDeoptimize # artDeoptimize(Thread*, SP) 109612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao # Returns caller method's frame size. 109762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a1, $sp # pass $sp 1098d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deoptimize 109912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao 11005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 11015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 11025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 11035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 11045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 11055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 11067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 11077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 11087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 11095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1110d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shl_long 11115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* shl-long vAA, vBB, vCC */ 11127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v0, $a0, $a2 # rlo<- alo << (shift&31) 11137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $v1, $a2 # rhi<- 31-shift (shift is 5b) 11147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, 1 11157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, $v1 # alo<- alo >> (32-(shift&31)) 11167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v1, $a1, $a2 # rhi<- ahi << (shift&31) 11177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v1, $a0 # rhi<- rhi | alo 11187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift< shift & 0x20 11197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $v0, $a2 # rhi<- rlo (if shift&0x20) 11207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1121fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao movn $v0, $zero, $a2 # rlo<- 0 (if shift&0x20) 1122d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shl_long 11235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 11245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 11255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 11265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 11275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 11285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 11295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 11307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 11317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 11327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 11335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1134d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .global art_quick_shr_long 1135d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shr_long 11367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 11377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 11387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $a3, $a1, 31 # $a3<- sign(ah) 11397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 11407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 11417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 11427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 11437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 11447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 11457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 11467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $a3, $a2 # rhi<- sign(ahi) (if shift&0x20) 1147d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shr_long 11485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 11495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 11505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 11515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 11525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 11535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 11545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 11555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r0: low word 11565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r1: high word 11575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r2: shift count 11585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 11595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* ushr-long vAA, vBB, vCC */ 1160d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .global art_quick_ushr_long 1161d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_ushr_long 1162fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao srl $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 11637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 11647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 11657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 11667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 11677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 11687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 11697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 11707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1171fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao movn $v1, $zero, $a2 # rhi<- 0 (if shift&0x20) 1172d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_ushr_long 11737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1174d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_indexof 11757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 11760703060875166106af3d490c6c264611aea67ec8jeffhao nop 1177d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_indexof 11787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1179d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_string_compareto 11807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 11810703060875166106af3d490c6c264611aea67ec8jeffhao nop 1182d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_string_compareto 1183