#ifndef __ARCH_X86_UTILITY_HH__
#define __ARCH_X86_UTILITY_HH__
-#include "arch/x86/regs/misc.hh"
-#include "arch/x86/types.hh"
-#include "base/hashmap.hh"
-#include "base/misc.hh"
-#include "base/types.hh"
#include "cpu/static_inst.hh"
#include "cpu/thread_context.hh"
#include "sim/full_system.hh"
-class ThreadContext;
-
namespace X86ISA
{
void skipFunction(ThreadContext *tc);
inline void
- advancePC(PCState &pc, const StaticInstPtr inst)
+ advancePC(PCState &pc, const StaticInstPtr &inst)
{
inst->advancePC(pc);
}
inline uint64_t getDoubleBits(double val) {
return *(uint64_t *)(&val);
}
+
+ /**
+ * Convert an x87 tag word to abridged tag format.
+ *
+ * Convert from the x87 tag representation to the tag abridged
+ * representation used in the FXSAVE area. The classic format uses
+ * 2 bits per stack position to indicate if a position is valid,
+ * zero, special, or empty. The abridged format only stores
+ * whether a position is empty or not.
+ *
+ * @param ftw Tag word in classic x87 format.
+ * @return Tag word in the abridged format.
+ */
+ uint8_t convX87TagsToXTags(uint16_t ftw);
+
+ /**
+ * Convert an x87 xtag word to normal tags format.
+ *
+ * Convert from the abridged x87 tag representation used in the
+ * FXSAVE area to a full x87 tag. The classic format uses 2 bits
+ * per stack position to indicate if a position is valid, zero,
+ * special, or empty. The abridged format only stores whether a
+ * position is empty or not.
+ *
+ * @todo Reconstruct the correct state of stack positions instead
+ * of just valid/invalid.
+ *
+ * @param ftwx Tag word in the abridged format.
+ * @return Tag word in classic x87 format.
+ */
+ uint16_t convX87XTagsToTags(uint8_t ftwx);
+
+ /**
+ * Generate and updated x87 tag register after a push/pop
+ * operation.
+ *
+ * @note There is currently no support for setting other tags than
+ * valid and invalid. A real x87 will set the tag value to zero or
+ * special for some special floating point values.
+ *
+ * @param ftw Current value of the FTW register.
+ * @param top Current x87 TOP value.
+ * @param spm Stack displacement.
+ * @return New value of the FTW register.
+ */
+ uint16_t genX87Tags(uint16_t ftw, uint8_t top, int8_t spm);
+
+ /**
+ * Load an 80-bit float from memory and convert it to double.
+ *
+ * @param mem Pointer to an 80-bit float.
+ * @return double representation of the 80-bit float.
+ */
+ double loadFloat80(const void *mem);
+
+ /**
+ * Convert and store a double as an 80-bit float.
+ *
+ * @param mem Pointer to destination for the 80-bit float.
+ * @param value Double precision float to store.
+ */
+ void storeFloat80(void *mem, double value);
}
#endif // __ARCH_X86_UTILITY_HH__