From ccb945b81ed53beb1b3849800949c409b4585140 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Wed, 11 Jul 2001 08:43:41 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 4 ++++ gdb/i386-tdep.c | 15 ++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f946cce804..0d20664a30 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,9 @@ 2001-07-11 Mark Kettenis + * 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 . Instead provide reasonable defaults for REALTIME_LO and REALTIME_HI if they're not already defined. diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index 0e3e34057c..108a70767b 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 {