changeset 7e744dcb1904 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=7e744dcb1904
description:
        x86: Fix loading of floating point constants

        This changeset actually fixes two issues:

         * The lfpimm instruction didn't work correctly when applied to a
           floating point constant (it did work for integers containing the
           bit string representation of a constant) since it used
           reinterpret_cast to convert a double to a uint64_t. This caused a
           compilation error, at least, in gcc 4.6.3.

         * The instructions loading floating point constants in the x87
           processor didn't work correctly since they just stored a truncated
           integer instead of a double in the floating point register. This
           changeset fixes the old microcode by using lfpimm instruction
           instead of the limm instructions.

diffstat:

 src/arch/x86/isa/includes.isa                               |  1 +
 src/arch/x86/isa/insts/x87/load_constants/load_0_1_or_pi.py |  6 +++---
 src/arch/x86/isa/insts/x87/load_constants/load_logarithm.py |  8 ++++----
 src/arch/x86/isa/microops/limmop.isa                        |  4 ++--
 src/arch/x86/utility.hh                                     |  7 +++++++
 5 files changed, 17 insertions(+), 9 deletions(-)

diffs (96 lines):

diff -r f44ff0beb51b -r 7e744dcb1904 src/arch/x86/isa/includes.isa
--- a/src/arch/x86/isa/includes.isa     Tue Jun 18 16:28:36 2013 +0200
+++ b/src/arch/x86/isa/includes.isa     Tue Jun 18 16:30:06 2013 +0200
@@ -64,6 +64,7 @@
 #include "arch/x86/isa_traits.hh"
 #include "arch/x86/registers.hh"
 #include "arch/x86/types.hh"
+#include "arch/x86/utility.hh"
 #include "base/misc.hh"
 #include "cpu/static_inst.hh"
 #include "mem/packet.hh"
diff -r f44ff0beb51b -r 7e744dcb1904 
src/arch/x86/isa/insts/x87/load_constants/load_0_1_or_pi.py
--- a/src/arch/x86/isa/insts/x87/load_constants/load_0_1_or_pi.py       Tue Jun 
18 16:28:36 2013 +0200
+++ b/src/arch/x86/isa/insts/x87/load_constants/load_0_1_or_pi.py       Tue Jun 
18 16:30:06 2013 +0200
@@ -40,17 +40,17 @@
 microcode = '''
 
 def macroop FLDZ {
-    limm ufp1, "double(0)"
+    lfpimm ufp1, 0.0
     movfp st(-1), ufp1, spm=-1
 };
 
 def macroop FLD1 {
-    limm ufp1, "double(1)"
+    lfpimm ufp1, 1.0
     movfp st(-1), ufp1, spm=-1
 };
 
 def macroop FLDPI {
-    limm ufp1, "double(3.14159265359)"
+    lfpimm ufp1, 3.14159265359
     movfp st(-1), ufp1, spm=-1
 };
 
diff -r f44ff0beb51b -r 7e744dcb1904 
src/arch/x86/isa/insts/x87/load_constants/load_logarithm.py
--- a/src/arch/x86/isa/insts/x87/load_constants/load_logarithm.py       Tue Jun 
18 16:28:36 2013 +0200
+++ b/src/arch/x86/isa/insts/x87/load_constants/load_logarithm.py       Tue Jun 
18 16:30:06 2013 +0200
@@ -40,22 +40,22 @@
 microcode = '''
 
 def macroop FLDL2E {
-    limm ufp1, "double(1.44269504089)"
+    lfpimm ufp1, 1.44269504089
     movfp st(-1), ufp1, spm=-1
 };
 
 def macroop FLDL2T {
-    limm ufp1, "double(3.32192809489)"
+    lfpimm ufp1, 3.32192809489
     movfp st(-1), ufp1, spm=-1
 };
 
 def macroop FLDLG2 {
-    limm ufp1, "double(0.30102999566)"
+    lfpimm ufp1, 0.30102999566
     movfp st(-1), ufp1, spm=-1
 };
 
 def macroop FLDLN2 {
-    limm ufp1, "double(0.69314718056)"
+    lfpimm ufp1, 0.69314718056
     movfp st(-1), ufp1, spm=-1
 };
 
diff -r f44ff0beb51b -r 7e744dcb1904 src/arch/x86/isa/microops/limmop.isa
--- a/src/arch/x86/isa/microops/limmop.isa      Tue Jun 18 16:28:36 2013 +0200
+++ b/src/arch/x86/isa/microops/limmop.isa      Tue Jun 18 16:30:06 2013 +0200
@@ -140,8 +140,8 @@
             self.dest = dest
             if isinstance(imm, (int, long)):
                 imm = "ULL(%d)" % imm
-            if isinstance(imm, float):
-                imm = "reinterpret_cast<uint64_t>((double)(%d))"
+            elif isinstance(imm, float):
+                imm = "getDoubleBits(%.16f)" % imm
             self.imm = imm
             self.dataSize = dataSize
 
diff -r f44ff0beb51b -r 7e744dcb1904 src/arch/x86/utility.hh
--- a/src/arch/x86/utility.hh   Tue Jun 18 16:28:36 2013 +0200
+++ b/src/arch/x86/utility.hh   Tue Jun 18 16:30:06 2013 +0200
@@ -134,6 +134,13 @@
      * @param val New rflags value to store in TC
      */
     void setRFlags(ThreadContext *tc, uint64_t val);
+
+    /**
+     * Extract the bit string representing a double value.
+     */
+    inline uint64_t getDoubleBits(double val) {
+        return *(uint64_t *)(&val);
+    }
 }
 
 #endif // __ARCH_X86_UTILITY_HH__
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to