jitgrammarrules.jcs

来自「This is a resource based on j2me embedde」· JCS 代码 · 共 1,919 行 · 第 1/5 页

JCS
1,919
字号
    {	/* Store the mb of the currently executing Simple Sync method into	 * CVMglobals.jit.currentSimpleSyncMB. */	CVMRMResource* currentSimpleSyncMBRes;	CVMRMResource* simpleSyncMBRes;	CVMJITMethodContext* mc = con->inliningStack[con->inliningDepth-1].mc;	/* load CVMglobals.jit.currentSimpleSyncMB address into a register */	CVMJITsetSymbolName((con, "&CVMglobals.jit.currentSimpleSyncMB"));	currentSimpleSyncMBRes = CVMRMgetResourceForConstant32(            CVMRM_INT_REGS(con), CVMRM_ANY_SET, CVMRM_SAFE_SET,	    (CVMUint32)&CVMglobals.jit.currentSimpleSyncMB);	/* load the Simple Sync mb address into a register */        CVMJITsetSymbolName((con, "mb %C.%M", mc->cb, mc->mb));	simpleSyncMBRes = CVMRMgetResourceForConstant32(            CVMRM_INT_REGS(con), CVMRM_ANY_SET, CVMRM_SAFE_SET,	    (CVMUint32)mc->mb);	/* Store the Simple Sync mb into CVMglobals.jit.currentSimpleSyncMB. */	CVMJITaddCodegenComment((con,				 "CVMglobals.jit.currentSimpleSyncMB = %C.%M",				 mc->cb, mc->mb));	CVMCPUemitMemoryReferenceImmediate(con, CVMCPU_STR32_OPCODE,	    CVMRMgetRegisterNumber(simpleSyncMBRes),	    CVMRMgetRegisterNumber(currentSimpleSyncMBRes), 0);	CVMRMrelinquishResource(CVMRM_INT_REGS(con), currentSimpleSyncMBRes);	CVMRMrelinquishResource(CVMRM_INT_REGS(con), simpleSyncMBRes);    }    {	/* Store the mb of the currently executing method into	 * CVMglobals.jit.currentMB. */	CVMRMResource* currentMBRes;	CVMRMResource* mbRes;	/* load CVMglobals.jit.currentMB address into a register */	CVMJITsetSymbolName((con, "&CVMglobals.jit.currentMB"));	currentMBRes = CVMRMgetResourceForConstant32(            CVMRM_INT_REGS(con), CVMRM_ANY_SET, CVMRM_SAFE_SET,	    (CVMUint32)&CVMglobals.jit.currentMB);	/* load the current mb address into a register */        CVMJITsetSymbolName((con, "mb %C.%M",			     CVMmbClassBlock(con->mb), con->mb));	mbRes = CVMRMgetResourceForConstant32(            CVMRM_INT_REGS(con), CVMRM_ANY_SET, CVMRM_SAFE_SET,	    (CVMUint32)con->mb);	/* Store the Simple Sync mb into CVMglobals.jit.currentMB. */	CVMJITaddCodegenComment((con,				 "CVMglobals.jit.currentMB = %C.%M",				 CVMmbClassBlock(con->mb), con->mb));	CVMCPUemitMemoryReferenceImmediate(con, CVMCPU_STR32_OPCODE,	    CVMRMgetRegisterNumber(mbRes),	    CVMRMgetRegisterNumber(currentMBRes), 0);	CVMRMrelinquishResource(CVMRM_INT_REGS(con), currentMBRes);	CVMRMrelinquishResource(CVMRM_INT_REGS(con), mbRes);    }#endif /* 0 */#endif /* CVM_DEBUG */    CVMRMrelinquishResource(CVMRM_INT_REGS(con), obj);    CVMRMrelinquishResource(CVMRM_INT_REGS(con), objHdr);    CVMRMrelinquishResource(CVMRM_INT_REGS(con), microLock);    CVMRMoccupyAndUnpinResource(CVMRM_INT_REGS(con), dest, intrinsicNode);    pushResource(con, dest);}/* * Intrinsic emitter for microlock version of CVM.simpleLockRelease(). * * Stores CVM_MICROLOCK_UNLOCKED into CVMglobals.objGlobalMicroLock. */static voidsimpleLockReleaseEmitter(    CVMJITCompilationContext * con,    CVMJITIRNode *intrinsicNode){    CVMRMResource* tmp;    CVMRMResource* microLock;    int tmpRegID, microLockRegID;    popResource(con); /* pop the "this" argument, which we don't use */    tmp = CVMRMgetResource(CVMRM_INT_REGS(con),			   CVMRM_ANY_SET, CVMRM_SAFE_SET, 1);    tmpRegID = CVMRMgetRegisterNumber(tmp);    /* get CVM_MICROLOCK_UNLOCKED value */    CVMJITaddCodegenComment((con, "CVM_MICROLOCK_UNLOCKED"));    CVMCPUemitLoadConstant(con, tmpRegID, CVM_MICROLOCK_UNLOCKED);#ifdef CVM_DEBUG    /* Set the ee's microlock depth to 0, which is the same as     * CVM_MICROLOCK_UNLOCKED. */    {	int eeReg;#ifndef CVMCPU_EE_REG	CVMRMResource *eeRes =	    CVMRMgetResource(CVMRM_INT_REGS(con),			     CVMRM_ANY_SET, CVMRM_EMPTY_SET, 1);	eeReg = CVMRMgetRegisterNumber(eeRes);	/* Get the ee: */	CVMJITaddCodegenComment((con, "eeReg = ccee->ee"));	CVMCPUemitCCEEReferenceImmediate(con, CVMCPU_LDR32_OPCODE, eeReg,					 CVMoffsetof(CVMCCExecEnv, eeX));#else	eeReg = CVMCPU_EE_REG;#endif	CVMassert(CVM_MICROLOCK_UNLOCKED == 0);	CVMJITaddCodegenComment((con, "ee->microLock = 0"));	CVMCPUemitMemoryReferenceImmediate(con, CVMCPU_STR32_OPCODE,					   tmpRegID, eeReg,					   offsetof(CVMExecEnv, microLock));#ifndef CVMCPU_EE_REG	CVMRMrelinquishResource(CVMRM_INT_REGS(con), eeRes);#endif    }#endif /* CVM_DEBUG */    /* load microlock address into microLockRegID */    CVMJITsetSymbolName((con, "&CVMglobals.objGlobalMicroLock"));    microLock = CVMRMgetResourceForConstant32(CVMRM_INT_REGS(con),				  CVMRM_ANY_SET, CVMRM_SAFE_SET,				  (CVMUint32)&CVMglobals.objGlobalMicroLock);    microLockRegID = CVMRMgetRegisterNumber(microLock);    /* release the microlock */    CVMJITaddCodegenComment((con,	"CVMglobals.objGlobalMicroLock = CVM_MICROLOCK_UNLOCKED"));    CVMCPUemitMemoryReferenceImmediate(con, CVMCPU_STR32_OPCODE,				       tmpRegID, microLockRegID, 0);    CVMRMrelinquishResource(CVMRM_INT_REGS(con), tmp);    CVMRMrelinquishResource(CVMRM_INT_REGS(con), microLock);}#elif CVM_FASTLOCK_TYPE == CVM_FASTLOCK_ATOMICOPS/* See x86 version in second half of file */static voidsimpleLockGrabEmitter(    CVMJITCompilationContext * con,    CVMJITIRNode *intrinsicNode);static voidsimpleLockReleaseEmitter(    CVMJITCompilationContext * con,    CVMJITIRNode *intrinsicNode);#else#error Unsupported locking type for CVMJIT_SIMPLE_SYNC_METHODS#endif#endif /* CVMJIT_SIMPLE_SYNC_METHODS */static voiddoIntMinMax(    CVMJITCompilationContext * con,    CVMBool	min,    CVMJITIRNodePtr thisNode,    CVMRMregset target,    CVMRMregset avoid){    CVMRMResource* rhs = popResource(con);    CVMRMResource* lhs = popResource(con);    CVMRMResource* dest;    int cclhs, ccrhs;    int destRegID, lhsRegID, rhsRegID;    if (min){        cclhs = CVMCPU_COND_LE;        ccrhs = CVMCPU_COND_GT;    } else {        cclhs = CVMCPU_COND_GE;        ccrhs = CVMCPU_COND_LT;    }    /* REDUCE INSTRUCTION COUNT BY LOOKING AT REF COUNTS? */    dest = CVMRMgetResource(CVMRM_INT_REGS(con), target, avoid, 1);    CVMRMpinResource(CVMRM_INT_REGS(con), rhs, CVMRM_ANY_SET, CVMRM_EMPTY_SET);    CVMRMpinResource(CVMRM_INT_REGS(con), lhs, CVMRM_ANY_SET, CVMRM_EMPTY_SET);    destRegID = CVMRMgetRegisterNumber(dest);    lhsRegID = CVMRMgetRegisterNumber(lhs);    rhsRegID = CVMRMgetRegisterNumber(rhs);#ifdef CVMCPU_HAS_CONDITIONAL_ALU_INSTRUCTIONS    CVMCPUemitCompareRegister(con, CVMCPU_CMP_OPCODE, cclhs,			      lhsRegID, rhsRegID);    CVMCPUemitMoveRegisterConditional(con, CVMCPU_MOV_OPCODE, destRegID,                                      lhsRegID, CVMJIT_NOSETCC, cclhs);    CVMCPUemitMoveRegisterConditional(con, CVMCPU_MOV_OPCODE, destRegID,                                      rhsRegID, CVMJIT_NOSETCC, ccrhs),#else    CVMCPUemitMoveRegister(con, CVMCPU_MOV_OPCODE, destRegID,			   lhsRegID, CVMJIT_NOSETCC);    CVMCPUemitCompareRegister(con, CVMCPU_CMP_OPCODE, ccrhs,			      lhsRegID, rhsRegID);    CVMCPUemitMoveRegisterConditional(con, CVMCPU_MOV_OPCODE, destRegID,                                      rhsRegID, CVMJIT_NOSETCC, ccrhs),#endif    CVMRMrelinquishResource(CVMRM_INT_REGS(con), lhs);    CVMRMrelinquishResource(CVMRM_INT_REGS(con), rhs);    CVMRMoccupyAndUnpinResource(CVMRM_INT_REGS(con), dest, thisNode);    pushResource(con, dest);}static voidimaxEmitOperator(CVMJITCompilationContext *con, CVMJITIRNode *intrinsicNode){    struct CVMJITCompileExpression_rule_computation_state *goal_top =	(struct CVMJITCompileExpression_rule_computation_state *)        (con->goal_top);    doIntMinMax(con, CVM_FALSE, intrinsicNode, GET_REGISTER_GOALS);}static voidiminEmitOperator(CVMJITCompilationContext *con, CVMJITIRNode *intrinsicNode){    struct CVMJITCompileExpression_rule_computation_state *goal_top =	(struct CVMJITCompileExpression_rule_computation_state *)        (con->goal_top);    doIntMinMax(con, CVM_TRUE, intrinsicNode, GET_REGISTER_GOALS);}const CVMJITIntrinsicEmitterVtbl   CVMJITRISCintrinsicThreadCurrentThreadEmitter ={    CVMJITRISCintrinsicDefaultGetRequired,    CVMJITRISCintrinsicDefaultGetArgTarget,    java_lang_Thread_currentThread_EmitOperator,};const CVMJITIntrinsicEmitterVtbl CVMJITRISCintrinsicIAbsEmitter ={    CVMJITRISCintrinsicDefaultGetRequired,    CVMJITRISCintrinsicDefaultGetArgTarget,    iabsEmitOperator,};const CVMJITIntrinsicEmitterVtbl CVMJITRISCintrinsicIMaxEmitter ={    CVMJITRISCintrinsicDefaultGetRequired,    CVMJITRISCintrinsicDefaultGetArgTarget,    imaxEmitOperator,};const CVMJITIntrinsicEmitterVtbl CVMJITRISCintrinsicIMinEmitter ={    CVMJITRISCintrinsicDefaultGetRequired,    CVMJITRISCintrinsicDefaultGetArgTarget,    iminEmitOperator,};#ifdef CVMJIT_SIMPLE_SYNC_METHODSconst CVMJITIntrinsicEmitterVtbl CVMJITRISCintrinsicSimpleLockGrabEmitter ={    CVMJITRISCintrinsicDefaultGetRequired,    CVMJITRISCintrinsicDefaultGetArgTarget,    simpleLockGrabEmitter,};const CVMJITIntrinsicEmitterVtbl CVMJITRISCintrinsicSimpleLockReleaseEmitter ={    CVMJITRISCintrinsicSimpleLockReleaseGetRequired,    CVMJITRISCintrinsicSimpleLockReleaseGetArgTarget,    simpleLockReleaseEmitter,};#endif /* CVMJIT_SIMPLE_SYNC_METHODS */#endif  /* CVMJIT_INTRINSICS */static voidshortenInt(    CVMJITCompilationContext* con,    int rightshiftop,    int shiftwidth,    CVMJITIRNodePtr thisNode,    CVMRMregset target,    CVMRMregset avoid){    CVMRMResource* src = popResource(con);    CVMRMResource* dest = CVMRMgetResource(CVMRM_INT_REGS(con),					   target, avoid, 1);    int destregno = CVMRMgetRegisterNumber(dest);    CVMRMpinResource(CVMRM_INT_REGS(con), src, CVMRM_ANY_SET, CVMRM_EMPTY_SET);    CVMCPUemitShiftByConstant(con, CVMCPU_SLL_OPCODE, destregno,                              CVMRMgetRegisterNumber(src), shiftwidth);    CVMCPUemitShiftByConstant(con, rightshiftop, destregno, destregno, shiftwidth);    CVMRMoccupyAndUnpinResource(CVMRM_INT_REGS(con), dest, thisNode);    CVMRMrelinquishResource(CVMRM_INT_REGS(con), src);    pushResource(con, dest);}/* Purpose: Fetches an instance field from an object. */static void fetchField(CVMJITCompilationContext *con,		       CVMJITRMContext* rc,                       CVMJITIRNodePtr thisNode,                       CVMRMregset target, CVMRMregset avoid,                       CVMInt32 opcode, int fieldSize){    CVMCPUMemSpec *fieldOffset = popMemSpec(con);    CVMRMResource *objPtr = popResource(con);    CVMRMResource *dest;    dest = CVMRMgetResource(rc, target, avoid, fieldSize);    CVMRMpinResource(CVMRM_INT_REGS(con), objPtr,		     CVMRM_ANY_SET, CVMRM_EMPTY_SET);    CVMJITaddCodegenComment((con, "= getfield(obj, fieldIdx);"));    CVMCPUmemspecPinResource(CVMRM_INT_REGS(con), fieldOffset,			     CVMRM_ANY_SET, CVMRM_EMPTY_SET);    CVMCPUemitMemoryReference(con, opcode,        CVMRMgetRegisterNumber(dest), CVMRMgetRegisterNumber(objPtr),        CVMCPUmemspecGetToken(con, fieldOffset));    CVMCPUmemspecRelinquishResource(CVMRM_INT_REGS(con), fieldOffset);    CVMRMrelinquishResource(CVMRM_INT_REGS(con), objPtr);    CVMRMoccupyAndUnpinResource(rc, dest, thisNode);    pushResource(con, dest);}#define GETFIELD_SYNTHESIS(con, p)   L_BINARY_SYNTHESIS((con), (p))#define GETFIELD_INHERITANCE(con, p) L_BINARY_INHERITANCE((con), (p))/* Purpose: Sets a value to an instance field of an object. */static void setField(CVMJITCompilationContext *con,		     CVMJITRMContext* rc,                     CVMInt32 opcode){    CVMRMResource *src = popResource(con);    CVMCPUMemSpec *fieldOffset = popMemSpec(con);    CVMRMResource *objPtr = popResource(con);    CVMRMpinResource(CVMRM_INT_REGS(con), objPtr,		     CVMRM_ANY_SET, CVMRM_EMPTY_SET);    CVMRMpinResource(rc, src,    rc->anySet, CVMRM_EMPTY_SET);    CVMCPUmemspecPinResource(CVMRM_INT_REGS(con), fieldOffset,			     CVMRM_ANY_SET, CVMRM_EMPTY_SET);    CVMCPUemitMemoryReference(con, opcode,        CVMRMgetRegisterNumber(src), CVMRMgetRegisterNumber(objPtr),        CVMCPUmemspecGetToken(con, fieldOffset));    CVMCPUmemspecRelinquishResource(CVMRM_INT_REGS(con), fieldOffset);    CVMRMrelinquishResource(CVMRM_INT_REGS(con), objPtr);    CVMRMrelinquishResource(rc, src);}/* pops a Java stack value into a register */static voidforceJavaStackTopValueIntoRegister(    CVMJITCompilationContext* con,    CVMJITRMContext* dstCtx,    CVMRMregset target,    CVMRMregset avoid){    CVMRMResource* operand = popResource(con);    if (CVMRMisJavaStackTopValue(operand)) {	CVMRMpinResource(dstCtx, operand, target, avoid);    }    CVMRMunpinResource(dstCtx, operand);    pushResource(con, operand);}/* convert CVMJIT_XXX condition code to a CVMCPUCondCode */static CVMCPUCondCodemapCondCode(CVMUint16 condition) {    switch(condition) {        case CVMJIT_EQ: return CVMCPU_COND_EQ;        case CVMJIT_NE: return CVMCPU_COND_NE;        case CVMJIT_LE: return CVMCPU_COND_LE;        case CVMJIT_GE: return CVMCPU_COND_GE;        case CVMJIT_LT: return CVMCPU_COND_LT;        case CVMJIT_GT: return CVMCPU_COND_GT;        default: CVMassert(CVM_FALSE); return 0;    }}typedef struct {    CVMUint16 low;    CVMUint16 high;    CVMUint16 prevIndex;    CVMInt32 logicalAddress; /* address that branches to this node */} CVMLookupSwitchStackItem;static voidpushLookupNode(CVMLookupSwitchStackItem* stack, CVMUint8* tos,               CVMUint16 low, CVMUint16 high, CVMUint16 prevIndex,	       CVMInt32 logicalAddress){    CVMLookupSwitchStackItem* item = &stack[*tos];    CVMtraceJITCodegen(("---> Pushing #%d (low=%d index=%d high=%d prev=%d)\n",                       *tos, low, (low + high)/2, high, prevIndex));    item->low   = low;    item->high  = high;    item->prevIndex  = prevIndex;

⌨️ 快捷键说明

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