⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 callnativeoabi.s

📁 jam vm 最新Java虚拟机!为开源项目源代码
💻 S
字号:
/* * Copyright (C) 2003, 2004, 2005, 2006, 2007 * Robert Lougher <rob@lougher.org.uk>. * * This file is part of JamVM. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2, * or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */        .text        .align  2        .global callJNIMethod        .type   callJNIMethod,functioncallJNIMethod:        mov     ip, sp        stmfd   sp!, {r4, r5, ip, lr}        mov     r4, ip        mov     r5, r3                  @ save native_arg        ldr     ip, [r4]                @ get ostack pntr        ldr     r2, [r4, #8]            @ get args_count        cmp     r1, #0                  @ is method static?         ldreq   r1, [ip], #4            @ no, load r0 with "this"        addne   r2, r2, #1              @ yes, add 1 to cnt for "class"         subs    r2, r2, #3              @ no. of args fit in registers?        ble     do_call                 @ yes, skip stack push        add     lr, ip, #4        @ loop pushing extra args from ostack        @ onto native stack.        @ lr = ostack pntr, r2 = loop counterloop:        ldr     r3, [lr, r2, lsl #2]        str     r3, [sp, #-4]!        subs    r2, r2, #1        bne     loopdo_call:        @ load last two registers in calling        @ convention.  Doesn't matter if args < 4,        @ faster than checking and safe to load rubbish        ldr     r2, [ip]        ldr     r3, [ip, #4]        mov     lr, pc        ldr     pc, [r4, #4]            @ call the function...        @ reload ostack pntr for pushing return value        ldr     r2, [r4]        @ native_arg holds return type (set in nativeExtraArg)        @ 0 = void, 1 = double, 2 = float, 3 = long        @ 4 = everything else        @ values arranged so that if it's >= 3, it's "int" or        @ long, so push low word - r0 is now free so we can        @ put opntr into it, for all types#if defined(__VFP_FP__) || defined(__SOFTFP__)        cmp     r5, #1#else        cmp     r5, #3#endif        strge   r0, [r2], #4        mov     r0, r2        @ optimise for most often case of "int" return - all others        @ jump to 2 instruction "handler", but this falls through        addle   pc, pc, r5, lsl #3        @ room for one instruction here - enough to just return, all        @ we need, as everything's been done above        ldmdb   r4, {r4, r5, sp, pc}                @ void return        ldmdb   r4, {r4, r5, sp, pc}        nop        #if !defined(__VFP_FP__) && !defined(__SOFTFP__)        @ double return        stfd    f0, [r0], #8        ldmdb   r4, {r4, r5, sp, pc}        @ float return        stfs    f0, [r0], #4        ldmdb   r4, {r4, r5, sp, pc}#endif        @long return        str     r1, [r0], #4        ldmdb   r4, {r4, r5, sp, pc}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -