quick_entrypoints_mips.S revision 474b6da273c7ce6df50a4e51eb9929a77e1611c3
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 195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .balign 4 205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* Deliver the given exception */ 225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artDeliverExceptionFromCode 235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* Deliver an exception pending on a thread */ 245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artDeliverPendingException 255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* Cache alignment for function entry */ 2757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.macro ALIGN_FUNCTION_ENTRY 2857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers .balign 16 2957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.endm 3057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kSaveAll) 347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * callee-save: $s0-$s8 + $ra, 10 total + 2 words 355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 3657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers.macro SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 48 387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $ra, 44($sp) 397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s8, 40($sp) 407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s7, 36($sp) 417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s6, 32($sp) 427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s5, 28($sp) 437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s4, 24($sp) 447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s3, 20($sp) 457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s2, 16($sp) 467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s1, 12($sp) 477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s0, 8($sp) 487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # 2 open words, bottom will hold Method* 495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC. 545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Does not include rSUSPEND or rSELF 557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * callee-save: $s2-$s8 + $ra, 8 total + 4 words 565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_ONLY_CALLEE_SAVE_FRAME 587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 48 597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $ra, 44($sp) 607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s8, 40($sp) 617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s7, 36($sp) 627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s6, 32($sp) 637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s5, 28($sp) 647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s4, 24($sp) 657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s3, 20($sp) 667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s2, 16($sp) 677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # 4 open words, bottom will hold Method* 685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $ra, 44($sp) 727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 48 735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $ra, 44($sp) 777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 48 795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that sets up the callee save frame to conform with 835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC. 847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1-$a3, $s2-$s8, $ra, 11 total + 1 855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 48 887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $ra, 44($sp) 897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s8, 40($sp) 907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s7, 36($sp) 917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s6, 32($sp) 927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s5, 28($sp) 937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s4, 24($sp) 947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s3, 20($sp) 957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $s2, 16($sp) 967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a3, 12($sp) 977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a2, 8($sp) 987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a1, 4($sp) 997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # 1 open word, bottom will hold Method* 1005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 1037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $ra, 44($sp) # restore $ra 1047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 4($sp) # restore non-callee save $a1 1057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 8($sp) # restore non-callee save $a2 1067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a3, 12($sp) # restore non-callee save $a3 1077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 48 # strip frame 1085bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending 1125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * exception is Thread::Current()->exception_ 1135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 1145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro DELIVER_PENDING_EXCEPTION 1157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_SAVE_ALL_CALLEE_SAVE_FRAME # save callee saves for throw 1167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF # pass Thread::Current 1177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artDeliverPendingExceptionFromCode # artDeliverPendingExceptionFromCode(Thread*, $sp) 1187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp # pass $sp 1195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NO_EXCEPTION 1227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 1235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 1247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $t0, 1f # success if no exception is pending 1255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 1295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 1305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_ZERO 1335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 1347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $v0, 1f # success? 1355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return on success 1375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 1395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 1405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro RETURN_IF_NONZERO 1435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 1447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao beqz $v0, 1f # success? 1455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return on success 1475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 1485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 1495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 1505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 1515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_update_debugger 1535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artUpdateDebuggerFromCode 1545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * On entry, $a0 and $a1 must be preserved, $a2 is dex PC 1565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 15757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 1585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_update_debugger: 1597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $a0 # stash away $a0 so that it's saved as if it were an argument 1605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 1617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, $a2 # arg0 is dex PC 1627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # arg1 is Thread* 1637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # arg2 is $sp 1647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artUpdateDebuggerFromCode # artUpdateDebuggerFromCode(int32_t, Thread*, Method**) 1655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 1667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 1677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, $a3 # restore original $a0 1685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_do_long_jump 1705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 1717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * On entry $a0 is uint32_t* gprs_ and $a1 is uint32_t* fprs_ 1725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * FIXME: just guessing about the shape of the jmpbuf. Where will pc be? 1735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 17457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 1755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_do_long_jump: 1767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f0, 0($a1) 1777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f1, 4($a1) 1787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f2, 8($a1) 1797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f3, 12($a1) 1807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f4, 16($a1) 1817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f5, 20($a1) 1827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f6, 24($a1) 1837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f7, 28($a1) 1847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f8, 32($a1) 1857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f9, 36($a1) 1867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f10, 40($a1) 1877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f11, 44($a1) 1887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f12, 48($a1) 1897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f13, 52($a1) 1907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f14, 56($a1) 1917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f15, 60($a1) 1927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f16, 64($a1) 1937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f17, 68($a1) 1947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f18, 72($a1) 1957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f19, 76($a1) 1967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f20, 80($a1) 1977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f21, 84($a1) 1987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f22, 88($a1) 1997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f23, 92($a1) 2007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f24, 96($a1) 2017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f25, 100($a1) 2027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f26, 104($a1) 2037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f27, 108($a1) 2047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f28, 112($a1) 2057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f29, 116($a1) 2067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f30, 120($a1) 2077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao l.s $f31, 124($a1) 2087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $at, 4($a0) 2097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v0, 8($a0) 2107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v1, 12($a0) 2117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 20($a0) 2127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 24($a0) 2137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a3, 28($a0) 2147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, 32($a0) 2157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t1, 36($a0) 2167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t2, 40($a0) 2177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t3, 44($a0) 2187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t4, 48($a0) 2197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t5, 52($a0) 2207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t6, 56($a0) 2217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t7, 60($a0) 2227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s0, 64($a0) 2237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s1, 68($a0) 2247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s2, 72($a0) 2257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s3, 76($a0) 2267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s4, 80($a0) 2277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s5, 84($a0) 2287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s6, 88($a0) 2297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $s7, 92($a0) 2307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t8, 96($a0) 2317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t9, 100($a0) 2327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $k0, 104($a0) 2337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $k1, 108($a0) 2347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $gp, 112($a0) 2357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $sp, 116($a0) 2367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $fp, 120($a0) 2377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $ra, 124($a0) 2387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a0, 16($a0) 2397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v0, $zero # clear result registers r0 and r1 2407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # do long jump 2417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $v1, $zero 2425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_deliver_exception_from_code 2445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code, saves most registers (forms basis of long jump context) and passes 2465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the stack. artDeliverExceptionFromCode will place the callee save Method* at 2475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the bottom of the thread. On entry r0 holds Throwable* 2485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 24957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 2505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_deliver_exception_from_code: 25157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 2527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 2537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artDeliverExceptionFromCode # artDeliverExceptionFromCode(Throwable*, Thread*, $sp) 2547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # pass $sp 2555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_throw_null_pointer_exception_from_code 2575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artThrowNullPointerExceptionFromCode 2585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver a NullPointerException 2605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 26157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 2625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_throw_null_pointer_exception_from_code: 26357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 2647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF # pass Thread::Current 2657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artThrowNullPointerExceptionFromCode # artThrowNullPointerExceptionFromCode(Thread*, $sp) 2667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp # pass $sp 2675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_throw_div_zero_from_code 2695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artThrowDivZeroFromCode 2705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArithmeticException 2725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 27357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 2745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_throw_div_zero_from_code: 27557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 2767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF # pass Thread::Current 2777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artThrowDivZeroFromCode # artThrowDivZeroFromCode(Thread*, $sp) 2787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp # pass $sp 2795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_throw_array_bounds_from_code 2815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artThrowArrayBoundsFromCode 2825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 2835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException 2845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 28557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 2865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_throw_array_bounds_from_code: 28757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 2887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 2897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artThrowArrayBoundsFromCode # artThrowArrayBoundsFromCode(index, limit, Thread*, $sp) 2907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 2915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 2925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_throw_stack_overflow_from_code 2935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artThrowStackOverflowFromCode 29457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 29557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a StackOverflowError. 29657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 29757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 2985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_throw_stack_overflow_from_code: 29957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 3017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artThrowStackOverflowFromCode # artThrowStackOverflowFromCode(method, Thread*, $sp) 3027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # pass $sp 3035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_throw_no_such_method_from_code 3055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artThrowNoSuchMethodFromCode 30657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers /* 30757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to create and deliver a NoSuchMethodError. 30857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */ 30957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 3105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_throw_no_such_method_from_code: 31157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers SETUP_SAVE_ALL_CALLEE_SAVE_FRAME 3127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 3137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artThrowNoSuchMethodFromCode # artThrowNoSuchMethodFromCode(method_idx, Thread*, $sp) 3147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # pass $sp 3155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * All generated callsites for interface invokes and invocation slow paths will load arguments 3187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * as usual - except instead of loading arg0/$a0 with the target Method*, arg0/$a0 will contain 3195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * the method_idx. This wrapper will save arg1-arg3, load the caller's Method*, align the 3205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * stack and call the appropriate C helper. 3217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * NOTE: "this" is first visable argument of the target, and so can be found in arg1/$a1. 3225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 3237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * The helper will attempt to locate the target and return a 64-bit result in $v0/$v1 consisting 3247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * of the target Method* in $v0 and method->code_ in $v1. 3255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 3265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * If unsuccessful, the helper will return NULL/NULL. There will bea pending exception in the 3275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * thread and we branch to another stub to deliver it. 3285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 3295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On success this wrapper will restore arguments and *jump* to the target, leaving the lr 3305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * pointing back to the original caller. 3315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 3325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.macro INVOKE_TRAMPOLINE c_name, cxx_name 3335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global \c_name 3345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern \cxx_name 3355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee\c_name: 3367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME # save callee saves in case allocation triggers GC 3377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 48($sp) # pass caller Method* 3387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 3397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $sp, 0($sp) # pass $sp 3407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal \cxx_name # (method_idx, this, caller, Thread*, $sp) 3417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $t0, $v1 # save $v0->code_ 3425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME 3437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $v0, 1f 3445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 3457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $t0 3465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 3475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 3485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 3495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee.endm 3505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeINVOKE_TRAMPOLINE art_invoke_interface_trampoline, artInvokeInterfaceTrampoline 3525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeINVOKE_TRAMPOLINE art_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck 3535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeINVOKE_TRAMPOLINE art_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck 3555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeINVOKE_TRAMPOLINE art_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck 3565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeINVOKE_TRAMPOLINE art_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck 3575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeINVOKE_TRAMPOLINE art_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck 3585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_work_around_app_jni_bugs 3605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artWorkAroundAppJniBugs 3615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry point of native methods when JNI bug compatibility is enabled. 3635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 36457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 3655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_work_around_app_jni_bugs: 3667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # save registers that may contain arguments and LR that will be crushed by a call 3677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, -32 3687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a0, 28($sp) 3697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a1, 24($sp) 3707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a2, 20($sp) 3717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a3, 16($sp) 3727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $ra, 12($sp) 3737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF # pass Thread::Current 3747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artWorkAroundAppJniBugs # (Thread*, $sp) 3757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp # pass $sp 3767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $t0, $v0 # save target address 3777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a0, 28($sp) 3787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 24($sp) 3797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 20($sp) 3807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a3, 16($sp) 3817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $ra, 12($sp) 3827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $t0 # tail call into JNI routine 3837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 32 3845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 3855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_handle_fill_data_from_code 3865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artHandleFillArrayDataFromCode 3875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 3885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on 3895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * failure. 3905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 39157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 3925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_handle_fill_data_from_code: 3937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 3947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 3957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artHandleFillArrayDataFromCode # (Array*, const DexFile::Payload*, Thread*, $sp) 3967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 3975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME 3987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $v0, 1f # success? 3995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 4007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return on success 4015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 4025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 4035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 4045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_lock_object_from_code 4065bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artLockObjectFromCode 4075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 40857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code that calls artLockObjectFromCode, may block for GC. 4095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 41057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 4115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_lock_object_from_code: 4127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case we block 4137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 4147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artLockObjectFromCode # (Object* obj, Thread*, $sp) 4157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # pass $sp 4165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 4175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_unlock_object_from_code 4195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artUnlockObjectFromCode 4205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 4215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure. 4225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 42357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 4245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_unlock_object_from_code: 4257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 4267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 4277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artUnlockObjectFromCode # (Object* obj, Thread*, $sp) 4287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $sp # pass $sp 4295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 4305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_check_cast_from_code 4325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artCheckCastFromCode 4335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 4345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure. 4355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 43657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 4375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_check_cast_from_code: 4387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 4397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 4407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artCheckCastFromCode # (Class* a, Class* b, Thread*, $sp) 4417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 4425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 4435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_can_put_array_element_from_code 4455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artCanPutArrayElementFromCode 4465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 4475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code that calls artCanPutArrayElementFromCode and delivers exception on 4485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * failure. 4495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 45057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 4515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_can_put_array_element_from_code: 4527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case exception allocation triggers GC 4537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 4547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artCanPutArrayElementFromCode # (Object* element, Class* array_class, Thread*, $sp) 4557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 4565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 4575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_initialize_static_storage_from_code 4595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artInitializeStaticStorageFromCode 4605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 4615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when uninitialized static storage, this stub will run the class 4625bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * initializer and deliver the exception on error. On success the static storage base is 4635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * returned. 4645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 46557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 4665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_initialize_static_storage_from_code: 4677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 4687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 4697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 4705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeStaticStorageFromCode 4717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 4725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 4735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_initialize_type_from_code 4755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artInitializeTypeFromCode 4765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 47757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Entry from managed code when dex cache misses for a type_idx. 4785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 47957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 4805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_initialize_type_from_code: 4817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 4827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 4837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 4845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeFromCode 4857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 4865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 4875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 4885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_initialize_type_and_verify_access_from_code 4895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artInitializeTypeAndVerifyAccessFromCode 4905bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 4915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code when type_idx needs to be checked for access and dex cache may also 49257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * miss. 4935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 49457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 4955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_initialize_type_and_verify_access_from_code: 4967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 4977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 4987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, $sp) 4995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artInitializeTypeAndVerifyAccessFromCode 5007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 5015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 5025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_get32_static_from_code 5045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artGet32StaticFromCode 5055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 50657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 32-bit primitive value. 5075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 50857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 5095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_get32_static_from_code: 5107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 5117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 48($sp) # pass referrer's Method* 5127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 5137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artGet32StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 5147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 5155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 5165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_get64_static_from_code 5185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artGet64StaticFromCode 5195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 52057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load a 64-bit primitive value. 5215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 52257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 5235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_get64_static_from_code: 5247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 5257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 48($sp) # pass referrer's Method* 5267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 5277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artGet64StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 5287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 5295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 5305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_get_obj_static_from_code 5325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artGetObjStaticFromCode 5335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 53457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and load an object reference. 5355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 53657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 5375bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_get_obj_static_from_code: 5387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 5397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 48($sp) # pass referrer's Method* 5407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 5417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artGetObjStaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*, $sp) 5427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 5435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 5445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_get32_instance_from_code 5465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artGet32InstanceFromCode 5475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 54857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 32-bit primitive value. 5495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 55057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 5515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_get32_instance_from_code: 5527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 5537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 48($sp) # pass referrer's Method* 5547fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 5557fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artGet32InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 5567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $sp, 0($sp) # pass $sp 5575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 5585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_get64_instance_from_code 5605bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artGet64InstanceFromCode 5615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 56257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load a 64-bit primitive value. 5635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 56457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 5655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_get64_instance_from_code: 5667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 5677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 48($sp) # pass referrer's Method* 5687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 5697fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artGet64InstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 5707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $sp, 0($sp) # pass $sp 5715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 5725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_get_obj_instance_from_code 5745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artGetObjInstanceFromCode 5755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 57657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and load an object reference. 5775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 57857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 5795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_get_obj_instance_from_code: 5807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 5817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 48($sp) # pass referrer's Method* 5827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 5837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artGetObjInstanceFromCode # (field_idx, Object*, referrer, Thread*, $sp) 5847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $sp, 0($sp) # pass $sp 5855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NO_EXCEPTION 5865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 5875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_set32_static_from_code 5885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artSet32StaticFromCode 5895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 59057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 32-bit primitive value. 5915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 59257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 5935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_set32_static_from_code: 5947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 5957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 48($sp) # pass referrer's Method* 5967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 5977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSet32StaticFromCode # (field_idx, new_val, referrer, Thread*, $sp) 5987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $sp, 0($sp) # pass $sp 5995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 6005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_set64_static_from_code 6025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artSet32StaticFromCode 6035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 60457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store a 64-bit primitive value. 6055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 60657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 6075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_set64_static_from_code: 6087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 48($sp) # pass referrer's Method* 6107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $t0, $sp # save $sp 6117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, -16 6127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw rSELF, 0($sp) # pass Thread::Current and $sp 6137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSet64StaticFromCode # (field_idx, referrer, new_val, Thread*, $sp) 6147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $t0, 4($sp) 6157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, #16 # release out args 6165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 6175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_set_obj_static_from_code 6195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artSetObjStaticFromCode 6205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 62157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve a static field and store an object reference. 6225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 62357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 6245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_set_obj_static_from_code: 6257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 48($sp) # pass referrer's Method* 6277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 6287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSetObjStaticFromCode # (field_idx, new_val, referrer, Thread*, $sp) 6297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $sp, 0($sp) # pass $sp 6305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 6315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_set32_instance_from_code 6335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artSet32InstanceFromCode 6345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 63557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 32-bit primitive value. 6365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 63757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 6385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_set32_instance_from_code: 6397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a3, 48($sp) # pass referrer's Method* 6417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $t0, $sp # save $sp 6427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, -16 6437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw rSELF, 0($sp) # pass Thread::Current and $sp 6447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSet32InstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*, $sp) 6457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $t0, 4($sp) 6467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 16 # release out args 6475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 6485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_set64_instance_from_code 6505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artSet32InstanceFromCode 6515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 65257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store a 64-bit primitive value. 6535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 65457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 6555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_set64_instance_from_code: 6567fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $t0, $sp # save $sp 6587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, -16 6597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw rSELF, 0($sp) # pass Thread::Current and $sp 6607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSet64InstanceFromCode # (field_idx, Object*, new_val, Thread*, $sp) 6617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $t0, 4($sp) 6627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 16 # release out args 6635bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 6645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_set_obj_instance_from_code 6665bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artSetObjInstanceFromCode 6675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 66857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to resolve an instance field and store an object reference. 6695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 67057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 6715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_set_obj_instance_from_code: 6727fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a3, 48($sp) # pass referrer's Method* 6747fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $t0, $sp # save $sp 6757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, -16 6767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw rSELF, 0($sp) # pass Thread::Current and $sp 6777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artSetObjInstanceFromCode # (field_idx, Object*, new_val, referrer, Thread*, $sp) 6787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $t0, 4($sp) 6797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 16 # release out args 6805bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 6815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_resolve_string_from_code 6835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artResolveStringFromCode 6845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 6855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Entry from managed code to resolve a string, this stub will allocate a String and deliver an 6865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * exception on error. On success the String is returned. R0 holds the referring method, 6875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * R1 holds the string index. The fast path check for hit in strings cache has already been 6885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * performed. 6895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 69057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 6915bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_resolve_string_from_code: 6927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 6937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 6947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*, $sp) 6955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artResolveStringFromCode 6967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 6975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_ZERO 6985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 6995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_alloc_object_from_code 7005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artAllocObjectFromCode 7015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 70257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to allocate an object. 7035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 70457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 7055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_alloc_object_from_code: 7067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artAllocObjectFromCode # (uint32_t type_idx, Method* method, Thread*, $sp) 7097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 7105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 7115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_alloc_object_from_code_with_access_check 7135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artAllocObjectFromCodeWithAccessCheck 7145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 7155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to allocate an object when the caller doesn't know whether it has 71657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * access to the created type. 7175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 71857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 7195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_alloc_object_from_code_with_access_check: 7207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 7227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artAllocObjectFromCodeWithAccessCheck # (uint32_t type_idx, Method* method, Thread*, $sp) 7237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, $sp # pass $sp 7245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 7255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_alloc_array_from_code 7275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artAllocArrayFromCode 7285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 72957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to allocate an array. 7305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 73157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 7325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_alloc_array_from_code: 7337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 7357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t component_count, Thread*, $sp) 7365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artAllocArrayFromCode 7377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $sp, 0($sp) # pass $sp 7385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 7395bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_alloc_array_from_code_with_access_check 7415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artAllocArrayFromCodeWithAccessCheck 7425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 7435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code to allocate an array when the caller doesn't know whether it has 74457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * access to the created type. 7455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 74657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 7475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_alloc_array_from_code_with_access_check: 7487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 7507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artAllocArrayFromCodeWithAccessCheck(type_idx, method, component_count, Thread*, $sp) 7515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artAllocArrayFromCodeWithAccessCheck 7527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $sp, 0($sp) # pass $sp 7535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 7545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_check_and_alloc_array_from_code 7565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artCheckAndAllocArrayFromCode 7575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 75857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY. 7595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 76057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 7615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_check_and_alloc_array_from_code: 7627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 7647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artCheckAndAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t count, Thread* , $sp) 7655bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artCheckAndAllocArrayFromCode 7667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $sp, 0($sp) # pass $sp 7675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 7685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_check_and_alloc_array_from_code_with_access_check 7705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artCheckAndAllocArrayFromCodeWithAccessCheck 7715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 77257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY. 7735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 77457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 7755bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_check_and_alloc_array_from_code_with_access_check: 7767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves in case of GC 7777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a3, rSELF # pass Thread::Current 7787fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao # artCheckAndAllocArrayFromCodeWithAccessCheck(type_idx, method, count, Thread* , $sp) 7795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee jal artCheckAndAllocArrayFromCodeWithAccessCheck 7807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $sp, 0($sp) # pass $sp 7815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RETURN_IF_NONZERO 7825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 7835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_test_suspend 7845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artTestSuspendFromCode 7855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 78657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Called by managed code when the value in rSUSPEND has been decremented to 0. 7875bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 78857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 7895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_test_suspend: 790474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers lh $a0, THREAD_FLAGS_OFFSET(rSELF) 7917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $a0, 1f 7927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addi rSUSPEND, $zero, SUSPEND_CHECK_INTERVAL # reset rSUSPEND to SUSPEND_CHECK_INTERVAL 7937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 7945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 7955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 7967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a0, rSELF 7977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao SETUP_REF_ONLY_CALLEE_SAVE_FRAME # save callee saves for stack crawl 7987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artTestSuspendFromCode # (Thread*, $sp) 7997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, $sp 8005bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN 8015bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8025bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_proxy_invoke_handler 8035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artProxyInvokeHandler 8045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 8055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Called by managed code that is attempting to call a method on a proxy class. On entry 80657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * r0 holds the proxy method; r1, r2 and r3 may contain arguments. 8075bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 80857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 8095bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_proxy_invoke_handler: 8105bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME 8117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a0, 0($sp) # place proxy method at bottom of frame 8127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, rSELF # pass Thread::Current 8137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artProxyInvokeHandler # (Method* proxy method, receiver, Thread*, args...) 8147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $a3, $sp, 12 # pointer to r2/r3/LR/caller's Method**/out-args as second arg 8157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $t0, THREAD_EXCEPTION_OFFSET(rSELF) # load Thread::Current()->exception_ 8167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#FIXME - offsets here are probably wrong 8177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $ra, 44($sp) # restore $ra 8187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v0, 12($sp) 8197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v1, 14($sp) 8207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao bnez $t0, 1f 8217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 48 # pop frame 8227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 8235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee nop 8245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee1: 8255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee DELIVER_PENDING_EXCEPTION 8265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_trace_entry_from_code 8285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artTraceMethodEntryFromCode 8295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 8305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Routine that intercepts method calls 8315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 83257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 8335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_trace_entry_from_code: 8347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, -16 8357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a0, 0($sp) 8367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a1, 4($sp) 8377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a2, 8($sp) 8387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $a3, 12($sp) 8397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a2, $ra # pass $ra 8407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artTraceMethodEntryFromCode # (Method*, Thread*, LR) 8417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $a1, rSELF # pass Thread::Current 8427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $t0, $v0 # $t0 holds reference to code 8437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a0, 0($sp) 8447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a1, 4($sp) 8457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a2, 8($sp) 8467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $a3, 12($sp) 8477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jalr $t0 # call method 8487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 16 8495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* intentional fallthrough */ 8505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_trace_exit_from_code 8525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .extern artTraceMethodExitFromCode 8535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 8545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Routine that intercepts method returns 8555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 85657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 8575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeart_trace_exit_from_code: 8587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, -16 8597fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $v0, 0($sp) 8607fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jal artTraceMethodExitFromCode # () 8617fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sw $v1, 4($sp) 8627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao move $ra, $v0 # restore link register 8637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v0, 0($sp) 8647fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao lw $v1, 4($sp) 8657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra # return 8667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao addiu $sp, $sp, 16 8675bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8685bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_shl_long 8695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 8705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 8715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 8725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 8735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 8745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 8757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 8767fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 8777fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 8785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 87957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 88057b86d47b66322693a070185fadfb43cb9c12eabIan Rogersart_shl_long: 8815bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* shl-long vAA, vBB, vCC */ 8827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v0, $a0, $a2 # rlo<- alo << (shift&31) 8837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $v1, $a2 # rhi<- 31-shift (shift is 5b) 8847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, 1 8857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $a0, $v1 # alo<- alo >> (32-(shift&31)) 8867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $v1, $a1, $a2 # rhi<- ahi << (shift&31) 8877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v1, $a0 # rhi<- rhi | alo 8887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift< shift & 0x20 8897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $v0, $a2 # rhi<- rlo (if shift&0x20) 8907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 8917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $zero, $a2 # rlo<- 0 (if shift&0x20) 8925bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 8935bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_shr_long 8945bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 8955bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 8965bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 8975bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 8985bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 8995bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 9007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a0: low word 9017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a1: high word 9027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * $a2: shift count 9035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 90457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 90557b86d47b66322693a070185fadfb43cb9c12eabIan Rogersart_shr_long: 9067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 9077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 9087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $a3, $a1, 31 # $a3<- sign(ah) 9097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 9107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 9117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 9127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 9137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 9147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 9157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 9167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $a3, $a2 # rhi<- sign(ahi) (if shift&0x20) 9175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 9185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee .global art_ushr_long 9195bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* 9205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * Long integer shift. This is different from the generic 32/64-bit 9215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * binary operations because vAA/vBB are 64-bit but vCC (the shift 9225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low 9235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * 6 bits. 9245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * On entry: 9255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r0: low word 9265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r1: high word 9275bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee * r2: shift count 9285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee */ 9295bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* ushr-long vAA, vBB, vCC */ 93057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers ALIGN_FUNCTION_ENTRY 93157b86d47b66322693a070185fadfb43cb9c12eabIan Rogersart_ushr_long: 9327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $v1, $a1, $a2 # rhi<- ahi >> (shift&31) 9337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao srl $v0, $a0, $a2 # rlo<- alo >> (shift&31) 9347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sra $a3, $a1, 31 # $a3<- sign(ah) 9357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao not $a0, $a2 # alo<- 31-shift (shift is 5b) 9367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, 1 9377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao sll $a1, $a0 # ahi<- ahi << (32-(shift&31)) 9387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao or $v0, $a1 # rlo<- rlo | ahi 9397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao andi $a2, 0x20 # shift & 0x20 9407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v0, $v1, $a2 # rlo<- rhi (if shift&0x20) 9417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 9427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao movn $v1, $a3, $a2 # rhi<- sign(ahi) (if shift&0x20) 9437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 9447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao .global art_indexof 9457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ALIGN_FUNCTION_ENTRY 9467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoart_indexof: 9477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 9487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 9497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao .global art_string_compareto 9507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ALIGN_FUNCTION_ENTRY 9517fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoart_string_compareto: 9527fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao jr $ra 953