diff options
Diffstat (limited to 'src/jit/sm.h')
-rw-r--r-- | src/jit/sm.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/jit/sm.h b/src/jit/sm.h new file mode 100644 index 0000000000..33d65092bb --- /dev/null +++ b/src/jit/sm.h @@ -0,0 +1,75 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +// +// State machine header used ONLY in the JIT. +// + +#ifndef __sm_h__ +#define __sm_h__ + +#include "smcommon.h" + +extern const SMState* gp_SMStates; +extern const JumpTableCell* gp_SMJumpTableCells; +extern const short* gp_StateWeights; + +class CodeSeqSM // Represent a particualr run of the state machine + // For example, it maintains the array of counts for the terminated states. + // These counts should be stored in per method based for them to be correct + // under multithreadeded environment. +{ +public: + Compiler* pComp; + + const SMState* States; + const JumpTableCell* JumpTableCells; + const short* StateWeights; // Weight for each state. Including non-terminate states. + + SM_STATE_ID curState; + + int NativeSize; // This is a signed integer! + + void Start(Compiler* comp); + void Reset(); + void End(); + void Run(SM_OPCODE opcode DEBUGARG(int level)); + + SM_STATE_ID GetDestState(SM_STATE_ID srcState, SM_OPCODE opcode); + + // Matched a termination state + inline void TermStateMatch(SM_STATE_ID stateID DEBUGARG(bool verbose)) + { + assert(States[stateID].term); + assert(StateMatchedCounts[stateID] < _UI16_MAX); +#ifdef DEBUG + ++StateMatchedCounts[stateID]; +#ifndef SMGEN_COMPILE + if (verbose) + { + printf("weight=%3d : state %3d [ %s ]\n", StateWeights[stateID], stateID, StateDesc(stateID)); + } +#endif // SMGEN_COMPILE +#endif // DEBUG + + NativeSize += StateWeights[stateID]; + } + + // Given an SM opcode retrieve the weight for this single opcode state. + // For example, ID for single opcode state SM_NOSHOW is 2. + inline short GetWeightForOpcode(SM_OPCODE opcode) + { + SM_STATE_ID stateID = ((SM_STATE_ID)opcode) + SM_STATE_ID_START + 1; + return StateWeights[stateID]; + } + +#ifdef DEBUG + WORD StateMatchedCounts[NUM_SM_STATES]; + const char* StateDesc(SM_STATE_ID stateID); +#endif + + static SM_OPCODE MapToSMOpcode(OPCODE opcode); +}; + +#endif /* __sm_h__ */ |