* i386-tdep.c: Include "gdb_assert.h"

(i386_register_convert_to_virtual): Fix such that it can handle
conversion to any floating-point type.  Assert that we are dealing
with a floating-point first.
(i386_register_convert_to_raw): Assert that TYPE is a
floating-point type with length 12.
This commit is contained in:
Mark Kettenis 2001-07-28 16:48:59 +00:00
parent d708bcbabb
commit 3d2615808f
2 changed files with 31 additions and 8 deletions

View File

@ -1,3 +1,12 @@
2001-07-28 Mark Kettenis <kettenis@gnu.org>
* i386-tdep.c: Include "gdb_assert.h"
(i386_register_convert_to_virtual): Fix such that it can handle
conversion to any floating-point type. Assert that we are dealing
with a floating-point first.
(i386_register_convert_to_raw): Assert that TYPE is a
floating-point type with length 12.
2001-07-27 John R. Moore <jmoore@redhat.com>
* configure.in: Added dependency of gdb on tcl/tk libraries.

View File

@ -33,6 +33,8 @@
#include "arch-utils.h"
#include "regcache.h"
#include "gdb_assert.h"
/* i386_register_byte[i] is the offset into the register file of the
start of register number i. We initialize this from
i386_register_raw_size. */
@ -972,27 +974,39 @@ i386_register_convertible (int regnum)
}
/* Convert data from raw format for register REGNUM in buffer FROM to
virtual format with type TYPE in buffer TO. In principle both
formats are identical except that the virtual format has two extra
bytes appended that aren't used. We set these to zero. */
virtual format with type TYPE in buffer TO. */
void
i386_register_convert_to_virtual (int regnum, struct type *type,
char *from, char *to)
{
/* Copy straight over, but take care of the padding. */
memcpy (to, from, FPU_REG_RAW_SIZE);
memset (to + FPU_REG_RAW_SIZE, 0, TYPE_LENGTH (type) - FPU_REG_RAW_SIZE);
char buf[12];
DOUBLEST d;
/* We only support floating-point values. */
gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
/* First add the necessary padding. */
memcpy (buf, from, FPU_REG_RAW_SIZE);
memset (buf + FPU_REG_RAW_SIZE, 0, sizeof buf - FPU_REG_RAW_SIZE);
/* Convert to TYPE. This should be a no-op, if TYPE is equivalent
to the extended floating-point format used by the FPU. */
d = extract_floating (buf, sizeof buf);
store_floating (to, TYPE_LENGTH (type), d);
}
/* Convert data from virtual format with type TYPE in buffer FROM to
raw format for register REGNUM in buffer TO. Simply omit the two
unused bytes. */
raw format for register REGNUM in buffer TO. */
void
i386_register_convert_to_raw (struct type *type, int regnum,
char *from, char *to)
{
gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT
&& TYPE_LENGTH (type) == 12);
/* Simply omit the two unused bytes. */
memcpy (to, from, FPU_REG_RAW_SIZE);
}