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 + -
显示快捷键?