ccminvokers_cpu.s

来自「This is a resource based on j2me embedde」· S 代码 · 共 297 行

S
297
字号
/* * @(#)ccminvokers_cpu.S	1.5 06/10/24 *  * Portions Copyright  2000-2008 Sun Microsystems, Inc. All Rights * Reserved.  Use is subject to license terms. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER *  * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. *  * 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 version 2 for more details (a copy is * included at /legal/license.txt). *  * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA *  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */#include "javavm/include/asmmacros_cpu.h"#include "javavm/include/jit/jitasmmacros_cpu.h"#include "javavm/include/jit/jitasmconstants.h"#include "javavm/include/porting/jit/jit.h".file "ccminvokers_cpu.S"#define NEW_JFP CVMX86_NEWJFP_REGNAME #define PREV    CVMX86_PREVFRAME_REGNAME/*  * Helpers for invoking from and returning from compiled methods.  */ /* CVMCCMinvokeJNIMethod */ENTRY(CVMCCMinvokeJNIMethod )	# A1 = target mb		FIXUP_FRAMES_2(JFP, A4 /* scratch */, A2, A3, CVMCCMinvokeJNIMethod_L1)CVMCCMinvokeJNIMethod_L1:	CALL_HELPER_2_NO_RET(A4 /* scratch */, EE_AS_ARG, AS_ARG(A1), SYM_NAME(CVMinvokeJNIHelper))	/* jump to returnToInterpreter0 if retval is 0 */	cmpl $0, %eax	jne CVMCCMinvokeJNIMethod_L2	addl $4, %esp	jmp returnToInterpreter0	CVMCCMinvokeJNIMethod_L2:	retSET_SIZE( CVMCCMinvokeJNIMethod )/* CVMCCMletInterpreterDoInvoke */ENTRY(CVMCCMletInterpreterDoInvoke )#define SCRATCH A4	letInterpreterDoInvoke_store_lr:	popl	SCRATCH		# return address	movl	SCRATCH, OFFSET_CVMCompiledFrame_PC(JFP)	ENTRY(CVMCCMletInterpreterDoInvokeWithoutFlushRetAddr ) letInterpreterDoInvoke:         /*          * Trying to invoke something beyond our ability.          * Return the mb to the interpreter and let it do the          * dirty work.          * we have already set up the return PC in our own frame          * We need to set topOfStack then return the target MB*          * as a C return value.          */ 	FIXUP_FRAMES_0(JFP, SCRATCH, CVMCCMletInterpreterDoInvokeWithoutFlushRetAddr_L1)CVMCCMletInterpreterDoInvokeWithoutFlushRetAddr_L1:	        movl	(OFFSET_CVMCCExecEnv_ee)(%esp), SCRATCH        movl	JSP, OFFSET_CVMFrame_topOfStack(JFP)         movl	JFP, (OFFSET_CVMExecEnv_interpreterStack+OFFSET_CVMStack_currentFrame)(SCRATCH)	addl	$SA(CONSTANT_CVMCCExecEnv_size), %esp	popl	%ebx	popl	%edi	popl	%esi	popl	%ebp	ret#undef SCRATCH	#	# Do a GC check, and rendezvous if one is going on	#handleGCForReturn:	hlt					/* * The GC checks for the various return variants */handleGCForDoReturn:		hlt	handleGCForDoSyncReturn:		hlt	/* CVMCCMinvokeCNIMethod */ENTRY(CVMCCMinvokeCNIMethod )#define SCRATCH A4	/* A1 = target mb */		movzbl OFFSET_CVMMethodBlock_argsSizeX(A1), A3	shl $2, A3	movl JSP, A2	subl A3, A2 /* A2 now points to args */	FIXUP_FRAMES_1(JFP, SCRATCH, A2, CVMCCMinvokeCNIMethod_L1)CVMCCMinvokeCNIMethod_L1:	CALL_HELPER_PROLOG(SCRATCH)	pushl A2              /* spill arg pointer (A2) */		/* push args with correct offsets */	/* **p_mb */	pushl %esp	addl $(16 + OFFSET_CVMCCExecEnv_ccmStorage), 0(%esp)	movl A1,  20 + OFFSET_CVMCCExecEnv_ccmStorage(%esp)	/* arguments */	AS_ARG(A2)(4)	/* ee */	EE_AS_ARG(5)	/* issue the call */	movl OFFSET_CVMMethodBlock_codeX(A1), A3	CALL_HELPER(SCRATCH, 4, *A3)	movl -12(%esp), A2 /* restore arg pointer */	/* if %eax >= 0 then %eax is the size in words of the method result	   note that %eax is A1 */	cmpl $0, A1	jl CVMCCMinvokeCNIMethod_L2	/* pop args and adjust for result */	shl $2, A1	movl A2, JSP	addl A1, JSP		/* retval is already in %eax / A1 */	retCVMCCMinvokeCNIMethod_L2:	/* check if a new mb to execute has been returned */	cmpl $CONSTANT_CNI_NEW_MB, A1	jne new_transition	/* A1 = newMb */	movl 4 + OFFSET_CVMCCExecEnv_ccmStorage(%esp), A1	/* adjust TOS 'cause new method may have fewer args than the CNI method */	movzbl OFFSET_CVMMethodBlock_argsSizeX(A1), A3	shl $2, A3	movl A2, JSP	addl A3, JSP	movl JSP, OFFSET_CVMFrame_topOfStack(JFP)	addl $4, %esp /* pop return address */	jmp returnToInterpreter1new_transition:	/* check if a new transition frame to execute has been setup */	cmpl $CONSTANT_CNI_NEW_TRANSITION_FRAME, A1	je CVMCCMinvokeCNIMethod_L3	addl $4, %esp /* pop return address */	jmp returnToInterpreterCVMCCMinvokeCNIMethod_L3:	movl A2, OFFSET_CVMFrame_topOfStack(JFP) /* pop args */	addl $4, %esp /* pop return address */	jmp returnToInterpreter0#undef SCRATCHSET_SIZE( CVMCCMinvokeCNIMethod ) /* CVMCCMreturnFromSyncMethod */ENTRY(CVMCCMreturnFromSyncMethod )returnToNativeDoSyncReturn:#if 1 /* TODO(rr): port SPARC assembler instead of using interpreter */	#	# If you just want to call the C helper and write very little assembler	# code, then just to branch to (and implement) returnToInterpreter.	#	jmp	returnToInterpreter#endifSET_SIZE( CVMCCMreturnFromSyncMethod )/*  * CVMCCMreturnFromMethod * * Native code doing a return comes here.  * It may as well branch, since the return address is not interesting.  */ENTRY(CVMCCMreturnFromMethod )	/*  FIXME: For now let's just forget about GC check. */	#b	handleGCForDoReturn	#nop	/* The GC check for non-sync returns comes back here */returnToNativeDoReturn:	        # see if previous frame is compiled or not         movl	OFFSET_CVMFrame_prevX(JFP), PREV        andl	$CONSTANT_CVM_FRAME_MASK_SLOW, PREV	jnz 	returnToInterpreterdoReturnToCompiled:/*	# TODO(SW): enable tracing#ifdef CVM_TRACE	mov	JFP, %o1	CALL_VM_FUNCTION(CCMtraceMethodReturn)	mov	EE, %o0#endif*/        # returning from one native to another.         # do this ourselves. 	# java sp already set	movl	OFFSET_CVMFrame_prevX(JFP), JFP	andl	$ ~CONSTANT_CVM_FRAME_MASK_ALL, JFP        movl	OFFSET_CVMCompiledFrame_PC(JFP), %ebx	/* TODO(SW): guess we don't need this -> check it */#ifdef CVMCPU_HAS_CP_REG#	ld	[JFP + OFFSET_CVMCompiledFrame_cpBaseRegX], CP#endif	jmpl *	%ebx/* CVMCCMletInterpreterDoInvokeWithoutFlushRetAddr */ENTRY(CVMCCMreturnToInterpreter )#define SCRATCH A1returnToInterpreter:	FIXUP_FRAMES_0(JFP, SCRATCH, returnToInterpreter2)returnToInterpreter2:		# ld [%sp + MINFRAME + OFFSET_CVMCCExecEnv_ee], EE	movl OFFSET_CVMCCExecEnv_ee(%esp), SCRATCH	# JSP needs to point just past any return value        movl JSP, OFFSET_CVMFrame_topOfStack(JFP)        # set stack->currentFrame to current value of JFP,         # then return NULL, meaning we donnot want the interpreter         # to take any further action on our behalf (except pop	# the current frame)        movl JFP, (OFFSET_CVMExecEnv_interpreterStack+OFFSET_CVMStack_currentFrame)(SCRATCH)#undef SCRATCHreturnToInterpreter0:        movl $0, %eaxreturnToInterpreter1:	addl $SA(CONSTANT_CVMCCExecEnv_size), %esp	popl %ebx	popl %edi	popl %esi	popl %ebp	retSET_SIZE( CVMCCMreturnFromMethod )/* CVMCCMtraceMethodCallGlue */ENTRY(CVMCCMtraceMethodCallGlue )	hlt # TODO(SW)SET_SIZE( CVMCCMtraceMethodCallGlue )/* CVMCCMinvokeStaticSyncMethodHelper */ENTRY(CVMCCMinvokeStaticSyncMethodHelper )        # A1 = target mb #if 1 /* TODO(rr): implement this in assembly */	# If you just want to call the C helper and write very little assembler	# code, then just to branch to (and implement) letInterpreterDoInvoke.	#	addl	$4, %esp			/* don't need return address */        jmp 	letInterpreterDoInvoke#endifSET_SIZE( CVMCCMinvokeStaticSyncMethodHelper )/* CVMCCMinvokeNonstaticSyncMethodHelper */ENTRY(CVMCCMinvokeNonstaticSyncMethodHelper )	# A1 = target mb	# A2 = CVMObjectICell* of object to sync on#if 1 /* TODO(rr) port SPARC assembler */	# If you just want to call the C helper and write very little assemble	# code, then just to branch to (and implement) letInterpreterDoInvoke.	#	addl	$4, %esp			/* don't need return address */	jmp	letInterpreterDoInvoke#endifSET_SIZE( CVMCCMinvokeNonstaticSyncMethodHelper )

⌨️ 快捷键说明

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