diff options
Diffstat (limited to 'src/jit/fp.h')
-rw-r--r-- | src/jit/fp.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/jit/fp.h b/src/jit/fp.h new file mode 100644 index 0000000000..f1cee9581a --- /dev/null +++ b/src/jit/fp.h @@ -0,0 +1,73 @@ +// 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. + +#ifndef _JIT_FP + +#define _JIT_FP + +// Auxiliary structures. +#if FEATURE_STACK_FP_X87 + +enum dummyFPenum +{ +#define REGDEF(name, rnum, mask, sname) dummmy_##name = rnum, +#include "registerfp.h" + + FP_VIRTUALREGISTERS, +}; + +// FlatFPStateX87 holds the state of the virtual register file. For each +// virtual register we keep track to which physical register we're +// mapping. We also keep track of the physical stack. + +#define FP_PHYSICREGISTERS FP_VIRTUALREGISTERS +#define FP_VRNOTMAPPED -1 + +struct FlatFPStateX87 +{ +public: + void Init(FlatFPStateX87* pFrom = 0); + bool Mapped(unsigned uEntry); // Is virtual register mapped + void Unmap(unsigned uEntry); // Unmaps a virtual register + void Associate(unsigned uEntry, unsigned uStack); + unsigned StackToST(unsigned uEntry); // Maps the stack to a ST(x) entry + unsigned VirtualToST(unsigned uEntry); + unsigned STToVirtual(unsigned uST); + unsigned TopIndex(); + unsigned TopVirtual(); + void Rename(unsigned uVirtualTo, unsigned uVirtualFrom); + unsigned Pop(); + void Push(unsigned uEntry); + bool IsEmpty(); + + // Debug/test methods + static bool AreEqual(FlatFPStateX87* pSrc, FlatFPStateX87* pDst); +#ifdef DEBUG + bool IsValidEntry(unsigned uEntry); + bool IsConsistent(); + void UpdateMappingFromStack(); + void Dump(); + + // In some optimizations the stack will be inconsistent in some transactions. We want to keep + // the checks for everthing else, so if have the stack in an inconsistent state, you must + // ignore it on purpose. + bool m_bIgnoreConsistencyChecks; + + inline void IgnoreConsistencyChecks(bool bIgnore) + { + m_bIgnoreConsistencyChecks = bIgnore; + } +#else + inline void IgnoreConsistencyChecks(bool bIgnore) + { + } +#endif + + unsigned m_uVirtualMap[FP_VIRTUALREGISTERS]; + unsigned m_uStack[FP_PHYSICREGISTERS]; + unsigned m_uStackSize; +}; + +#endif // FEATURE_STACK_FP_X87 +#endif |