summaryrefslogtreecommitdiff
path: root/src/jit/fp.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/jit/fp.h')
-rw-r--r--src/jit/fp.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/jit/fp.h b/src/jit/fp.h
new file mode 100644
index 0000000000..de7a8933b2
--- /dev/null
+++ b/src/jit/fp.h
@@ -0,0 +1,76 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license 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