*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / i386v4-nat.c
index 3ed273e7b1320bd1939b17c842f889e5ef146983..33dbde89ac6565bbbcc3832744b50f34b4d5aa61 100644 (file)
@@ -1,5 +1,6 @@
 /* Native-dependent code for SVR4 Unix running on i386's, for GDB.
-   Copyright 1988, 1989, 1991, 1992, 1996, 1998 Free Software Foundation, Inc.
+   Copyright 1988, 1989, 1991, 1992, 1996, 1997, 1998, 1999, 2000, 2001
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "defs.h"
 #include "value.h"
 #include "inferior.h"
+#include "regcache.h"
 
 #ifdef HAVE_SYS_REG_H
 #include <sys/reg.h>
 #endif
+#include "i387-nat.h"
 
 
 #ifdef HAVE_SYS_PROCFS_H
@@ -92,13 +95,13 @@ static int regmap[] =
 
 /* Prototypes for local functions */
 
-void fill_gregset PARAMS ((gregset_t *, int));
+void fill_gregset (gregset_t *, int);
 
-void supply_gregset PARAMS ((gregset_t *));
+void supply_gregset (gregset_t *);
 
-void supply_fpregset PARAMS ((fpregset_t *));
+void supply_fpregset (fpregset_t *);
 
-void fill_fpregset PARAMS ((fpregset_t *, int));
+void fill_fpregset (fpregset_t *, int);
 
 
 /*  FIXME:  These routine absolutely depends upon (NUM_REGS - NUM_FREGS)
@@ -112,8 +115,7 @@ void fill_fpregset PARAMS ((fpregset_t *, int));
    register values. */
 
 void
-supply_gregset (gregsetp)
-     gregset_t *gregsetp;
+supply_gregset (gregset_t *gregsetp)
 {
   register int regi;
   register greg_t *regp = (greg_t *) gregsetp;
@@ -126,9 +128,7 @@ supply_gregset (gregsetp)
 }
 
 void
-fill_gregset (gregsetp, regno)
-     gregset_t *gregsetp;
-     int regno;
+fill_gregset (gregset_t *gregsetp, int regno)
 {
   int regi;
   register greg_t *regp = (greg_t *) gregsetp;
@@ -152,58 +152,17 @@ fill_gregset (gregsetp, regno)
    idea of the current floating point register values. */
 
 /* FIXME: Assumes that fpregsetp contains an i387 FSAVE area. */
-static const int freg_offset_map[] =
-{
 #if !defined(FPREGSET_FSAVE_OFFSET)
 #define FPREGSET_FSAVE_OFFSET  0
 #endif
-  FPREGSET_FSAVE_OFFSET + 28 + 0 * 10,
-  FPREGSET_FSAVE_OFFSET + 28 + 1 * 10,
-  FPREGSET_FSAVE_OFFSET + 28 + 2 * 10,
-  FPREGSET_FSAVE_OFFSET + 28 + 3 * 10,
-  FPREGSET_FSAVE_OFFSET + 28 + 4 * 10,
-  FPREGSET_FSAVE_OFFSET + 28 + 5 * 10,
-  FPREGSET_FSAVE_OFFSET + 28 + 6 * 10,
-  FPREGSET_FSAVE_OFFSET + 28 + 7 * 10,
-  FPREGSET_FSAVE_OFFSET + 0,
-  FPREGSET_FSAVE_OFFSET + 4,
-  FPREGSET_FSAVE_OFFSET + 8,
-  FPREGSET_FSAVE_OFFSET + 16,
-  FPREGSET_FSAVE_OFFSET + 12,
-  FPREGSET_FSAVE_OFFSET + 24,
-  FPREGSET_FSAVE_OFFSET + 20,
-  FPREGSET_FSAVE_OFFSET + 16
-};
 
 void
-supply_fpregset (fpregsetp)
-     fpregset_t *fpregsetp;
+supply_fpregset (fpregset_t *fpregsetp)
 {
-  int regi;
-  
   if (NUM_FREGS == 0)
     return;
-  for (regi = FP0_REGNUM; regi <= LAST_FPU_CTRL_REGNUM; regi++)
-    {
-      char tbuf[4];
-      ULONGEST tval;
-      char *from = (char *) fpregsetp + freg_offset_map[regi - FP0_REGNUM];
 
-      if (regi == FCS_REGNUM)
-       {
-         tval = extract_unsigned_integer (from, 4) & 0xffff;
-         store_unsigned_integer (tbuf, 4, tval);
-         supply_register (regi, tbuf);
-       }
-      else if (regi == FOP_REGNUM)
-       {
-         tval = (extract_unsigned_integer (from, 4) >> 16) & ((1 << 11) - 1);
-         store_unsigned_integer (tbuf, 4, tval);
-         supply_register (regi, tbuf);
-       }
-      else
-       supply_register (regi, from);
-    }
+  i387_supply_fsave ((char *) fpregsetp + FPREGSET_FSAVE_OFFSET);
 }
 
 /*  Given a pointer to a floating point register set in /proc format
@@ -212,43 +171,12 @@ supply_fpregset (fpregsetp)
    them all. */
 
 void
-fill_fpregset (fpregsetp, regno)
-     fpregset_t *fpregsetp;
-     int regno;
+fill_fpregset (fpregset_t *fpregsetp, int regno)
 {
-  int regi;
-
   if (NUM_FREGS == 0)
     return;
-  for (regi = FP0_REGNUM; regi <= LAST_FPU_CTRL_REGNUM; regi++)
-    {
-      if ((regno == -1) || (regno == regi))
-       {
-         char *to = (char *) fpregsetp + freg_offset_map[regi - FP0_REGNUM];
-         char *from = (char *) &registers[REGISTER_BYTE (regi)];
-         ULONGEST valto;
-         ULONGEST valfrom;
-
-         if (regi == FCS_REGNUM)
-           {
-             valto = extract_unsigned_integer (to, 4);
-             valfrom = extract_unsigned_integer (from, 4);
-             valto = (valto & ~0xffff) | (valfrom & 0xffff);
-             store_unsigned_integer (to, 4, valto);
-           }
-         else if (regi == FOP_REGNUM)
-           {
-             valto = extract_unsigned_integer (to, 4);
-             valfrom = extract_unsigned_integer (from, 4);
-             valto = (valto & 0xffff) | ((valfrom & ((1 << 11) - 1)) << 16);
-             store_unsigned_integer (to, 4, valto);
-           }
-         else
-           {
-             memcpy (to, from, REGISTER_RAW_SIZE (regi));
-           }
-       }
-    }
+
+  i387_fill_fsave ((char *) fpregsetp + FPREGSET_FSAVE_OFFSET, regno);
 }
 
 #endif /* defined (HAVE_FPREGSET_T) */
This page took 0.028661 seconds and 4 git commands to generate.