* i386-tdep.c (i386_extract_return_value): Undo 2001-07-11 changes

to comment.
(i386_store_return_value): Improve comments about storing
floating-point return values.
This commit is contained in:
Mark Kettenis
2001-07-12 18:50:01 +00:00
parent 1e4fac5928
commit 635b0cc19c
2 changed files with 18 additions and 8 deletions

View File

@ -1,5 +1,10 @@
2001-07-12 Mark Kettenis <kettenis@gnu.org> 2001-07-12 Mark Kettenis <kettenis@gnu.org>
* i386-tdep.c (i386_extract_return_value): Undo 2001-07-11 changes
to comment.
(i386_store_return_value): Improve comments about storing
floating-point return values.
* config/arm/xm-linux.h, config/i386/xm-linux.h, * config/arm/xm-linux.h, config/i386/xm-linux.h,
config/m68k/xm-linux.h, config/powerpc/xm-linux.h, config/m68k/xm-linux.h, config/powerpc/xm-linux.h,
config/sparc/xm-linux.h, config/ia64/xm-linux.h (HAVE_TERMIOS): config/sparc/xm-linux.h, config/ia64/xm-linux.h (HAVE_TERMIOS):

View File

@ -803,8 +803,7 @@ i386_extract_return_value (struct type *type, char *regbuf, char *valbuf)
return; 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 if (len == TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT
&& TARGET_LONG_DOUBLE_FORMAT == &floatformat_i387_ext) && TARGET_LONG_DOUBLE_FORMAT == &floatformat_i387_ext)
{ {
@ -870,7 +869,10 @@ i386_store_return_value (struct type *type, char *valbuf)
return; return;
} }
/* Floating-point return values can be found in %st(0). */ /* Returning floating-point values is a bit tricky. Apart from
storing the return value in %st(0), we have to simulate the
state of the FPU at function return point. */
if (len == TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT if (len == TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT
&& TARGET_LONG_DOUBLE_FORMAT == &floatformat_i387_ext) && TARGET_LONG_DOUBLE_FORMAT == &floatformat_i387_ext)
{ {
@ -884,7 +886,7 @@ i386_store_return_value (struct type *type, char *valbuf)
DOUBLEST val; DOUBLEST val;
/* Convert the value found in VALBUF to the extended /* Convert the value found in VALBUF to the extended
floating point format used by the FPU. This is probably floating-point format used by the FPU. This is probably
not exactly how it would happen on the target itself, but not exactly how it would happen on the target itself, but
it is the best we can do. */ it is the best we can do. */
val = extract_floating (valbuf, TYPE_LENGTH (type)); val = extract_floating (valbuf, TYPE_LENGTH (type));
@ -893,14 +895,17 @@ i386_store_return_value (struct type *type, char *valbuf)
FPU_REG_RAW_SIZE); FPU_REG_RAW_SIZE);
} }
/* Set the top of the floating point register stack to 7. That /* Set the top of the floating-point register stack to 7. The
makes sure that FP0 (which we set above) is indeed %st(0). actual value doesn't really matter, but 7 is what a normal
FIXME: Perhaps we should completely reset the status word? */ function return would end up with if the program started out
with a freshly initialized FPU. */
fstat = read_register (FSTAT_REGNUM); fstat = read_register (FSTAT_REGNUM);
fstat |= (7 << 11); fstat |= (7 << 11);
write_register (FSTAT_REGNUM, fstat); write_register (FSTAT_REGNUM, fstat);
/* Mark %st(1) through %st(7) as empty. */ /* Mark %st(1) through %st(7) as empty. Since we set the top of
the floating-point register stack to 7, the appropriate value
for the tag word is 0x3fff. */
write_register (FTAG_REGNUM, 0x3fff); write_register (FTAG_REGNUM, 0x3fff);
} }
else else