// 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