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 190703060875166106af3d490c6c264611aea67ec8jeffhao .set noreorder 205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .balign 4 215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* Deliver the given exception */ 235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artDeliverExceptionFromCode 245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* Deliver an exception pending on a thread */ 258161c0336b97e11e02c000af357f8f40de2e23e4jeffhao .extern artDeliverPendingExceptionFromCode 265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kSaveAll) 301f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao * callee-save: $s0-$s8 + $gp + $ra, 11 total + 1 word padding + 4 open words for args 315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 3257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.macro SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 33fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao addiu $sp, $sp, -64 34d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset 64 35fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $ra, 60($sp) 36d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 31, 60 37fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $s8, 56($sp) 38d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 30, 56 391f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $gp, 52($sp) 401f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 28, 52 411f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s7, 48($sp) 421f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 23, 48 431f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s6, 44($sp) 441f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 22, 44 451f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s5, 40($sp) 461f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 21, 40 471f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s4, 36($sp) 481f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 20, 36 491f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s3, 32($sp) 501f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 19, 32 511f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s2, 28($sp) 521f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 18, 28 531f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s1, 24($sp) 541f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 17, 24 551f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s0, 20($sp) 561f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 16, 20 571f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao # 1 word for alignment, 4 open words for args $a0-$a3, bottom will hold Method* 585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC. 635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Does not include rSUSPEND or rSELF 641f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao * callee-save: $s2-$s8 + $gp + $ra, 9 total + 3 words padding + 4 open words for args 655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_ONLY_CALLEE_SAVE_FRAME 674eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, -64 68d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset 64 694eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $ra, 60($sp) 70d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 31, 60 714eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $s8, 56($sp) 72d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 30, 56 731f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $gp, 52($sp) 741f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 28, 52 751f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s7, 48($sp) 761f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 23, 48 771f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s6, 44($sp) 781f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 22, 44 791f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s5, 40($sp) 801f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 21, 40 811f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s4, 36($sp) 821f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 20, 36 831f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s3, 32($sp) 841f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 19, 32 851f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s2, 28($sp) 861f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 18, 28 87fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao # 3 words for alignment and extra args, 4 open words for args $a0-$a3, bottom will hold Method* 885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 911f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao lw $gp, 52($sp) 924eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $ra, 60($sp) 934eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, 64 94d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -64 955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 981f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao lw $gp, 52($sp) 994eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $ra, 60($sp) 1007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1014eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, 64 102d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -64 1035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 1075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC. 1081f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao * callee-save: $a1-$a3, $s2-$s8 + $gp + $ra, 12 total + 3 words padding + method* 1095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 1111f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao addiu $sp, $sp, -64 1121f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_adjust_cfa_offset 64 1131f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $ra, 60($sp) 1141f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 31, 60 1151f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s8, 56($sp) 1161f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 30, 56 1171f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $gp, 52($sp) 1181f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 28, 52 1191f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s7, 48($sp) 1201f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 23, 48 1211f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s6, 44($sp) 1221f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 22, 44 1231f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s5, 40($sp) 1241f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 21, 40 1251f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s4, 36($sp) 1261f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 20, 36 1271f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s3, 32($sp) 1281f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 19, 32 1291f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao sw $s2, 28($sp) 1301f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_rel_offset 18, 28 1317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a3, 12($sp) 132d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 7, 12 1337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a2, 8($sp) 134d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 6, 8 1357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a1, 4($sp) 136d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 5, 4 137fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao # bottom will hold Method* 1385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 1411f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao lw $ra, 60($sp) # restore $ra 1421f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao lw $gp, 52($sp) # restore $gp 1437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 4($sp) # restore non-callee save $a1 1447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 8($sp) # restore non-callee save $a2 1457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a3, 12($sp) # restore non-callee save $a3 146468532ea115657709bc32ee498e701a4c71762d4Ian Rogers addiu $sp, $sp, 64 # pop frame 1471f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_adjust_cfa_offset -64 1485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending 1525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * exception is Thread::Current()->exception_ 1535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro DELIVER_PENDING_EXCEPTION 1558161c0336b97e11e02c000af357f8f40de2e23e4jeffhao SETUP_SAVE_ALL_CALLEE_SAVE_FRAME # save callee saves for throw 1568161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a0, rSELF # pass Thread::Current 1578161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artDeliverPendingExceptionFromCode 1588161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artDeliverPendingExceptionFromCode(Thread*, $sp) 1598161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, $sp # pass $sp 1605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NO_EXCEPTION 1637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 1645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 1658161c0336b97e11e02c000af357f8f40de2e23e4jeffhao bnez $t0, 1f # success if no exception is pending 1665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 1705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 1715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_ZERO 1745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 1757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $v0, 1f # success? 1765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return on success 1785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 1805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 1815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NONZERO 1845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 1857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao beqz $v0, 1f # success? 1865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return on success 1885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 1905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 1915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * On entry $a0 is uint32_t* gprs_ and $a1 is uint32_t* fprs_ 1955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * FIXME: just guessing about the shape of the jmpbuf. Where will pc be? 1965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 197d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_do_long_jump 1987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f0, 0($a1) 1997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f1, 4($a1) 2007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f2, 8($a1) 2017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f3, 12($a1) 2027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f4, 16($a1) 2037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f5, 20($a1) 2047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f6, 24($a1) 2057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f7, 28($a1) 2067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f8, 32($a1) 2077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f9, 36($a1) 2087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f10, 40($a1) 2097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f11, 44($a1) 2107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f12, 48($a1) 2117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f13, 52($a1) 2127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f14, 56($a1) 2137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f15, 60($a1) 2147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f16, 64($a1) 2157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f17, 68($a1) 2167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f18, 72($a1) 2177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f19, 76($a1) 2187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f20, 80($a1) 2197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f21, 84($a1) 2207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f22, 88($a1) 2217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f23, 92($a1) 2227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f24, 96($a1) 2237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f25, 100($a1) 2247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f26, 104($a1) 2257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f27, 108($a1) 2267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f28, 112($a1) 2277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f29, 116($a1) 2287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f30, 120($a1) 2297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f31, 124($a1) 2307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $at, 4($a0) 2317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v0, 8($a0) 2327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v1, 12($a0) 2337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 20($a0) 2347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 24($a0) 2357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a3, 28($a0) 2367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, 32($a0) 2377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t1, 36($a0) 2387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t2, 40($a0) 2397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t3, 44($a0) 2407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t4, 48($a0) 2417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t5, 52($a0) 2427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t6, 56($a0) 2437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t7, 60($a0) 2447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s0, 64($a0) 2457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s1, 68($a0) 2467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s2, 72($a0) 2477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s3, 76($a0) 2487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s4, 80($a0) 2497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s5, 84($a0) 2507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s6, 88($a0) 2517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s7, 92($a0) 2527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t8, 96($a0) 2537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t9, 100($a0) 2547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $k0, 104($a0) 2557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $k1, 108($a0) 2567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $gp, 112($a0) 2577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $sp, 116($a0) 2587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $fp, 120($a0) 2597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $ra, 124($a0) 2607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a0, 16($a0) 2617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v0, $zero # clear result registers r0 and r1 2627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # do long jump 2637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v1, $zero 264d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_do_long_jump 2655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code, saves most registers (forms basis of long jump context) and passes 2685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at 2695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the thread. On entry r0 holds Throwable* 2705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 271468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_deliver_exception 27212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 27357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 2748161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, rSELF # pass Thread::Current 2758161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artDeliverExceptionFromCode 2768161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artDeliverExceptionFromCode(Throwable*, Thread*, $sp) 2778161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a2, $sp # pass $sp 278468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_deliver_exception 2795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver a NullPointerException 2825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 283d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowNullPointerExceptionFromCode 284468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_null_pointer_exception 28512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 28657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 2878161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a0, rSELF # pass Thread::Current 2888161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowNullPointerExceptionFromCode 2898161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowNullPointerExceptionFromCode(Thread*, $sp) 2908161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, $sp # pass $sp 291468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_null_pointer_exception 2925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArithmeticException 2955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 296d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowDivZeroFromCode 297468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_div_zero 29812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 29957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF # pass Thread::Current 3018161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowDivZeroFromCode 3028161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowDivZeroFromCode(Thread*, $sp) 3037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp # pass $sp 304468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_div_zero 3055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException 3085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 309d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowArrayBoundsFromCode 310468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_array_bounds 31112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 31257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3138161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a2, rSELF # pass Thread::Current 3148161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowArrayBoundsFromCode 3158161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowArrayBoundsFromCode(index, limit, Thread*, $sp) 3168161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a3, $sp # pass $sp 317468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_array_bounds 3185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 31957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 32057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a StackOverflowError. 32157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 322d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowStackOverflowFromCode 323468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_stack_overflow 32412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 32557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3268161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a0, rSELF # pass Thread::Current 3278161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowStackOverflowFromCode 3288161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowStackOverflowFromCode(Thread*, $sp) 3298161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, $sp # pass $sp 330468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_stack_overflow 3315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 33257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 33357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a NoSuchMethodError. 33457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 335d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowNoSuchMethodFromCode 336468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_throw_no_such_method 33712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 33857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3398161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, rSELF # pass Thread::Current 3408161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowNoSuchMethodFromCode 3418161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowNoSuchMethodFromCode(method_idx, Thread*, $sp) 3428161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a2, $sp # pass $sp 343468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_throw_no_such_method 3445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * All generated callsites for interface invokes and invocation slow paths will load arguments 3477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain 3485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the method_idx. This wrapper will save arg1-arg3, load the caller's Method*, align the 3495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * stack and call the appropriate C helper. 3507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1. 3515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 3527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting 3537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * of the target Method* in $v0 and method->code_ in $v1. 3545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 355fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao * If unsuccessful, the helper will return NULL/NULL. There will be a pending exception in the 3565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * thread and we branch to another stub to deliver it. 3575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 3585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On success this wrapper will restore arguments and *jump* to the target, leaving the lr 3595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * pointing back to the original caller. 3605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 3615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name 3625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern \cxx_name 363d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY \c_name 36412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 3657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME # save callee saves in case allocation triggers GC 3661f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao lw $a2, 64($sp) # pass caller Method* 367fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $t0, $sp # save $sp 36858df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, -32 # make space for extra args 36958df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset 32 3707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 371d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 28, 12 3727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal \cxx_name # (method_idx, this, caller, Thread*, $sp) 373fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $t0, 16($sp) # pass $sp 37458df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, 32 # release out args 37558df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset -32 376fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $a0, $v0 # save target Method* 37730a3317577d84feafa859b3e39d1545a995f0b7cjeffhao move $t9, $v1 # save $v0->code_ 3785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 379fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao beqz $v0, 1f 3805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 38130a3317577d84feafa859b3e39d1545a995f0b7cjeffhao jr $t9 3825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 3835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 3845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 385d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND \c_name 3865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 3875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3888dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline 3898dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck 3905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3918dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck 3928dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck 3938dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck 3948dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck 3955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 39679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao /* 3976474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao * Common invocation stub for portable and quick. 3985d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * On entry: 3995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a0 = method pointer 4005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a1 = argument array or NULL for no argument methods 4015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a2 = size of argument array in bytes 4025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a3 = (managed) thread pointer 4036474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao * [sp + 16] = JValue* result 4046474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao * [sp + 20] = result type char 4055d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao */ 40679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao .type art_portable_invoke_stub, %function 40779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao .global art_portable_invoke_stub 4086474d190d5604898354ebf767f1944b6e3e9b445Jeff Haoart_portable_invoke_stub: 4095d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoENTRY art_quick_invoke_stub 4105d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao GENERATE_GLOBAL_POINTER 4115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $a0, 0($sp) # save out a0 4125d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, -16 # spill s0, s1, fp, ra 4135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_adjust_cfa_offset 16 4145d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $ra, 12($sp) 4155d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 31, 12 4165d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $fp, 8($sp) 4175d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 30, 8 4185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $s1, 4($sp) 4195d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 17, 4 4205d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $s0, 0($sp) 4215d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 16, 0 4225d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $fp, $sp # save sp in fp 4235d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_def_cfa_register 30 4245d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $s1, $a3 # move managed thread pointer into s1 4255d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $s0, $zero, SUSPEND_CHECK_INTERVAL # reset s0 to suspend check interval 4265d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $t0, $a2, 16 # create space for method pointer in frame 4275d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao srl $t0, $t0, 3 # shift the frame size right 3 4285d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sll $t0, $t0, 3 # shift the frame size left 3 to align to 16 bytes 4295d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao subu $sp, $sp, $t0 # reserve stack space for argument array 4305d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $a0, $sp, 4 # pass stack pointer + method ptr as dest for memcpy 4315d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jal memcpy # (dest, src, bytes) 4325d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, -16 # make space for argument slots for memcpy 4335d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, 16 # restore stack after memcpy 4345d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a0, 16($fp) # restore method* 4355d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a1, 4($sp) # copy arg value for a1 4365d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a2, 8($sp) # copy arg value for a2 4375d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a3, 12($sp) # copy arg value for a3 4385d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $t9, METHOD_CODE_OFFSET($a0) # get pointer to the code 4395d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jalr $t9 # call the method 4405d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $zero, 0($sp) # store NULL for method* at bottom of frame 4415d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $sp, $fp # restore the stack 4425d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $s0, 0($sp) 4435d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $s1, 4($sp) 4445d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $fp, 8($sp) 4455d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $ra, 12($sp) 4465d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, 16 4475d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_adjust_cfa_offset -16 4485d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $t0, 16($sp) # get result pointer 4496474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao lw $t1, 20($sp) # get result type char 4506474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao li $t2, 68 # put char 'D' into t2 4516474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao beq $t1, $t2, 1f # branch if result type char == 'D' 4526474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao li $t3, 70 # put char 'F' into t3 4536474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao beq $t1, $t3, 1f # branch if result type char == 'F' 4545d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $v0, 0($t0) # store the result 4556474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao jr $ra 4565d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $v1, 4($t0) # store the other half of the result 4576474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao1: 45819ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao s.s $f0, 0($t0) # store floating point result 4595d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jr $ra 46019ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao s.s $f1, 4($t0) # store other half of floating point result 4615d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoEND art_quick_invoke_stub 4626474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao .size art_portable_invoke_stub, .-art_portable_invoke_stub 4635d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao 4645d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao /* 4655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on 4665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * failure. 4675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 468d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artHandleFillArrayDataFromCode 469468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_handle_fill_data 47012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 4717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 4727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 4737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artHandleFillArrayDataFromCode # (Array*, const DexFile::Payload*, Thread*, $sp) 4747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 475fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao RETURN_IF_ZERO 476468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_handle_fill_data 4775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 47957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code that calls artLockObjectFromCode, may block for GC. 4805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 481d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artLockObjectFromCode 482468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_lock_object 48312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 4847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case we block 4857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 4867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artLockObjectFromCode # (Object* obj, Thread*, $sp) 4877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # pass $sp 4885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 489468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_lock_object 4905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 4925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure. 4935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 494d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artUnlockObjectFromCode 495468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_unlock_object 49612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 4977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 4987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 4997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artUnlockObjectFromCode # (Object* obj, Thread*, $sp) 5007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # pass $sp 5015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 502468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_unlock_object 5035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 5055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure. 5065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 507d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artCheckCastFromCode 508468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_cast 50912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 5107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 5117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 5127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artCheckCastFromCode # (Class* a, Class* b, Thread*, $sp) 5137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 5145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 515468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_cast 5165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 5185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artCanPutArrayElementFromCode and delivers exception on 5195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * failure. 5205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 521d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artCanPutArrayElementFromCode 522468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_can_put_array_element 52312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 5247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 5257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 5267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artCanPutArrayElementFromCode # (Object* element, Class* array_class, Thread*, $sp) 5277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 5285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 529468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_can_put_array_element 5305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 5325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when uninitialized static storage, this stub will run the class 5335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * initializer and deliver the exception on error. On success the static storage base is 5345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * returned. 5355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 536d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeStaticStorageFromCode 537468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_static_storage 53812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 5397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 5407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 5417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 5425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeStaticStorageFromCode 5437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 5445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 545468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_static_storage 5465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 54857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code when dex cache misses for a type_idx. 5495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 550d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeTypeFromCode 551468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type 55212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 5537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 5547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 5557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 5565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeFromCode 5577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 5585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 559468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type 5605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 5625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when type_idx needs to be checked for access and dex cache may also 56357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * miss. 5645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 565d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeTypeAndVerifyAccessFromCode 566468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_initialize_type_and_verify_access 56712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 5687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 5697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 5707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 5715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeAndVerifyAccessFromCode 5727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 5735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 574468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_initialize_type_and_verify_access 5755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 57757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 32-bit primitive value. 5785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 579d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet32StaticFromCode 580468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_static 58112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 5827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 5834eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 5847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 585fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet32StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 5867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 5875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 588468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_static 5895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 59157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 64-bit primitive value. 5925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 593d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet64StaticFromCode 594468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_static 59512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 5967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 5974eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 5987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 599fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet64StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 6007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 6015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 602468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_static 6035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 60557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load an object reference. 6065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 607d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGetObjStaticFromCode 608468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_static 60912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 6107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6114eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 6127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 613fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGetObjStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 6147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 6155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 616468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_static 6175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 61957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 32-bit primitive value. 6205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 621d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet32InstanceFromCode 622468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get32_instance 62312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 6247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6254eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 6267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 627fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet32InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 6284eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 6295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 630468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get32_instance 6315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 63357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 64-bit primitive value. 6345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 635d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet64InstanceFromCode 636468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get64_instance 63712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 6387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6394eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 6407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 641fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet64InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 6424eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 6435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 644468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get64_instance 6455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 64757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load an object reference. 6485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 649d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGetObjInstanceFromCode 650468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_get_obj_instance 65112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 6527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6534eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 6547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 655fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGetObjInstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 6564eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 6575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 658468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_get_obj_instance 6595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 66157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 32-bit primitive value. 6625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 663d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32StaticFromCode 664468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_static 66512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 6667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6674eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 6687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 669fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSet32StaticFromCode # (field_idx, new_val, referrer, Thread*, $sp) 6704eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 6715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 672468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_static 6735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 67557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 64-bit primitive value. 6765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 677d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32StaticFromCode 678468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_static 67912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 6807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6814eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 682fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 6837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSet64StaticFromCode # (field_idx, referrer, new_val, Thread*, $sp) 6844eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 6855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 686468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_static 6875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 68957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store an object reference. 6905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 691d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSetObjStaticFromCode 692468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_static 69312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 6947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6954eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 6967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 697fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSetObjStaticFromCode # (field_idx, new_val, referrer, Thread*, $sp) 6984eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 6995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 700468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_static 7015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 70357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 32-bit primitive value. 7045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 705d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32InstanceFromCode 706468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set32_instance 70712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7094eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a3, 64($sp) # pass referrer's Method* 710fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 7117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSet32InstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*, $sp) 7124eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 7135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 714468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set32_instance 7155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 71757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 64-bit primitive value. 7185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 719d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32InstanceFromCode 720468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set64_instance 72112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 723fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 724fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSet64InstanceFromCode # (field_idx, Object*, new_val, Thread*, $sp) 7254eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 7265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 727468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set64_instance 7285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 73057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store an object reference. 7315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 732d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSetObjInstanceFromCode 733468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_set_obj_instance 73412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7364eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a3, 64($sp) # pass referrer's Method* 737fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 738fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSetObjInstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*, $sp) 7394eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 7405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 741468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_set_obj_instance 7425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 7445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code to resolve a string, this stub will allocate a String and deliver an 7455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * exception on error. On success the String is returned. R0 holds the referring method, 7465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * R1 holds the string index. The fast path check for hit in strings cache has already been 7475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * performed. 7485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 749d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artResolveStringFromCode 750468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolve_string 75112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*, $sp) 7555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artResolveStringFromCode 7567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 757fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao RETURN_IF_NONZERO 758468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolve_string 7595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 76157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to allocate an object. 7625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 763d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artAllocObjectFromCode 764468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_alloc_object 76512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artAllocObjectFromCode # (uint32_t type_idx, Method* method, Thread*, $sp) 7697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 7705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 771468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_alloc_object 7725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 7745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to allocate an object when the caller doesn't know whether it has 77557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * access to the created type. 7765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 777d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artAllocObjectFromCodeWithAccessCheck 778468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_alloc_object_with_access_check 77912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artAllocObjectFromCodeWithAccessCheck # (uint32_t type_idx, Method* method, Thread*, $sp) 7837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 7845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 785468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_alloc_object_with_access_check 7865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 78857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to allocate an array. 7895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 790d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artAllocArrayFromCode 791468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_alloc_array 79212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 7957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t component_count, Thread*, $sp) 7965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artAllocArrayFromCode 7974eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 7985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 799468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_alloc_array 8005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 8025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to allocate an array when the caller doesn't know whether it has 80357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * access to the created type. 8045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 805d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artAllocArrayFromCodeWithAccessCheck 806468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_alloc_array_with_access_check 80712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 8107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artAllocArrayFromCodeWithAccessCheck(type_idx, method, component_count, Thread*, $sp) 8115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artAllocArrayFromCodeWithAccessCheck 8124eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 814468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_alloc_array_with_access_check 8155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 81757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY. 8185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 819d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artCheckAndAllocArrayFromCode 820468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_and_alloc_array 82112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 8247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artCheckAndAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t count, Thread* , $sp) 8255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artCheckAndAllocArrayFromCode 8264eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 828468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_and_alloc_array 8295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 83157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY. 8325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 833d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artCheckAndAllocArrayFromCodeWithAccessCheck 834468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_check_and_alloc_array_with_access_check 83512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 837fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $a3, rSELF # pass Thread::Current 8387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artCheckAndAllocArrayFromCodeWithAccessCheck(type_idx, method, count, Thread* , $sp) 8395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artCheckAndAllocArrayFromCodeWithAccessCheck 8404eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 842468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_check_and_alloc_array_with_access_check 8435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 84557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code when the value in rSUSPEND has been decremented to 0. 8465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 847d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artTestSuspendFromCode 848d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_test_suspend 84912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 850474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers lh $a0, THREAD_FLAGS_OFFSET(rSELF) 8517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $a0, 1f 8527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addi rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL # reset rSUSPEND to SUSPEND_CHECK_INTERVAL 8537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 8545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 8555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 8567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF 8577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves for stack crawl 8587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artTestSuspendFromCode # (Thread*, $sp) 8597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp 8605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 861d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_test_suspend 8625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 8645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code that is attempting to call a method on a proxy class. On entry 86557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * r0 holds the proxy method; r1, r2 and r3 may contain arguments. 8665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 8675fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao .extern artQuickProxyInvokeHandler 868d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_proxy_invoke_handler 86912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 8717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a0, 0($sp) # place proxy method at bottom of frame 8727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 8735fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao jal artQuickProxyInvokeHandler # (Method* proxy method, receiver, Thread*, SP) 874af6e67a4816d2593586115b89faa659225363246Ian Rogers move $a3, $sp # pass $sp 8757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 8761f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao lw $gp, 52($sp) # restore $gp 8771f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao lw $ra, 60($sp) # restore $ra 8787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $t0, 1f 8791f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao addiu $sp, $sp, 64 # pop frame 8801f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_adjust_cfa_offset -64 8817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 8825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 8835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 8845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 885d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_proxy_invoke_handler 8865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 887468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .extern artQuickResolutionTrampoline 888468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_resolution_trampoline 889468532ea115657709bc32ee498e701a4c71762d4Ian Rogers GENERATE_GLOBAL_POINTER 890468532ea115657709bc32ee498e701a4c71762d4Ian Rogers SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 891468532ea115657709bc32ee498e701a4c71762d4Ian Rogers move $a2, rSELF # pass Thread::Current 892eb1efc4575e93543ed459c7ee5c6c36109e69b5fIan Rogers jal artQuickResolutionTrampoline # (Method* called, receiver, Thread*, SP) 893468532ea115657709bc32ee498e701a4c71762d4Ian Rogers move $a3, $sp # pass $sp 894468532ea115657709bc32ee498e701a4c71762d4Ian Rogers lw $gp, 52($sp) # restore $gp 895468532ea115657709bc32ee498e701a4c71762d4Ian Rogers lw $ra, 60($sp) # restore $ra 896468532ea115657709bc32ee498e701a4c71762d4Ian Rogers beqz $v0, 1f 897468532ea115657709bc32ee498e701a4c71762d4Ian Rogers lw $a0, 0($sp) # load resolved method to $a0 898468532ea115657709bc32ee498e701a4c71762d4Ian Rogers lw $a1, 4($sp) # restore non-callee save $a1 899468532ea115657709bc32ee498e701a4c71762d4Ian Rogers lw $a2, 8($sp) # restore non-callee save $a2 900468532ea115657709bc32ee498e701a4c71762d4Ian Rogers lw $a3, 12($sp) # restore non-callee save $a3 901eb1efc4575e93543ed459c7ee5c6c36109e69b5fIan Rogers move $t9, $v0 # code pointer must be in $t9 to generate the global pointer 902468532ea115657709bc32ee498e701a4c71762d4Ian Rogers jr $v0 # tail call to method 903468532ea115657709bc32ee498e701a4c71762d4Ian Rogers1: 904468532ea115657709bc32ee498e701a4c71762d4Ian Rogers addiu $sp, $sp, 64 # pop frame 905468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .cfi_adjust_cfa_offset -64 906468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DELIVER_PENDING_EXCEPTION 907468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_resolution_trampoline 908468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 909468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .extern artQuickToInterpreterBridge 910468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_to_interpreter_bridge 9117db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers GENERATE_GLOBAL_POINTER 9127db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 9137db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers move $a1, rSELF # pass Thread::Current 914468532ea115657709bc32ee498e701a4c71762d4Ian Rogers jal artQuickToInterpreterBridge # (Method* method, Thread*, SP) 9157db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers move $a2, $sp # pass $sp 9167db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 9171f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao lw $gp, 52($sp) # restore $gp 9181f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao lw $ra, 60($sp) # restore $ra 9197db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers bnez $t0, 1f 9201f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao addiu $sp, $sp, 64 # pop frame 9211f3bc2f0f9366594379249027622ab63673b0d3bJeff Hao .cfi_adjust_cfa_offset -64 9227db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers jr $ra 9237db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers nop 9247db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers1: 9257db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers DELIVER_PENDING_EXCEPTION 926468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_to_interpreter_bridge 9277db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers 9285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 929725a957985171d712d5c048cc3d00ff14968784bjeffhao * Routine that intercepts method calls and returns. 9305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 931d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInstrumentationMethodEntryFromCode 932d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInstrumentationMethodExitFromCode 933468532ea115657709bc32ee498e701a4c71762d4Ian RogersENTRY art_quick_instrumentation_entry 93412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 93562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 93612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $sp # remember bottom of caller's frame 93762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, -32 # space for args, pad (3 words), arguments (5 words) 93862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset 32 93962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $a0, 28($sp) # save arg0 94062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $ra, 16($sp) # pass $ra 94162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a3, $t0 # pass $sp 94262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artInstrumentationMethodEntryFromCode # (Method*, Object*, Thread*, SP, LR) 94362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a2, rSELF # pass Thread::Current 9448161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $t9, $v0 # $t9 holds reference to code 94562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $a0, 28($sp) # restore arg0 94662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, 32 # remove args 94762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset -32 94862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 9498161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jalr $t9 # call method 95062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers nop 951468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_entry 9525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* intentional fallthrough */ 953468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .global art_quick_instrumentation_exit 954468532ea115657709bc32ee498e701a4c71762d4Ian Rogersart_quick_instrumentation_exit: 955d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_startproc 95612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao addiu $t9, $ra, 4 # put current address into $t9 to rebuild $gp 95712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 95812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $sp # remember bottom of caller's frame 95962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers SETUP_REF_ONLY_CALLEE_SAVE_FRAME 96062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, -48 # save return values and set up args 96162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset 48 96262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $v0, 32($sp) 963d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 2, 0 96462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $v1, 36($sp) 965d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 3, 4 96662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f0, 40($sp) 96762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f1, 44($sp) 96862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f0, 16($sp) # pass fpr result 96962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f1, 20($sp) 97062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a2, $v0 # pass gpr result 97162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a3, $v1 97212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $a1, $t0 # pass $sp 97362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artInstrumentationMethodExitFromCode # (Thread*, SP, gpr_res, fpr_res) 97412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $a0, rSELF # pass Thread::Current 97512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $v0 # set aside returned link register 97612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $ra, $v1 # set link register for deoptimization 97762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $v0, 32($sp) # restore return values 97862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $v1, 36($sp) 97962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers l.s $f0, 40($sp) 98062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers l.s $f1, 44($sp) 98112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao jr $t0 # return 98262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, 112 # 48 bytes of args + 64 bytes of callee save frame 98362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset -112 984468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND art_quick_instrumentation_exit 9855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 98612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao /* 98762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization 98862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers * will long jump to the upcall with a special exception of -1. 98912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao */ 990d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artDeoptimize 991d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artEnterInterpreterFromDeoptimize 992d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deoptimize 99312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 99414dd5a82ad85a28612bf86e755ff929d767cea4cJeff Hao SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 99562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a0, rSELF # pass Thread::current 99662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artDeoptimize # artDeoptimize(Thread*, SP) 99712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao # Returns caller method's frame size. 99862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a1, $sp # pass $sp 999d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deoptimize 100012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao 10015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 10025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 10035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 10045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 10055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 10065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 10077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 10087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 10097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 10105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1011d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shl_long 10125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* shl-long vAA, vBB, vCC */ 10137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v0, $a0, $a2 # rlo<- alo << (shift&31) 10147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $v1, $a2 # rhi<- 31-shift (shift is 5b) 10157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, 1 10167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, $v1 # alo<- alo >> (32-(shift&31)) 10177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v1, $a1, $a2 # rhi<- ahi << (shift&31) 10187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v1, $a0 # rhi<- rhi | alo 10197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift< shift & 0x20 10207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $v0, $a2 # rhi<- rlo (if shift&0x20) 10217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1022fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao movn $v0, $zero, $a2 # rlo<- 0 (if shift&0x20) 1023d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shl_long 10245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 10255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 10265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 10275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 10285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 10295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 10305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 10317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 10327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 10337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 10345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1035d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .global art_quick_shr_long 1036d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shr_long 10377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 10387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 10397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $a3, $a1, 31 # $a3<- sign(ah) 10407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 10417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 10427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 10437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 10447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 10457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 10467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 10477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $a3, $a2 # rhi<- sign(ahi) (if shift&0x20) 1048d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shr_long 10495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 10505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 10515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 10525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 10535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 10545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 10555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 10565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r0: low word 10575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r1: high word 10585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r2: shift count 10595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 10605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* ushr-long vAA, vBB, vCC */ 1061d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .global art_quick_ushr_long 1062d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_ushr_long 1063fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao srl $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 10647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 10657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 10667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 10677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 10687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 10697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 10707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 10717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1072fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao movn $v1, $zero, $a2 # rhi<- 0 (if shift&0x20) 1073d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_ushr_long 10747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1075d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_indexof 10767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 10770703060875166106af3d490c6c264611aea67ec8jeffhao nop 1078d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_indexof 10797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1080d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_string_compareto 10817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 10820703060875166106af3d490c6c264611aea67ec8jeffhao nop 1083d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_string_compareto 1084