summaryrefslogtreecommitdiff
path: root/gdb/i386-tdep.c
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2001-07-11 08:43:41 +0000
committerMark Kettenis <kettenis@gnu.org>2001-07-11 08:43:41 +0000
commit77fb19f4ad07472d57dd19c166a119960a14e8b1 (patch)
tree081ba59a581985cbc4996eedd53fd0097c5bed4d /gdb/i386-tdep.c
parentae5622b4c475c426e224842afb06abab20f1c312 (diff)
downloadgdb-77fb19f4ad07472d57dd19c166a119960a14e8b1.tar.gz
* 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.
Diffstat (limited to 'gdb/i386-tdep.c')
-rw-r--r--gdb/i386-tdep.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index 0e3e34057ce..108a70767b2 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -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
{