diff options
author | Mark Kettenis <kettenis@gnu.org> | 2001-07-11 08:43:41 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@gnu.org> | 2001-07-11 08:43:41 +0000 |
commit | 77fb19f4ad07472d57dd19c166a119960a14e8b1 (patch) | |
tree | 081ba59a581985cbc4996eedd53fd0097c5bed4d /gdb/i386-tdep.c | |
parent | ae5622b4c475c426e224842afb06abab20f1c312 (diff) | |
download | gdb-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.c | 15 |
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 { |