quick_entrypoints_mips.S revision 79fe539587d4c09244172d0168eeed0ec9770466
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 175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee#include "asm_support.h" 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 2757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* Cache alignment for function entry */ 28d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao.macro ENTRY name 29d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .type \name, %function 30d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .global \name 3157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers .balign 16 32d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao\name: 33d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_startproc 34d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao.endm 35d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao 36d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao.macro END name 37d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_endproc 38d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .size \name, .-\name 3957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.endm 4057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 4112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao /* Generates $gp for function calls */ 4212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao.macro GENERATE_GLOBAL_POINTER 4312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao .cpload $t9 4412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao.endm 4512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao 465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kSaveAll) 49fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao * callee-save: $s0-$s8 + $ra, 10 total + 4 words 505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 5157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.macro SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 52fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao addiu $sp, $sp, -64 53d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset 64 54fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $ra, 60($sp) 55d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 31, 60 56fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $s8, 56($sp) 57d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 30, 56 58fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $s7, 52($sp) 59d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 23, 52 60fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $s6, 48($sp) 61d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 22, 48 62fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $s5, 44($sp) 63d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 21, 44 64fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $s4, 40($sp) 65d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 20, 40 66fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $s3, 36($sp) 67d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 19, 36 68fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $s2, 32($sp) 69d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 18, 32 70fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $s1, 28($sp) 71d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 17, 28 72fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $s0, 24($sp) 73d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 16, 24 74fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao # 2 words for alignment, 4 open words for args $a0-$a3, bottom will hold Method* 755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC. 805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Does not include rSUSPEND or rSELF 81fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao * callee-save: $s2-$s8 + $ra, 8 total + 4 words + extra args + gp 825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_ONLY_CALLEE_SAVE_FRAME 844eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, -64 85d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset 64 864eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $ra, 60($sp) 87d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 31, 60 884eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $s8, 56($sp) 89d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 30, 56 904eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $s7, 52($sp) 91d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 23, 52 924eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $s6, 48($sp) 93d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 22, 48 944eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $s5, 44($sp) 95d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 21, 44 964eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $s4, 40($sp) 97d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 20, 40 984eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $s3, 36($sp) 99d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 19, 36 1004eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $s2, 32($sp) 101d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 18, 32 102fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao sw $gp, 28($sp) 103d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 28, 28 104fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao # 3 words for alignment and extra args, 4 open words for args $a0-$a3, bottom will hold Method* 1055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 108fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao lw $gp, 28($sp) 1094eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $ra, 60($sp) 1104eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, 64 111d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -64 1125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 1154eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $ra, 60($sp) 1167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1174eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao addiu $sp, $sp, 64 118d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -64 1195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 1235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC. 124fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao * $a1-$a3, $s2-$s8, $ra, 11 total + Method* 1255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 1270703060875166106af3d490c6c264611aea67ec8jeffhao addiu $sp, $sp, -48 128d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset 48 1297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $ra, 44($sp) 130d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 31, 44 1317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s8, 40($sp) 132d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 30, 40 1337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s7, 36($sp) 134d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 23, 36 1357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s6, 32($sp) 136d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 22, 32 1377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s5, 28($sp) 138d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 21, 28 1397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s4, 24($sp) 140d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 20, 24 1417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s3, 20($sp) 142d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 19, 20 1437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s2, 16($sp) 144d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 18, 16 1457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a3, 12($sp) 146d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 7, 12 1477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a2, 8($sp) 148d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 6, 8 1497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a1, 4($sp) 150d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 5, 4 151fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao # bottom will hold Method* 1525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 1557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $ra, 44($sp) # restore $ra 1567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 4($sp) # restore non-callee save $a1 1577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 8($sp) # restore non-callee save $a2 1587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a3, 12($sp) # restore non-callee save $a3 1597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 48 # strip frame 160d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -48 1615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending 1655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * exception is Thread::Current()->exception_ 1665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro DELIVER_PENDING_EXCEPTION 1688161c0336b97e11e02c000af357f8f40de2e23e4jeffhao SETUP_SAVE_ALL_CALLEE_SAVE_FRAME # save callee saves for throw 1698161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a0, rSELF # pass Thread::Current 1708161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artDeliverPendingExceptionFromCode 1718161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artDeliverPendingExceptionFromCode(Thread*, $sp) 1728161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, $sp # pass $sp 1735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NO_EXCEPTION 1767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 1775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 1788161c0336b97e11e02c000af357f8f40de2e23e4jeffhao bnez $t0, 1f # success if no exception is pending 1795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 1835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 1845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_ZERO 1875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 1887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $v0, 1f # success? 1895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return on success 1915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 1935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 1945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NONZERO 1975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 1987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao beqz $v0, 1f # success? 1995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return on success 2015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 2025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 2035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 2045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 2055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * On entry $a0 is uint32_t* gprs_ and $a1 is uint32_t* fprs_ 2085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * FIXME: just guessing about the shape of the jmpbuf. Where will pc be? 2095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 210d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_do_long_jump 2117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f0, 0($a1) 2127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f1, 4($a1) 2137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f2, 8($a1) 2147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f3, 12($a1) 2157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f4, 16($a1) 2167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f5, 20($a1) 2177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f6, 24($a1) 2187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f7, 28($a1) 2197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f8, 32($a1) 2207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f9, 36($a1) 2217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f10, 40($a1) 2227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f11, 44($a1) 2237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f12, 48($a1) 2247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f13, 52($a1) 2257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f14, 56($a1) 2267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f15, 60($a1) 2277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f16, 64($a1) 2287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f17, 68($a1) 2297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f18, 72($a1) 2307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f19, 76($a1) 2317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f20, 80($a1) 2327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f21, 84($a1) 2337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f22, 88($a1) 2347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f23, 92($a1) 2357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f24, 96($a1) 2367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f25, 100($a1) 2377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f26, 104($a1) 2387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f27, 108($a1) 2397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f28, 112($a1) 2407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f29, 116($a1) 2417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f30, 120($a1) 2427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f31, 124($a1) 2437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $at, 4($a0) 2447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v0, 8($a0) 2457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v1, 12($a0) 2467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 20($a0) 2477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 24($a0) 2487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a3, 28($a0) 2497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, 32($a0) 2507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t1, 36($a0) 2517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t2, 40($a0) 2527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t3, 44($a0) 2537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t4, 48($a0) 2547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t5, 52($a0) 2557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t6, 56($a0) 2567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t7, 60($a0) 2577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s0, 64($a0) 2587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s1, 68($a0) 2597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s2, 72($a0) 2607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s3, 76($a0) 2617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s4, 80($a0) 2627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s5, 84($a0) 2637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s6, 88($a0) 2647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s7, 92($a0) 2657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t8, 96($a0) 2667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t9, 100($a0) 2677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $k0, 104($a0) 2687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $k1, 108($a0) 2697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $gp, 112($a0) 2707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $sp, 116($a0) 2717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $fp, 120($a0) 2727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $ra, 124($a0) 2737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a0, 16($a0) 2747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v0, $zero # clear result registers r0 and r1 2757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # do long jump 2767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v1, $zero 277d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_do_long_jump 2785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code, saves most registers (forms basis of long jump context) and passes 2815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at 2825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the thread. On entry r0 holds Throwable* 2835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 284d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deliver_exception_from_code 28512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 28657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 2878161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, rSELF # pass Thread::Current 2888161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artDeliverExceptionFromCode 2898161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artDeliverExceptionFromCode(Throwable*, Thread*, $sp) 2908161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a2, $sp # pass $sp 291d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deliver_exception_from_code 2925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver a NullPointerException 2955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 296d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowNullPointerExceptionFromCode 297d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_throw_null_pointer_exception_from_code 29812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 29957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3008161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a0, rSELF # pass Thread::Current 3018161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowNullPointerExceptionFromCode 3028161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowNullPointerExceptionFromCode(Thread*, $sp) 3038161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, $sp # pass $sp 304d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_throw_null_pointer_exception_from_code 3055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArithmeticException 3085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 309d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowDivZeroFromCode 310d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_throw_div_zero_from_code 31112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 31257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF # pass Thread::Current 3148161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowDivZeroFromCode 3158161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowDivZeroFromCode(Thread*, $sp) 3167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp # pass $sp 317d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_throw_div_zero_from_code 3185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException 3215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 322d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowArrayBoundsFromCode 323d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_throw_array_bounds_from_code 32412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 32557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3268161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a2, rSELF # pass Thread::Current 3278161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowArrayBoundsFromCode 3288161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowArrayBoundsFromCode(index, limit, Thread*, $sp) 3298161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a3, $sp # pass $sp 330d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_throw_array_bounds_from_code 3315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 33257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 33357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a StackOverflowError. 33457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 335d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowStackOverflowFromCode 336d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_throw_stack_overflow_from_code 33712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 33857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3398161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a0, rSELF # pass Thread::Current 3408161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowStackOverflowFromCode 3418161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowStackOverflowFromCode(Thread*, $sp) 3428161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, $sp # pass $sp 343d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_throw_stack_overflow_from_code 3445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 34557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 34657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a NoSuchMethodError. 34757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 348d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artThrowNoSuchMethodFromCode 349d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_throw_no_such_method_from_code 35012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 35157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3528161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a1, rSELF # pass Thread::Current 3538161c0336b97e11e02c000af357f8f40de2e23e4jeffhao la $t9, artThrowNoSuchMethodFromCode 3548161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jr $t9 # artThrowNoSuchMethodFromCode(method_idx, Thread*, $sp) 3558161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $a2, $sp # pass $sp 356d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_throw_no_such_method_from_code 3575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * All generated callsites for interface invokes and invocation slow paths will load arguments 3607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain 3615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the method_idx. This wrapper will save arg1-arg3, load the caller's Method*, align the 3625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * stack and call the appropriate C helper. 3637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1. 3645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 3657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting 3667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * of the target Method* in $v0 and method->code_ in $v1. 3675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 368fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao * If unsuccessful, the helper will return NULL/NULL. There will be a pending exception in the 3695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * thread and we branch to another stub to deliver it. 3705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 3715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On success this wrapper will restore arguments and *jump* to the target, leaving the lr 3725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * pointing back to the original caller. 3735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 3745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name 3755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern \cxx_name 376d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY \c_name 37712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 3787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME # save callee saves in case allocation triggers GC 3797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 48($sp) # pass caller Method* 380fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $t0, $sp # save $sp 38158df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, -32 # make space for extra args 38258df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset 32 3837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 38458df32711162823647356afe25ae2cde04133563Jeff Hao sw $gp, 20($sp) # save $gp 385d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 28, 12 3867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal \cxx_name # (method_idx, this, caller, Thread*, $sp) 387fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $t0, 16($sp) # pass $sp 38858df32711162823647356afe25ae2cde04133563Jeff Hao lw $gp, 20($sp) # restore $gp 38958df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, 32 # release out args 39058df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset -32 391fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $a0, $v0 # save target Method* 39230a3317577d84feafa859b3e39d1545a995f0b7cjeffhao move $t9, $v1 # save $v0->code_ 3935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 394fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao beqz $v0, 1f 3955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 39630a3317577d84feafa859b3e39d1545a995f0b7cjeffhao jr $t9 3975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 3985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 3995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 400d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND \c_name 4015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 4025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4038dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline 4048dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck 4055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4068dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck 4078dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck 4088dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck 4098dbb708c7dc05c786329eb5c3fff3194ab6472acLogan ChienINVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck 4105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 41179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao /* 41258df32711162823647356afe25ae2cde04133563Jeff Hao * Portable resolution trampoline. 41358df32711162823647356afe25ae2cde04133563Jeff Hao */ 41479fe539587d4c09244172d0168eeed0ec9770466Jeff Hao .extern artPortableResolutionTrampoline 41558df32711162823647356afe25ae2cde04133563Jeff HaoENTRY art_portable_resolution_trampoline 41658df32711162823647356afe25ae2cde04133563Jeff Hao GENERATE_GLOBAL_POINTER 41758df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, -32 # leave room for $a0, $a1, $a2, $a3, and $ra 41858df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset 32 41958df32711162823647356afe25ae2cde04133563Jeff Hao sw $ra, 16($sp) 42058df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_rel_offset 31, 16 42158df32711162823647356afe25ae2cde04133563Jeff Hao sw $a3, 12($sp) 42258df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_rel_offset 7, 12 42358df32711162823647356afe25ae2cde04133563Jeff Hao sw $a2, 8($sp) 42458df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_rel_offset 6, 8 42558df32711162823647356afe25ae2cde04133563Jeff Hao sw $a1, 4($sp) 42658df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_rel_offset 5, 4 42758df32711162823647356afe25ae2cde04133563Jeff Hao sw $a0, 0($sp) 42858df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_rel_offset 4, 0 42958df32711162823647356afe25ae2cde04133563Jeff Hao move $a2, $s1 # pass Thread::Current() 43058df32711162823647356afe25ae2cde04133563Jeff Hao jal artPortableResolutionTrampoline # (method_idx, sp, Thread*) 43158df32711162823647356afe25ae2cde04133563Jeff Hao move $a1, $sp # pass stack pointer 43258df32711162823647356afe25ae2cde04133563Jeff Hao lw $a0, 0($sp) # restore registers from stack 43358df32711162823647356afe25ae2cde04133563Jeff Hao lw $a1, 4($sp) 43458df32711162823647356afe25ae2cde04133563Jeff Hao lw $a2, 8($sp) 43558df32711162823647356afe25ae2cde04133563Jeff Hao lw $a3, 12($sp) 43658df32711162823647356afe25ae2cde04133563Jeff Hao lw $ra, 16($sp) 43758df32711162823647356afe25ae2cde04133563Jeff Hao beq $v0, $zero, resolve_fail 43858df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, 32 # restore the stack 43958df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset -32 44058df32711162823647356afe25ae2cde04133563Jeff Hao jr $t9 # leaf call to method's code 44158df32711162823647356afe25ae2cde04133563Jeff Hao move $t9, $v0 # put method code result in $t9 44258df32711162823647356afe25ae2cde04133563Jeff Haoresolve_fail: 44358df32711162823647356afe25ae2cde04133563Jeff Hao jr $ra 44458df32711162823647356afe25ae2cde04133563Jeff Hao nop 44558df32711162823647356afe25ae2cde04133563Jeff HaoEND art_portable_resolution_trampoline 44658df32711162823647356afe25ae2cde04133563Jeff Hao 44779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao /* 44858df32711162823647356afe25ae2cde04133563Jeff Hao * Quick resolution trampoline. 44958df32711162823647356afe25ae2cde04133563Jeff Hao */ 45079fe539587d4c09244172d0168eeed0ec9770466Jeff Hao .extern artQuickResolutionTrampoline 45158df32711162823647356afe25ae2cde04133563Jeff HaoENTRY art_quick_resolution_trampoline 45258df32711162823647356afe25ae2cde04133563Jeff Hao GENERATE_GLOBAL_POINTER 45358df32711162823647356afe25ae2cde04133563Jeff Hao SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 45458df32711162823647356afe25ae2cde04133563Jeff Hao move $a2, $s1 # pass Thread::Current() 45558df32711162823647356afe25ae2cde04133563Jeff Hao jal artQuickResolutionTrampoline # (method_idx, sp, Thread*) 45658df32711162823647356afe25ae2cde04133563Jeff Hao move $a1, $sp # pass stack pointer 45758df32711162823647356afe25ae2cde04133563Jeff Hao move $t9, $v0 # put method code result in $t9 45858df32711162823647356afe25ae2cde04133563Jeff Hao lw $a0, 0($sp) # restore registers from stack 45958df32711162823647356afe25ae2cde04133563Jeff Hao lw $a1, 4($sp) 46058df32711162823647356afe25ae2cde04133563Jeff Hao lw $a2, 8($sp) 46158df32711162823647356afe25ae2cde04133563Jeff Hao lw $a3, 12($sp) 46258df32711162823647356afe25ae2cde04133563Jeff Hao lw $s2, 16($sp) 46358df32711162823647356afe25ae2cde04133563Jeff Hao lw $s3, 20($sp) 46458df32711162823647356afe25ae2cde04133563Jeff Hao lw $s4, 24($sp) 46558df32711162823647356afe25ae2cde04133563Jeff Hao lw $s5, 28($sp) 46658df32711162823647356afe25ae2cde04133563Jeff Hao lw $s6, 32($sp) 46758df32711162823647356afe25ae2cde04133563Jeff Hao lw $s7, 36($sp) 46858df32711162823647356afe25ae2cde04133563Jeff Hao lw $fp, 40($sp) 46958df32711162823647356afe25ae2cde04133563Jeff Hao lw $ra, 44($sp) 47058df32711162823647356afe25ae2cde04133563Jeff Hao jr $t9 # leaf call to method's code 47158df32711162823647356afe25ae2cde04133563Jeff Hao addiu $sp, $sp, 48 # restore the stack 47258df32711162823647356afe25ae2cde04133563Jeff Hao .cfi_adjust_cfa_offset -48 47358df32711162823647356afe25ae2cde04133563Jeff HaoEND art_quick_resolution_trampoline 47458df32711162823647356afe25ae2cde04133563Jeff Hao 4755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 4766474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao * Common invocation stub for portable and quick. 4775d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * On entry: 4785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a0 = method pointer 4795d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a1 = argument array or NULL for no argument methods 4805d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a2 = size of argument array in bytes 4815d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao * a3 = (managed) thread pointer 4826474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao * [sp + 16] = JValue* result 4836474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao * [sp + 20] = result type char 4845d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao */ 48579fe539587d4c09244172d0168eeed0ec9770466Jeff Hao .type art_portable_invoke_stub, %function 48679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao .global art_portable_invoke_stub 4876474d190d5604898354ebf767f1944b6e3e9b445Jeff Haoart_portable_invoke_stub: 4885d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoENTRY art_quick_invoke_stub 4895d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao GENERATE_GLOBAL_POINTER 4905d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $a0, 0($sp) # save out a0 4915d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, -16 # spill s0, s1, fp, ra 4925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_adjust_cfa_offset 16 4935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $ra, 12($sp) 4945d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 31, 12 4955d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $fp, 8($sp) 4965d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 30, 8 4975d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $s1, 4($sp) 4985d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 17, 4 4995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $s0, 0($sp) 5005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_rel_offset 16, 0 5015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $fp, $sp # save sp in fp 5025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_def_cfa_register 30 5035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $s1, $a3 # move managed thread pointer into s1 5045d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $s0, $zero, SUSPEND_CHECK_INTERVAL # reset s0 to suspend check interval 5055d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $t0, $a2, 16 # create space for method pointer in frame 5065d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao srl $t0, $t0, 3 # shift the frame size right 3 5075d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sll $t0, $t0, 3 # shift the frame size left 3 to align to 16 bytes 5085d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao subu $sp, $sp, $t0 # reserve stack space for argument array 5095d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $a0, $sp, 4 # pass stack pointer + method ptr as dest for memcpy 5105d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jal memcpy # (dest, src, bytes) 5115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, -16 # make space for argument slots for memcpy 5125d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, 16 # restore stack after memcpy 5135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a0, 16($fp) # restore method* 5145d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a1, 4($sp) # copy arg value for a1 5155d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a2, 8($sp) # copy arg value for a2 5165d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $a3, 12($sp) # copy arg value for a3 5175d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $t9, METHOD_CODE_OFFSET($a0) # get pointer to the code 5185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jalr $t9 # call the method 5195d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $zero, 0($sp) # store NULL for method* at bottom of frame 5205d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao move $sp, $fp # restore the stack 5215d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $s0, 0($sp) 5225d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $s1, 4($sp) 5235d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $fp, 8($sp) 5245d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $ra, 12($sp) 5255d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao addiu $sp, $sp, 16 5265d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao .cfi_adjust_cfa_offset -16 5275d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao lw $t0, 16($sp) # get result pointer 5286474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao lw $t1, 20($sp) # get result type char 5296474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao li $t2, 68 # put char 'D' into t2 5306474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao beq $t1, $t2, 1f # branch if result type char == 'D' 5316474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao li $t3, 70 # put char 'F' into t3 5326474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao beq $t1, $t3, 1f # branch if result type char == 'F' 5335d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $v0, 0($t0) # store the result 5346474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao jr $ra 5355d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao sw $v1, 4($t0) # store the other half of the result 5366474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao1: 53719ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao s.s $f0, 0($t0) # store floating point result 5385d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jr $ra 53919ca8cf52b9f825c48e7a52da6f25af4d97a263dJeff Hao s.s $f1, 4($t0) # store other half of floating point result 5405d9173014c1ca09f7249a6b07629aa37778b5f8fJeff HaoEND art_quick_invoke_stub 5416474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao .size art_portable_invoke_stub, .-art_portable_invoke_stub 5425d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao 5435d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao /* 5445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry point of native methods when JNI bug compatibility is enabled. 5455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 546d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artWorkAroundAppJniBugs 547d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_work_around_app_jni_bugs 54812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 5497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # save registers that may contain arguments and LR that will be crushed by a call 5507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, -32 551d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset 32 552fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $ra, 28($sp) 553d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 31, 28 554fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $a3, 24($sp) 555d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 7, 28 5567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a2, 20($sp) 557d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 6, 28 558fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $a1, 16($sp) 559d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 5, 28 560fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw $a0, 12($sp) 561d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 4, 28 5627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF # pass Thread::Current 5637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artWorkAroundAppJniBugs # (Thread*, $sp) 5647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp # pass $sp 56530a3317577d84feafa859b3e39d1545a995f0b7cjeffhao move $t9, $v0 # save target address 566fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao lw $a0, 12($sp) 567fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao lw $a1, 16($sp) 5687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 20($sp) 569fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao lw $a3, 24($sp) 570fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao lw $ra, 28($sp) 57130a3317577d84feafa859b3e39d1545a995f0b7cjeffhao jr $t9 # tail call into JNI routine 5727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 32 573d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -32 574d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_work_around_app_jni_bugs 5755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 5775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on 5785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * failure. 5795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 580d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artHandleFillArrayDataFromCode 581d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_handle_fill_data_from_code 58212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 5837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 5847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 5857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artHandleFillArrayDataFromCode # (Array*, const DexFile::Payload*, Thread*, $sp) 5867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 587fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao RETURN_IF_ZERO 588d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_handle_fill_data_from_code 5895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 59157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code that calls artLockObjectFromCode, may block for GC. 5925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 593d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artLockObjectFromCode 594d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_lock_object_from_code 59512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 5967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case we block 5977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 5987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artLockObjectFromCode # (Object* obj, Thread*, $sp) 5997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # pass $sp 6005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 601d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_lock_object_from_code 6025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 6045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure. 6055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 606d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artUnlockObjectFromCode 607d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_unlock_object_from_code 60812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 6097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 6107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 6117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artUnlockObjectFromCode # (Object* obj, Thread*, $sp) 6127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # pass $sp 6135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 614d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_unlock_object_from_code 6155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 6175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure. 6185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 619d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artCheckCastFromCode 620d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_check_cast_from_code 62112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 6227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 6237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 6247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artCheckCastFromCode # (Class* a, Class* b, Thread*, $sp) 6257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 6265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 627d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_check_cast_from_code 6285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 6305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artCanPutArrayElementFromCode and delivers exception on 6315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * failure. 6325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 633d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artCanPutArrayElementFromCode 634d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_can_put_array_element_from_code 63512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 6367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 6377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 6387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artCanPutArrayElementFromCode # (Object* element, Class* array_class, Thread*, $sp) 6397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 6405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 641d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_can_put_array_element_from_code 6425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 6445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when uninitialized static storage, this stub will run the class 6455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * initializer and deliver the exception on error. On success the static storage base is 6465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * returned. 6475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 648d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeStaticStorageFromCode 649d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_initialize_static_storage_from_code 65012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 6517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 6537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 6545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeStaticStorageFromCode 6557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 6565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 657d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_initialize_static_storage_from_code 6585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 66057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code when dex cache misses for a type_idx. 6615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 662d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeTypeFromCode 663d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_initialize_type_from_code 66412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 6657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 6677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 6685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeFromCode 6697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 6705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 671d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_initialize_type_from_code 6725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 6745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when type_idx needs to be checked for access and dex cache may also 67557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * miss. 6765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 677d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInitializeTypeAndVerifyAccessFromCode 678d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_initialize_type_and_verify_access_from_code 67912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 6807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 6827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 6835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeAndVerifyAccessFromCode 6847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 6855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 686d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_initialize_type_and_verify_access_from_code 6875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 68957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 32-bit primitive value. 6905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 691d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet32StaticFromCode 692d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_get32_static_from_code 69312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 6947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6954eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 6967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 697fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet32StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 6987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 6995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 700d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_get32_static_from_code 7015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 70357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 64-bit primitive value. 7045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 705d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet64StaticFromCode 706d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_get64_static_from_code 70712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7094eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 7107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 711fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet64StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 7127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 7135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 714d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_get64_static_from_code 7155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 71757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load an object reference. 7185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 719d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGetObjStaticFromCode 720d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_get_obj_static_from_code 72112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7234eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 7247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 725fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGetObjStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 7267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 7275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 728d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_get_obj_static_from_code 7295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 73157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 32-bit primitive value. 7325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 733d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet32InstanceFromCode 734d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_get32_instance_from_code 73512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7374eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 7387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 739fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet32InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 7404eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 7415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 742d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_get32_instance_from_code 7435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 74557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 64-bit primitive value. 7465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 747d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGet64InstanceFromCode 748d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_get64_instance_from_code 74912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7514eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 7527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 753fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGet64InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 7544eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 7555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 756d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_get64_instance_from_code 7575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 75957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load an object reference. 7605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 761d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artGetObjInstanceFromCode 762d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_get_obj_instance_from_code 76312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7654eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 7667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 767fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artGetObjInstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 7684eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 7695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 770d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_get_obj_instance_from_code 7715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 77357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 32-bit primitive value. 7745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 775d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32StaticFromCode 776d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_set32_static_from_code 77712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7794eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 7807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 781fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSet32StaticFromCode # (field_idx, new_val, referrer, Thread*, $sp) 7824eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 7835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 784d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_set32_static_from_code 7855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 78757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 64-bit primitive value. 7885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 789d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32StaticFromCode 790d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_set64_static_from_code 79112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 7927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7934eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a1, 64($sp) # pass referrer's Method* 794fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 7957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSet64StaticFromCode # (field_idx, referrer, new_val, Thread*, $sp) 7964eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 7975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 798d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_set64_static_from_code 7995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 80157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store an object reference. 8025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 803d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSetObjStaticFromCode 804d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_set_obj_static_from_code 80512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8074eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a2, 64($sp) # pass referrer's Method* 8087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 809fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSetObjStaticFromCode # (field_idx, new_val, referrer, Thread*, $sp) 8104eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 8115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 812d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_set_obj_static_from_code 8135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 81557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 32-bit primitive value. 8165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 817d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32InstanceFromCode 818d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_set32_instance_from_code 81912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8214eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a3, 64($sp) # pass referrer's Method* 822fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 8237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSet32InstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*, $sp) 8244eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 8255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 826d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_set32_instance_from_code 8275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 82957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 64-bit primitive value. 8305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 831d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSet32InstanceFromCode 832d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_set64_instance_from_code 83312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 835fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 836fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSet64InstanceFromCode # (field_idx, Object*, new_val, Thread*, $sp) 8374eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 8385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 839d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_set64_instance_from_code 8405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 84257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store an object reference. 8435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 844d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artSetObjInstanceFromCode 845d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_set_obj_instance_from_code 84612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8484eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao lw $a3, 64($sp) # pass referrer's Method* 849fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao sw rSELF, 16($sp) # pass Thread::Current 850fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao jal artSetObjInstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*, $sp) 8514eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 20($sp) # pass $sp 8525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 853d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_set_obj_instance_from_code 8545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 8565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code to resolve a string, this stub will allocate a String and deliver an 8575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * exception on error. On success the String is returned. R0 holds the referring method, 8585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * R1 holds the string index. The fast path check for hit in strings cache has already been 8595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * performed. 8605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 861d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artResolveStringFromCode 862d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_resolve_string_from_code 86312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 8667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*, $sp) 8675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artResolveStringFromCode 8687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 869fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao RETURN_IF_NONZERO 870d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_resolve_string_from_code 8715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 87357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to allocate an object. 8745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 875d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artAllocObjectFromCode 876d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_alloc_object_from_code 87712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 8807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artAllocObjectFromCode # (uint32_t type_idx, Method* method, Thread*, $sp) 8817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 8825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 883d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_alloc_object_from_code 8845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 8865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to allocate an object when the caller doesn't know whether it has 88757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * access to the created type. 8885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 889d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artAllocObjectFromCodeWithAccessCheck 890d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_alloc_object_from_code_with_access_check 89112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 8927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 8937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 8947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artAllocObjectFromCodeWithAccessCheck # (uint32_t type_idx, Method* method, Thread*, $sp) 8957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 8965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 897d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_alloc_object_from_code_with_access_check 8985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 90057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to allocate an array. 9015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 902d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artAllocArrayFromCode 903d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_alloc_array_from_code 90412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 9057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 9077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t component_count, Thread*, $sp) 9085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artAllocArrayFromCode 9094eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 9105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 911d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_alloc_array_from_code 9125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 9145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to allocate an array when the caller doesn't know whether it has 91557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * access to the created type. 9165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 917d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artAllocArrayFromCodeWithAccessCheck 918d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_alloc_array_from_code_with_access_check 91912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 9207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 9227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artAllocArrayFromCodeWithAccessCheck(type_idx, method, component_count, Thread*, $sp) 9235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artAllocArrayFromCodeWithAccessCheck 9244eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 9255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 926d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_alloc_array_from_code_with_access_check 9275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 92957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY. 9305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 931d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artCheckAndAllocArrayFromCode 932d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_check_and_alloc_array_from_code 93312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 9347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 9357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 9367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artCheckAndAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t count, Thread* , $sp) 9375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artCheckAndAllocArrayFromCode 9384eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 9395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 940d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_check_and_alloc_array_from_code 9415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 94357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY. 9445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 945d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artCheckAndAllocArrayFromCodeWithAccessCheck 946d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_check_and_alloc_array_from_code_with_access_check 94712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 9487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 949fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao move $a3, rSELF # pass Thread::Current 9507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artCheckAndAllocArrayFromCodeWithAccessCheck(type_idx, method, count, Thread* , $sp) 9515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artCheckAndAllocArrayFromCodeWithAccessCheck 9524eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao sw $sp, 16($sp) # pass $sp 9535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 954d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_check_and_alloc_array_from_code_with_access_check 9555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 95757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code when the value in rSUSPEND has been decremented to 0. 9585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 959d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artTestSuspendFromCode 960d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_test_suspend 96112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 962474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers lh $a0, THREAD_FLAGS_OFFSET(rSELF) 9637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $a0, 1f 9647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addi rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL # reset rSUSPEND to SUSPEND_CHECK_INTERVAL 9657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 9665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 9675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 9687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF 9697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves for stack crawl 9707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artTestSuspendFromCode # (Thread*, $sp) 9717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp 9725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 973d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_test_suspend 9745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9755fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao .extern artPortableProxyInvokeHandler 9765fa60c3db4208df407113b5a69d295a9c93d53b1Jeff HaoENTRY art_portable_proxy_invoke_handler 9775fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao GENERATE_GLOBAL_POINTER 9785fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 9795fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao sw $a0, 0($sp) # place proxy method at bottom of frame 9805fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao move $a2, rSELF # pass Thread::Current 9815fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao jal artPortableProxyInvokeHandler # (Method* proxy method, receiver, Thread*, SP) 9825fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao move $a3, $sp # pass $sp 9835fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao lw $ra, 44($sp) # restore $ra 9845fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao jr $ra 9855fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao addiu $sp, $sp, 48 # pop frame 9865fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao .cfi_adjust_cfa_offset -48 9875fa60c3db4208df407113b5a69d295a9c93d53b1Jeff HaoEND art_portable_proxy_invoke_handler 9885fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao 9895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 9905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code that is attempting to call a method on a proxy class. On entry 99157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * r0 holds the proxy method; r1, r2 and r3 may contain arguments. 9925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 9935fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao .extern artQuickProxyInvokeHandler 994d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_proxy_invoke_handler 99512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 9965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 9977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a0, 0($sp) # place proxy method at bottom of frame 9987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 9995fa60c3db4208df407113b5a69d295a9c93d53b1Jeff Hao jal artQuickProxyInvokeHandler # (Method* proxy method, receiver, Thread*, SP) 1000af6e67a4816d2593586115b89faa659225363246Ian Rogers move $a3, $sp # pass $sp 10017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 10027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $ra, 44($sp) # restore $ra 10037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $t0, 1f 10047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 48 # pop frame 1005d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -48 10067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 10075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 10085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 10095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 1010d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_proxy_invoke_handler 10115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 10127db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers .extern artInterpreterEntry 1013d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_interpreter_entry 10147db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers GENERATE_GLOBAL_POINTER 10157db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 10167db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers sw $a0, 0($sp) # place proxy method at bottom of frame 10177db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers move $a1, rSELF # pass Thread::Current 10187db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers jal artInterpreterEntry # (Method* method, Thread*, SP) 10197db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers move $a2, $sp # pass $sp 10207db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 10217db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers lw $ra, 44($sp) # restore $ra 10227db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers bnez $t0, 1f 10237db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers addiu $sp, $sp, 48 # pop frame 1024d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_adjust_cfa_offset -48 10257db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers jr $ra 10267db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers nop 10277db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers1: 10287db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers DELIVER_PENDING_EXCEPTION 1029d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_interpreter_entry 10307db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers 10315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1032725a957985171d712d5c048cc3d00ff14968784bjeffhao * Routine that intercepts method calls and returns. 10335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1034d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInstrumentationMethodEntryFromCode 1035d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artInstrumentationMethodExitFromCode 1036d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_instrumentation_entry_from_code 103712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 103862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 103912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $sp # remember bottom of caller's frame 104062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, -32 # space for args, pad (3 words), arguments (5 words) 104162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset 32 104262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $a0, 28($sp) # save arg0 104362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $ra, 16($sp) # pass $ra 104462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a3, $t0 # pass $sp 104562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artInstrumentationMethodEntryFromCode # (Method*, Object*, Thread*, SP, LR) 104662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a2, rSELF # pass Thread::Current 10478161c0336b97e11e02c000af357f8f40de2e23e4jeffhao move $t9, $v0 # $t9 holds reference to code 104862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $a0, 28($sp) # restore arg0 104962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, 32 # remove args 105062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset -32 105162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 10528161c0336b97e11e02c000af357f8f40de2e23e4jeffhao jalr $t9 # call method 105362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers nop 1054d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_instrumentation_entry_from_code 10555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* intentional fallthrough */ 1056d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .global art_quick_instrumentation_exit_from_code 10578dbb708c7dc05c786329eb5c3fff3194ab6472acLogan Chienart_quick_instrumentation_exit_from_code: 1058d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_startproc 105912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao addiu $t9, $ra, 4 # put current address into $t9 to rebuild $gp 106012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 106112051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $sp # remember bottom of caller's frame 106262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers SETUP_REF_ONLY_CALLEE_SAVE_FRAME 106362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, -48 # save return values and set up args 106462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset 48 106562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $v0, 32($sp) 1066d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 2, 0 106762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers sw $v1, 36($sp) 1068d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .cfi_rel_offset 3, 4 106962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f0, 40($sp) 107062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f1, 44($sp) 107162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f0, 16($sp) # pass fpr result 107262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers s.s $f1, 20($sp) 107362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a2, $v0 # pass gpr result 107462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a3, $v1 107512051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $a1, $t0 # pass $sp 107662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artInstrumentationMethodExitFromCode # (Thread*, SP, gpr_res, fpr_res) 107712051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $a0, rSELF # pass Thread::Current 107812051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $t0, $v0 # set aside returned link register 107912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao move $ra, $v1 # set link register for deoptimization 108062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $v0, 32($sp) # restore return values 108162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers lw $v1, 36($sp) 108262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers l.s $f0, 40($sp) 108362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers l.s $f1, 44($sp) 108412051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao jr $t0 # return 108562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers addiu $sp, $sp, 112 # 48 bytes of args + 64 bytes of callee save frame 108662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers .cfi_adjust_cfa_offset -112 10874aac9e12b33bdefaedcfbeabf479e27b68ac2a85Brian CarlstromEND art_quick_instrumentation_exit_from_code 10885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 108912051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao /* 109062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization 109162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers * will long jump to the upcall with a special exception of -1. 109212051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao */ 1093d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artDeoptimize 1094d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .extern artEnterInterpreterFromDeoptimize 1095d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_deoptimize 109612051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao GENERATE_GLOBAL_POINTER 109714dd5a82ad85a28612bf86e755ff929d767cea4cJeff Hao SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 109862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a0, rSELF # pass Thread::current 109962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers jal artDeoptimize # artDeoptimize(Thread*, SP) 110012051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao # Returns caller method's frame size. 110162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers move $a1, $sp # pass $sp 1102d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_deoptimize 110312051ea86ec27703b07b3d5c2cd4604b20f71810jeffhao 11045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 110579fe539587d4c09244172d0168eeed0ec9770466Jeff Hao * Portable abstract method error stub. $a0 contains method* on entry. SP unused in portable. 110679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao */ 110779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao .extern artThrowAbstractMethodErrorFromCode 110879fe539587d4c09244172d0168eeed0ec9770466Jeff HaoENTRY art_portable_abstract_method_error_stub 110979fe539587d4c09244172d0168eeed0ec9770466Jeff Hao GENERATE_GLOBAL_POINTER 111079fe539587d4c09244172d0168eeed0ec9770466Jeff Hao la $t9, artThrowAbstractMethodErrorFromCode 111179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao jr $t9 # (Method*, Thread*, SP) 111279fe539587d4c09244172d0168eeed0ec9770466Jeff Hao move $a1, $s1 # pass Thread::Current 111379fe539587d4c09244172d0168eeed0ec9770466Jeff HaoEND art_portable_abstract_method_error_stub 111479fe539587d4c09244172d0168eeed0ec9770466Jeff Hao 111579fe539587d4c09244172d0168eeed0ec9770466Jeff Hao /* 111679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao * Quick abstract method error stub. $a0 contains method* on entry. 111779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao */ 111879fe539587d4c09244172d0168eeed0ec9770466Jeff HaoENTRY art_quick_abstract_method_error_stub 111979fe539587d4c09244172d0168eeed0ec9770466Jeff Hao GENERATE_GLOBAL_POINTER 112079fe539587d4c09244172d0168eeed0ec9770466Jeff Hao SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 112179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao move $a1, $s1 # pass Thread::Current 112279fe539587d4c09244172d0168eeed0ec9770466Jeff Hao la $t9, artThrowAbstractMethodErrorFromCode 112379fe539587d4c09244172d0168eeed0ec9770466Jeff Hao jr $t9 # (Method*, Thread*, SP) 112479fe539587d4c09244172d0168eeed0ec9770466Jeff Hao move $a2, $sp # pass SP 112579fe539587d4c09244172d0168eeed0ec9770466Jeff HaoEND art_quick_abstract_method_error_stub 112679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao 112779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao /* 112879fe539587d4c09244172d0168eeed0ec9770466Jeff Hao * Jni dlsym lookup stub. 112979fe539587d4c09244172d0168eeed0ec9770466Jeff Hao */ 113079fe539587d4c09244172d0168eeed0ec9770466Jeff Hao .extern artFindNativeMethod 113179fe539587d4c09244172d0168eeed0ec9770466Jeff HaoENTRY art_jni_dlsym_lookup_stub 113279fe539587d4c09244172d0168eeed0ec9770466Jeff Hao GENERATE_GLOBAL_POINTER 113379fe539587d4c09244172d0168eeed0ec9770466Jeff Hao addiu $sp, $sp, -32 # leave room for $a0, $a1, $a2, $a3, and $ra 113479fe539587d4c09244172d0168eeed0ec9770466Jeff Hao .cfi_adjust_cfa_offset 32 113579fe539587d4c09244172d0168eeed0ec9770466Jeff Hao sw $ra, 16($sp) 113679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao .cfi_rel_offset 31, 16 113779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao sw $a3, 12($sp) 113879fe539587d4c09244172d0168eeed0ec9770466Jeff Hao .cfi_rel_offset 7, 12 113979fe539587d4c09244172d0168eeed0ec9770466Jeff Hao sw $a2, 8($sp) 114079fe539587d4c09244172d0168eeed0ec9770466Jeff Hao .cfi_rel_offset 6, 8 114179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao sw $a1, 4($sp) 114279fe539587d4c09244172d0168eeed0ec9770466Jeff Hao .cfi_rel_offset 5, 4 114379fe539587d4c09244172d0168eeed0ec9770466Jeff Hao sw $a0, 0($sp) 114479fe539587d4c09244172d0168eeed0ec9770466Jeff Hao .cfi_rel_offset 4, 0 114579fe539587d4c09244172d0168eeed0ec9770466Jeff Hao jal artFindNativeMethod # (Thread*) 114679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao move $a0, $s1 # pass Thread::Current() 114779fe539587d4c09244172d0168eeed0ec9770466Jeff Hao lw $a0, 0($sp) # restore registers from stack 114879fe539587d4c09244172d0168eeed0ec9770466Jeff Hao lw $a1, 4($sp) 114979fe539587d4c09244172d0168eeed0ec9770466Jeff Hao lw $a2, 8($sp) 115079fe539587d4c09244172d0168eeed0ec9770466Jeff Hao lw $a3, 12($sp) 115179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao lw $ra, 16($sp) 115279fe539587d4c09244172d0168eeed0ec9770466Jeff Hao beq $v0, $zero, no_native_code_found 115379fe539587d4c09244172d0168eeed0ec9770466Jeff Hao addiu $sp, $sp, 32 # restore the stack 115479fe539587d4c09244172d0168eeed0ec9770466Jeff Hao .cfi_adjust_cfa_offset -32 115579fe539587d4c09244172d0168eeed0ec9770466Jeff Hao jr $t9 # leaf call to method's code 115679fe539587d4c09244172d0168eeed0ec9770466Jeff Hao move $t9, $v0 # put method code result in $t9 115779fe539587d4c09244172d0168eeed0ec9770466Jeff Haono_native_code_found: 115879fe539587d4c09244172d0168eeed0ec9770466Jeff Hao jr $ra 115979fe539587d4c09244172d0168eeed0ec9770466Jeff Hao nop 116079fe539587d4c09244172d0168eeed0ec9770466Jeff HaoEND art_jni_dlsym_lookup_stub 116179fe539587d4c09244172d0168eeed0ec9770466Jeff Hao 116279fe539587d4c09244172d0168eeed0ec9770466Jeff Hao /* 11635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 11645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 11655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 11665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 11675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 11687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 11697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 11707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 11715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1172d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shl_long 11735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* shl-long vAA, vBB, vCC */ 11747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v0, $a0, $a2 # rlo<- alo << (shift&31) 11757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $v1, $a2 # rhi<- 31-shift (shift is 5b) 11767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, 1 11777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, $v1 # alo<- alo >> (32-(shift&31)) 11787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v1, $a1, $a2 # rhi<- ahi << (shift&31) 11797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v1, $a0 # rhi<- rhi | alo 11807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift< shift & 0x20 11817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $v0, $a2 # rhi<- rlo (if shift&0x20) 11827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1183fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao movn $v0, $zero, $a2 # rlo<- 0 (if shift&0x20) 1184d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shl_long 11855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 11865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 11875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 11885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 11895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 11905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 11915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 11927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 11937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 11947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 11955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1196d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .global art_quick_shr_long 1197d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_shr_long 11987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 11997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 12007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $a3, $a1, 31 # $a3<- sign(ah) 12017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 12027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 12037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 12047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 12057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 12067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 12077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 12087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $a3, $a2 # rhi<- sign(ahi) (if shift&0x20) 1209d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_shr_long 12105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 12115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 12125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 12135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 12145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 12155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 12165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 12175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r0: low word 12185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r1: high word 12195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r2: shift count 12205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 12215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* ushr-long vAA, vBB, vCC */ 1222d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff Hao .global art_quick_ushr_long 1223d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_ushr_long 1224fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao srl $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 12257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 12267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 12277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 12287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 12297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 12307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 12317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 12327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1233fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao movn $v1, $zero, $a2 # rhi<- 0 (if shift&0x20) 1234d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_ushr_long 12357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1236d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_indexof 12377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 12380703060875166106af3d490c6c264611aea67ec8jeffhao nop 1239d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_indexof 12407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1241d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoENTRY art_quick_string_compareto 12427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 12430703060875166106af3d490c6c264611aea67ec8jeffhao nop 1244d4c3f7d4e850049b3c1019e451b18b05443b0f28Jeff HaoEND art_quick_string_compareto 1245