diff options
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/x86/utility.cc | 17 | ||||
-rw-r--r-- | src/arch/x86/utility.hh | 16 |
2 files changed, 33 insertions, 0 deletions
diff --git a/src/arch/x86/utility.cc b/src/arch/x86/utility.cc index 41f5aee0b..b50b99dfa 100644 --- a/src/arch/x86/utility.cc +++ b/src/arch/x86/utility.cc @@ -44,6 +44,7 @@ #include "arch/x86/utility.hh" #include "arch/x86/x86_traits.hh" #include "cpu/base.hh" +#include "fputils/fp80.h" #include "sim/system.hh" namespace X86ISA { @@ -351,4 +352,20 @@ genX87Tags(uint16_t ftw, uint8_t top, int8_t spm) return ftw; } +double +loadFloat80(const void *_mem) +{ + const fp80_t *fp80((const fp80_t *)_mem); + + return fp80_cvtd(*fp80); +} + +void +storeFloat80(void *_mem, double value) +{ + fp80_t *fp80((fp80_t *)_mem); + + *fp80 = fp80_cvfd(value); +} + } // namespace X86_ISA diff --git a/src/arch/x86/utility.hh b/src/arch/x86/utility.hh index dcf61bddb..046b959db 100644 --- a/src/arch/x86/utility.hh +++ b/src/arch/x86/utility.hh @@ -187,6 +187,22 @@ namespace X86ISA * @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__ |