summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2001-07-28 16:48:59 +0000
committerMark Kettenis <kettenis@gnu.org>2001-07-28 16:48:59 +0000
commit2840dd75f40c618328df95359c30921c103e8a2b (patch)
tree3c06326977bbc435cdb69924e4ce069324e86fd0
parent24d19aaf4a5e6a5c6b0211666f73d784aeeacdaf (diff)
downloadgdb-2840dd75f40c618328df95359c30921c103e8a2b.tar.gz
* 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.
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/i386-tdep.c30
2 files changed, 31 insertions, 8 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0f1b56cf1a1..51c77275fdf 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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.
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index 57a2bd3b0ff..60ca84ed998 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -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);
}