* i386-tdep.c (i386_extract_return_value): "Fix" comment.
authorMark Kettenis <kettenis@gnu.org>
Wed, 11 Jul 2001 08:43:41 +0000 (08:43 +0000)
committerMark Kettenis <kettenis@gnu.org>
Wed, 11 Jul 2001 08:43:41 +0000 (08:43 +0000)
(i386_store_return_value): Frob FPU status and tag word to make
sure the return value is the only value on the FPU stack.

gdb/ChangeLog
gdb/i386-tdep.c

index f946cce80409f4c93d89599e4b60562216730b74..0d20664a30533b94a6840c1e52affc9fb3447872 100644 (file)
@@ -1,5 +1,9 @@
 2001-07-11  Mark Kettenis  <kettenis@gnu.org>
 
+       * i386-tdep.c (i386_extract_return_value): "Fix" comment.
+       (i386_store_return_value): Frob FPU status and tag word to make
+       sure the return value is the only value on the FPU stack.
+
        * config/tm-linux.h: Do not include <signal.h>.  Instead provide
        reasonable defaults for REALTIME_LO and REALTIME_HI if they're not
        already defined.
index 0e3e34057cefe6c913ccecd69bda196683080713..108a70767b2030942c5009fd57fa5d98899da4ea 100644 (file)
@@ -803,7 +803,8 @@ i386_extract_return_value (struct type *type, char *regbuf, char *valbuf)
          return;
        }
 
-      /* Floating-point return values can be found in %st(0).  */
+      /* Floating-point return values can be found in %st(0).
+         FIXME: Does %st(0) always correspond to FP0?  */
       if (len == TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT
          && TARGET_LONG_DOUBLE_FORMAT == &floatformat_i387_ext)
        {
@@ -861,6 +862,8 @@ i386_store_return_value (struct type *type, char *valbuf)
 
   if (TYPE_CODE (type) == TYPE_CODE_FLT)
     {
+      unsigned int fstat;
+
       if (NUM_FREGS == 0)
        {
          warning ("Cannot set floating-point return value.");
@@ -889,6 +892,16 @@ i386_store_return_value (struct type *type, char *valbuf)
          write_register_bytes (REGISTER_BYTE (FP0_REGNUM), buf,
                                FPU_REG_RAW_SIZE);
        }
+
+      /* Set the top of the floating point register stack to 7.  That
+         makes sure that FP0 (which we set above) is indeed %st(0).
+         FIXME: Perhaps we should completely reset the status word?  */
+      fstat = read_register (FSTAT_REGNUM);
+      fstat |= (7 << 11);
+      write_register (FSTAT_REGNUM, fstat);
+
+      /* Mark %st(1) through %st(7) as empty.  */
+      write_register (FTAG_REGNUM, 0x3fff);
     }
   else
     {
This page took 0.034455 seconds and 4 git commands to generate.