2003-11-22 Jakub Jelinek <jakub@redhat.com>
[deliverable/binutils-gdb.git] / gdb / mips-tdep.c
index 959d9c6a1e59f4c73a9365533c7f3097fe3e3480..ae1b1c418b97c0f71e309d994ca4407f8002472b 100644 (file)
@@ -135,8 +135,29 @@ struct gdbarch_tdep
     int mips_fp_register_double;
     int mips_default_stack_argsize;
     int default_mask_address_p;
+    /* Is the target using 64-bit raw integer registers but only
+       storing a left-aligned 32-bit value in each?  */
+    int mips64_transfers_32bit_regs_p;
+    /* Indexes for various registers.  IRIX and embedded have
+       different values.  This contains the "public" fields.  Don't
+       add any that do not need to be public.  */
+    const struct mips_regnum *regnum;
+    /* Register names table for the current register set.  */
+    const char **mips_processor_reg_names;
   };
 
+const struct mips_regnum *
+mips_regnum (struct gdbarch *gdbarch)
+{
+  return gdbarch_tdep (gdbarch)->regnum;
+}
+
+static int
+mips_fpa0_regnum (struct gdbarch *gdbarch)
+{
+  return mips_regnum (gdbarch)->fp0 + 12;
+}
+
 #define MIPS_EABI (gdbarch_tdep (current_gdbarch)->mips_abi == MIPS_ABI_EABI32 \
                   || gdbarch_tdep (current_gdbarch)->mips_abi == MIPS_ABI_EABI64)
 
@@ -180,9 +201,9 @@ unmake_mips16_addr (CORE_ADDR addr)
 static LONGEST
 read_signed_register (int regnum)
 {
-  void *buf = alloca (DEPRECATED_REGISTER_RAW_SIZE (regnum));
+  void *buf = alloca (register_size (current_gdbarch, regnum));
   deprecated_read_register_gen (regnum, buf);
-  return (extract_signed_integer (buf, DEPRECATED_REGISTER_RAW_SIZE (regnum)));
+  return (extract_signed_integer (buf, register_size (current_gdbarch, regnum)));
 }
 
 static LONGEST
@@ -275,7 +296,7 @@ mips_xfer_register (struct regcache *regcache, int reg_num, int length,
   switch (endian)
     {
     case BFD_ENDIAN_BIG:
-      reg_offset = DEPRECATED_REGISTER_RAW_SIZE (reg_num) - length;
+      reg_offset = register_size (current_gdbarch, reg_num) - length;
       break;
     case BFD_ENDIAN_LITTLE:
       reg_offset = 0;
@@ -321,7 +342,7 @@ mips2_fp_compat (void)
 {
   /* MIPS1 and MIPS2 have only 32 bit FPRs, and the FR bit is not
      meaningful.  */
-  if (DEPRECATED_REGISTER_RAW_SIZE (FP0_REGNUM) == 4)
+  if (register_size (current_gdbarch, mips_regnum (current_gdbarch)->fp0) == 4)
     return 0;
 
 #if 0
@@ -374,10 +395,6 @@ static CORE_ADDR heuristic_proc_start (CORE_ADDR);
 
 static CORE_ADDR read_next_frame_reg (struct frame_info *, int);
 
-static int mips_set_processor_type (char *);
-
-static void mips_show_processor_type_command (char *, int);
-
 static void reinit_frame_cache_sfunc (char *, int, struct cmd_list_element *);
 
 static mips_extra_func_info_t find_proc_desc (CORE_ADDR pc,
@@ -390,32 +407,71 @@ static CORE_ADDR after_prologue (CORE_ADDR pc,
 static struct type *mips_float_register_type (void);
 static struct type *mips_double_register_type (void);
 
-/* This value is the model of MIPS in use.  It is derived from the value
-   of the PrID register.  */
-
-char *mips_processor_type;
-
-char *tmp_mips_processor_type;
-
 /* The list of available "set mips " and "show mips " commands */
 
 static struct cmd_list_element *setmipscmdlist = NULL;
 static struct cmd_list_element *showmipscmdlist = NULL;
 
-/* A set of original names, to be used when restoring back to generic
-   registers from a specific set.  */
-static char *mips_generic_reg_names[] = MIPS_REGISTER_NAMES;
-
 /* Integer registers 0 thru 31 are handled explicitly by
    mips_register_name().  Processor specific registers 32 and above
-   are listed in the sets of register names assigned to
-   mips_processor_reg_names.  */
-static char **mips_processor_reg_names = mips_generic_reg_names;
+   are listed in the followign tables.  */
+
+enum { NUM_MIPS_PROCESSOR_REGS = (90 - 32) };
+
+/* Generic MIPS.  */
+
+static const char *mips_generic_reg_names[NUM_MIPS_PROCESSOR_REGS] = {
+  "sr",        "lo",   "hi",   "bad",  "cause","pc",
+  "f0",   "f1",   "f2",   "f3",   "f4",   "f5",   "f6",   "f7",
+  "f8",   "f9",   "f10",  "f11",  "f12",  "f13",  "f14",  "f15",
+  "f16",  "f17",  "f18",  "f19",  "f20",  "f21",  "f22",  "f23",
+  "f24",  "f25",  "f26",  "f27",  "f28",  "f29",  "f30",  "f31",
+  "fsr",  "fir",  ""/*"fp"*/,  "",
+  "",  "",     "",     "",     "",     "",     "",     "",
+  "",  "",     "",     "",     "",     "",     "",     "",
+};
+
+/* Names of IDT R3041 registers.  */
+
+static const char *mips_r3041_reg_names[] = {
+  "sr",        "lo",   "hi",   "bad",  "cause","pc",
+  "f0",   "f1",   "f2",   "f3",   "f4",   "f5",   "f6",   "f7",
+  "f8",   "f9",   "f10",  "f11",  "f12",  "f13",  "f14",  "f15",
+  "f16",  "f17",  "f18",  "f19",  "f20",  "f21",  "f22",  "f23",
+  "f24",  "f25",  "f26",  "f27",  "f28",  "f29",  "f30",  "f31",
+  "fsr",  "fir",  "",/*"fp"*/  "",
+  "",  "",     "bus",  "ccfg", "",     "",     "",     "",
+  "",  "",     "port", "cmp",  "",     "",     "epc",  "prid",
+};
+
+/* Names of tx39 registers.  */
+
+static const char *mips_tx39_reg_names[NUM_MIPS_PROCESSOR_REGS] = {
+  "sr",        "lo",   "hi",   "bad",  "cause","pc",
+  "",   "",    "",     "",     "",     "",     "",     "",
+  "",   "",    "",     "",     "",     "",     "",     "",
+  "",          "",     "",     "",     "",     "",     "",     "",
+  "",          "",     "",     "",     "",     "",     "",     "",
+  "",          "",     "",     "",
+  "",  "",     "",     "",     "",     "",     "",     "",
+  "",  "", "config", "cache", "debug", "depc", "epc",  ""
+};
+
+/* Names of IRIX registers.  */
+static const char *mips_irix_reg_names[NUM_MIPS_PROCESSOR_REGS] = {
+  "f0",   "f1",   "f2",   "f3",   "f4",   "f5",   "f6",   "f7",
+  "f8",   "f9",   "f10",  "f11",  "f12",  "f13",  "f14",  "f15",
+  "f16",  "f17",  "f18",  "f19",  "f20",  "f21",  "f22",  "f23",
+  "f24",  "f25",  "f26",  "f27",  "f28",  "f29",  "f30",  "f31",
+  "pc",        "cause", "bad", "hi",   "lo",   "fsr",  "fir"
+};
+
 
 /* Return the name of the register corresponding to REGNO.  */
 static const char *
 mips_register_name (int regno)
 {
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
   /* GPR names for all ABIs other than n32/n64.  */
   static char *mips_gpr_names[] = {
     "zero", "at",   "v0",   "v1",   "a0",   "a1",   "a2",   "a3",
@@ -451,79 +507,15 @@ mips_register_name (int regno)
        return mips_gpr_names[rawnum];
     }
   else if (32 <= rawnum && rawnum < NUM_REGS)
-    return mips_processor_reg_names[rawnum - 32];
+    {
+      gdb_assert (rawnum - 32 < NUM_MIPS_PROCESSOR_REGS);
+      return tdep->mips_processor_reg_names[rawnum - 32];
+    }
   else
     internal_error (__FILE__, __LINE__,
                    "mips_register_name: bad register number %d", rawnum);
 }
 
-/* *INDENT-OFF* */
-/* Names of IDT R3041 registers.  */
-
-char *mips_r3041_reg_names[] = {
-       "sr",   "lo",   "hi",   "bad",  "cause","pc",
-       "f0",   "f1",   "f2",   "f3",   "f4",   "f5",   "f6",   "f7",
-       "f8",   "f9",   "f10",  "f11",  "f12",  "f13",  "f14",  "f15",
-       "f16",  "f17",  "f18",  "f19",  "f20",  "f21",  "f22",  "f23",
-       "f24",  "f25",  "f26",  "f27",  "f28",  "f29",  "f30",  "f31",
-       "fsr",  "fir",  "",/*"fp"*/     "",
-       "",     "",     "bus",  "ccfg", "",     "",     "",     "",
-       "",     "",     "port", "cmp",  "",     "",     "epc",  "prid",
-};
-
-/* Names of IDT R3051 registers.  */
-
-char *mips_r3051_reg_names[] = {
-       "sr",   "lo",   "hi",   "bad",  "cause","pc",
-       "f0",   "f1",   "f2",   "f3",   "f4",   "f5",   "f6",   "f7",
-       "f8",   "f9",   "f10",  "f11",  "f12",  "f13",  "f14",  "f15",
-       "f16",  "f17",  "f18",  "f19",  "f20",  "f21",  "f22",  "f23",
-       "f24",  "f25",  "f26",  "f27",  "f28",  "f29",  "f30",  "f31",
-       "fsr",  "fir",  ""/*"fp"*/,     "",
-       "inx",  "rand", "elo",  "",     "ctxt", "",     "",     "",
-       "",     "",     "ehi",  "",     "",     "",     "epc",  "prid",
-};
-
-/* Names of IDT R3081 registers.  */
-
-char *mips_r3081_reg_names[] = {
-       "sr",   "lo",   "hi",   "bad",  "cause","pc",
-       "f0",   "f1",   "f2",   "f3",   "f4",   "f5",   "f6",   "f7",
-       "f8",   "f9",   "f10",  "f11",  "f12",  "f13",  "f14",  "f15",
-       "f16",  "f17",  "f18",  "f19",  "f20",  "f21",  "f22",  "f23",
-       "f24",  "f25",  "f26",  "f27",  "f28",  "f29",  "f30",  "f31",
-       "fsr",  "fir",  ""/*"fp"*/,     "",
-       "inx",  "rand", "elo",  "cfg",  "ctxt", "",     "",     "",
-       "",     "",     "ehi",  "",     "",     "",     "epc",  "prid",
-};
-
-/* Names of LSI 33k registers.  */
-
-char *mips_lsi33k_reg_names[] = {
-       "epc",  "hi",   "lo",   "sr",   "cause","badvaddr",
-       "dcic", "bpc",  "bda",  "",     "",     "",     "",      "",
-       "",     "",     "",     "",     "",     "",     "",      "",
-       "",     "",     "",     "",     "",     "",     "",      "",
-       "",     "",     "",     "",     "",     "",     "",      "",
-       "",     "",     "",     "",
-       "",     "",     "",     "",     "",     "",     "",      "",
-       "",     "",     "",     "",     "",     "",     "",      "",
-};
-
-struct {
-  char *name;
-  char **regnames;
-} mips_processor_type_table[] = {
-  { "generic", mips_generic_reg_names },
-  { "r3041", mips_r3041_reg_names },
-  { "r3051", mips_r3051_reg_names },
-  { "r3071", mips_r3081_reg_names },
-  { "r3081", mips_r3081_reg_names },
-  { "lsi33k", mips_lsi33k_reg_names },
-  { NULL, NULL }
-};
-/* *INDENT-ON* */
-
 /* Return the groups that a MIPS register can be categorised into.  */
 
 static int
@@ -617,74 +609,25 @@ struct linked_proc_info
  *linked_proc_desc_table = NULL;
 
 /* Number of bytes of storage in the actual machine representation for
-   register N.  NOTE: This indirectly defines the register size
-   transfered by the GDB protocol.  */
+   register N.  NOTE: This defines the pseudo register type so need to
+   rebuild the architecture vector.  */
 
 static int mips64_transfers_32bit_regs_p = 0;
 
-static int
-mips_register_raw_size (int regnum)
-{
-  gdb_assert (regnum >= 0);
-  if (regnum < NUM_REGS)
-    {
-      /* For compatibility with old code, implemnt the broken register raw
-        size map for the raw registers.
-
-        NOTE: cagney/2003-06-15: This is so bogus.  The register's
-        raw size is changing according to the ABI
-        (FP_REGISTER_DOUBLE).  Also, GDB's protocol is defined by a
-        combination of DEPRECATED_REGISTER_RAW_SIZE and
-        DEPRECATED_REGISTER_BYTE.  */
-      if (mips64_transfers_32bit_regs_p)
-       return register_size (current_gdbarch, regnum);
-      else if (regnum >= FP0_REGNUM && regnum < FP0_REGNUM + 32
-              && FP_REGISTER_DOUBLE)
-       /* For MIPS_ABI_N32 (for example) we need 8 byte floating point
-          registers.  */
-       return 8;
-      else
-       return mips_regsize (current_gdbarch);
-    }
-  else if (regnum < 2 * NUM_REGS)
-    {
-      /* For the moment map [NUM_REGS .. 2*NUM_REGS) onto the same raw
-        registers, but return the register's virtual size.  */
-      return TYPE_LENGTH (gdbarch_register_type (current_gdbarch, regnum));
-    }
-  else
-    internal_error (__FILE__, __LINE__, "Register %d out of range", regnum);
-}
-
-/* Register offset in a buffer for each register.
-
-   FIXME: cagney/2003-06-15: This is so bogus.  Instead REGISTER_TYPE
-   should strictly return the layout of the buffer.  Unfortunately
-   remote.c and the MIPS have come to rely on a custom layout that
-   doesn't 1:1 map onto the register type.  */
-
-static int
-mips_register_byte (int regnum)
+static void
+set_mips64_transfers_32bit_regs (char *args, int from_tty,
+                                struct cmd_list_element *c)
 {
-  gdb_assert (regnum >= 0);
-  if (regnum < NUM_REGS)
-    /* Pick up the relevant per-tm file register byte method.  */
-    return MIPS_REGISTER_BYTE (regnum);
-  else if (regnum < 2 * NUM_REGS)
+  struct gdbarch_info info;
+  gdbarch_info_init (&info);
+  /* FIXME: cagney/2003-11-15: Should be setting a field in "info"
+     instead of relying on globals.  Doing that would let generic code
+     handle the search for this specific architecture.  */
+  if (!gdbarch_update_p (info))
     {
-      int reg;
-      int byte;
-      /* Start with the end of the raw register buffer - assum that
-        MIPS_REGISTER_BYTE (NUM_REGS) returns that end.  */
-      byte = MIPS_REGISTER_BYTE (NUM_REGS);
-      /* Add space for all the proceeding registers based on their
-         real size.  */
-      for (reg = NUM_REGS; reg < regnum; reg++)
-       byte += TYPE_LENGTH (gdbarch_register_type (current_gdbarch, reg));
-      return byte;
+      mips64_transfers_32bit_regs_p = 0;
+      error ("32-bit compatibility mode not supported");
     }
-  else
-    internal_error (__FILE__, __LINE__, "Register %d out of range", regnum);
 }
 
 /* Convert between RAW and VIRTUAL registers.  The RAW register size
@@ -693,10 +636,10 @@ mips_register_byte (int regnum)
 static int
 mips_register_convertible (int reg_nr)
 {
-  if (mips64_transfers_32bit_regs_p)
+  if (gdbarch_tdep (current_gdbarch)->mips64_transfers_32bit_regs_p)
     return 0;
   else
-    return (DEPRECATED_REGISTER_RAW_SIZE (reg_nr) > register_size (current_gdbarch, reg_nr));
+    return (register_size (current_gdbarch, reg_nr) > register_size (current_gdbarch, reg_nr));
 }
 
 static void
@@ -705,7 +648,7 @@ mips_register_convert_to_virtual (int n, struct type *virtual_type,
 {
   if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
     memcpy (virt_buf,
-           raw_buf + (DEPRECATED_REGISTER_RAW_SIZE (n) - TYPE_LENGTH (virtual_type)),
+           raw_buf + (register_size (current_gdbarch, n) - TYPE_LENGTH (virtual_type)),
            TYPE_LENGTH (virtual_type));
   else
     memcpy (virt_buf,
@@ -717,9 +660,9 @@ static void
 mips_register_convert_to_raw (struct type *virtual_type, int n,
                              const char *virt_buf, char *raw_buf)
 {
-  memset (raw_buf, 0, DEPRECATED_REGISTER_RAW_SIZE (n));
+  memset (raw_buf, 0, register_size (current_gdbarch, n));
   if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
-    memcpy (raw_buf + (DEPRECATED_REGISTER_RAW_SIZE (n) - TYPE_LENGTH (virtual_type)),
+    memcpy (raw_buf + (register_size (current_gdbarch, n) - TYPE_LENGTH (virtual_type)),
            virt_buf,
            TYPE_LENGTH (virtual_type));
   else
@@ -732,8 +675,8 @@ static int
 mips_convert_register_p (int regnum, struct type *type)
 {
   return (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
-         && DEPRECATED_REGISTER_RAW_SIZE (regnum) == 4
-         && (regnum) >= FP0_REGNUM && (regnum) < FP0_REGNUM + 32
+         && register_size (current_gdbarch, regnum) == 4
+         && (regnum) >= mips_regnum (current_gdbarch)->fp0 && (regnum) < mips_regnum (current_gdbarch)->fp0 + 32
          && TYPE_CODE(type) == TYPE_CODE_FLT
          && TYPE_LENGTH(type) == 8);
 }
@@ -761,8 +704,8 @@ static struct type *
 mips_register_type (struct gdbarch *gdbarch, int regnum)
 {
   gdb_assert (regnum >= 0 && regnum < 2 * NUM_REGS);
-  if ((regnum % NUM_REGS) >= FP0_REGNUM
-      && (regnum % NUM_REGS) < FP0_REGNUM + 32)
+  if ((regnum % NUM_REGS) >= mips_regnum (current_gdbarch)->fp0
+      && (regnum % NUM_REGS) < mips_regnum (current_gdbarch)->fp0 + 32)
     {
       /* The floating-point registers raw, or cooked, always match
          mips_regsize(), and also map 1:1, byte for byte.  */
@@ -783,11 +726,17 @@ mips_register_type (struct gdbarch *gdbarch, int regnum)
          internal_error (__FILE__, __LINE__, "bad switch");
        }
     }
-  else if (regnum >= (NUM_REGS + FCRCS_REGNUM)
+  else if (regnum >= (NUM_REGS + mips_regnum (current_gdbarch)->fp_control_status)
           && regnum <= NUM_REGS + LAST_EMBED_REGNUM)
     /* The pseudo/cooked view of the embedded registers is always
        32-bit.  The raw view is handled below.  */
     return builtin_type_int32;
+  else if (regnum >= NUM_REGS && mips_regsize (gdbarch)
+          && gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p)
+    /* The target, while using a 64-bit register buffer, is only
+       transfering 32-bits of each integer register.  Reflect this in
+       the cooked/pseudo register value.  */
+    return builtin_type_int32;
   else if (mips_regsize (gdbarch) == 8)
     /* 64-bit ISA.  */
     return builtin_type_int64;
@@ -1105,7 +1054,7 @@ mips32_next_pc (CORE_ADDR pc)
        {
          int tf = itype_rt (inst) & 0x01;
          int cnum = itype_rt (inst) >> 2;
-         int fcrcs = read_signed_register (FCRCS_REGNUM);
+         int fcrcs = read_signed_register (mips_regnum (current_gdbarch)->fp_control_status);
          int cond = ((fcrcs >> 24) & 0x0e) | ((fcrcs >> 23) & 0x01);
 
          if (((cond >> cnum) & 0x01) == tf)
@@ -1589,7 +1538,7 @@ mips_find_saved_regs (struct frame_info *fci)
          CORE_ADDR reg_position = (get_frame_base (fci)
                                    + SIGFRAME_FPREGSAVE_OFF
                                    + ireg * SIGFRAME_REG_SIZE);
-         set_reg_offset (saved_regs, FP0_REGNUM + ireg, reg_position);
+         set_reg_offset (saved_regs, mips_regnum (current_gdbarch)->fp0 + ireg, reg_position);
        }
 
       set_reg_offset (saved_regs, PC_REGNUM, get_frame_base (fci) + SIGFRAME_PC_OFF);
@@ -1737,14 +1686,14 @@ mips_find_saved_regs (struct frame_info *fci)
                 reg_position is decremented each time through the
                 loop).  */
              if ((ireg & 1))
-               set_reg_offset (saved_regs, FP0_REGNUM + ireg,
+               set_reg_offset (saved_regs, mips_regnum (current_gdbarch)->fp0 + ireg,
                                reg_position - MIPS_SAVED_REGSIZE);
              else
-               set_reg_offset (saved_regs, FP0_REGNUM + ireg,
+               set_reg_offset (saved_regs, mips_regnum (current_gdbarch)->fp0 + ireg,
                                reg_position + MIPS_SAVED_REGSIZE);
            }
          else
-           set_reg_offset (saved_regs, FP0_REGNUM + ireg, reg_position);
+           set_reg_offset (saved_regs, mips_regnum (current_gdbarch)->fp0 + ireg, reg_position);
          reg_position -= MIPS_SAVED_REGSIZE;
        }
 
@@ -2844,7 +2793,7 @@ mips_eabi_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
 
   /* Initialize the integer and float register pointers.  */
   argreg = A0_REGNUM;
-  float_argreg = FPA0_REGNUM;
+  float_argreg = mips_fpa0_regnum (current_gdbarch);
 
   /* The struct_return pointer occupies the first parameter-passing reg.  */
   if (struct_return)
@@ -3105,7 +3054,7 @@ mips_n32n64_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
 
   /* Initialize the integer and float register pointers.  */
   argreg = A0_REGNUM;
-  float_argreg = FPA0_REGNUM;
+  float_argreg = mips_fpa0_regnum (current_gdbarch);
 
   /* The struct_return pointer occupies the first parameter-passing reg.  */
   if (struct_return)
@@ -3337,7 +3286,7 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
 
   /* Initialize the integer and float register pointers.  */
   argreg = A0_REGNUM;
-  float_argreg = FPA0_REGNUM;
+  float_argreg = mips_fpa0_regnum (current_gdbarch);
 
   /* The struct_return pointer occupies the first parameter-passing reg.  */
   if (struct_return)
@@ -3646,7 +3595,7 @@ mips_o64_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
 
   /* Initialize the integer and float register pointers.  */
   argreg = A0_REGNUM;
-  float_argreg = FPA0_REGNUM;
+  float_argreg = mips_fpa0_regnum (current_gdbarch);
 
   /* The struct_return pointer occupies the first parameter-passing reg.  */
   if (struct_return)
@@ -3936,7 +3885,7 @@ mips_pop_frame (void)
        /* Floating point registers must not be sign extended, 
           in case MIPS_SAVED_REGSIZE = 4 but sizeof (FP0_REGNUM) == 8.  */
 
-       if (FP0_REGNUM <= regnum && regnum < FP0_REGNUM + 32)
+       if (mips_regnum (current_gdbarch)->fp0 <= regnum && regnum < mips_regnum (current_gdbarch)->fp0 + 32)
          write_register (regnum,
                          read_memory_unsigned_integer (deprecated_get_frame_saved_regs (frame)[regnum],
                                                        MIPS_SAVED_REGSIZE));
@@ -3971,14 +3920,14 @@ mips_pop_frame (void)
 
       xfree (pi_ptr);
 
-      write_register (HI_REGNUM,
+      write_register (mips_regnum (current_gdbarch)->hi,
                      read_memory_integer (new_sp - 2 * MIPS_SAVED_REGSIZE,
                                           MIPS_SAVED_REGSIZE));
-      write_register (LO_REGNUM,
+      write_register (mips_regnum (current_gdbarch)->lo,
                      read_memory_integer (new_sp - 3 * MIPS_SAVED_REGSIZE,
                                           MIPS_SAVED_REGSIZE));
       if (MIPS_FPU_TYPE != MIPS_FPU_NONE)
-       write_register (FCRCS_REGNUM,
+       write_register (mips_regnum (current_gdbarch)->fp_control_status,
                        read_memory_integer (new_sp - 4 * MIPS_SAVED_REGSIZE,
                                             MIPS_SAVED_REGSIZE));
     }
@@ -4039,7 +3988,7 @@ static void
 mips_read_fp_register_single (struct frame_info *frame, int regno,
                              char *rare_buffer)
 {
-  int raw_size = DEPRECATED_REGISTER_RAW_SIZE (regno);
+  int raw_size = register_size (current_gdbarch, regno);
   char *raw_buffer = alloca (raw_size);
 
   if (!frame_register_read (frame, regno, raw_buffer))
@@ -4071,7 +4020,7 @@ static void
 mips_read_fp_register_double (struct frame_info *frame, int regno,
                              char *rare_buffer)
 {
-  int raw_size = DEPRECATED_REGISTER_RAW_SIZE (regno);
+  int raw_size = register_size (current_gdbarch, regno);
 
   if (raw_size == 8 && !mips2_fp_compat ())
     {
@@ -4082,7 +4031,7 @@ mips_read_fp_register_double (struct frame_info *frame, int regno,
     }
   else
     {
-      if ((regno - FP0_REGNUM) & 1)
+      if ((regno - mips_regnum (current_gdbarch)->fp0) & 1)
        internal_error (__FILE__, __LINE__,
                        "mips_read_fp_register_double: bad access to "
                        "odd-numbered FP register");
@@ -4110,13 +4059,13 @@ mips_print_fp_register (struct ui_file *file, struct frame_info *frame,
   double doub, flt1, flt2;     /* doubles extracted from raw hex data */
   int inv1, inv2, namelen;
 
-  raw_buffer = (char *) alloca (2 * DEPRECATED_REGISTER_RAW_SIZE (FP0_REGNUM));
+  raw_buffer = (char *) alloca (2 * register_size (current_gdbarch, mips_regnum (current_gdbarch)->fp0));
 
   fprintf_filtered (file, "%s:", REGISTER_NAME (regnum));
   fprintf_filtered (file, "%*s", 4 - (int) strlen (REGISTER_NAME (regnum)),
                    "");
 
-  if (DEPRECATED_REGISTER_RAW_SIZE (regnum) == 4 || mips2_fp_compat ())
+  if (register_size (current_gdbarch, regnum) == 4 || mips2_fp_compat ())
     {
       /* 4-byte registers: Print hex and floating.  Also print even
          numbered registers as doubles.  */
@@ -4203,7 +4152,7 @@ mips_print_register (struct ui_file *file, struct frame_info *frame,
     fprintf_filtered (file, ": ");
 
   if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
-    offset = DEPRECATED_REGISTER_RAW_SIZE (regnum) - register_size (current_gdbarch, regnum);
+    offset = register_size (current_gdbarch, regnum) - register_size (current_gdbarch, regnum);
   else
     offset = 0;
 
@@ -4278,8 +4227,8 @@ print_gp_register_row (struct ui_file *file, struct frame_info *frame,
        printf_filtered ("  ");
       /* Now print the register value in hex, endian order. */
       if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
-       for (byte = DEPRECATED_REGISTER_RAW_SIZE (regnum) - register_size (current_gdbarch, regnum);
-            byte < DEPRECATED_REGISTER_RAW_SIZE (regnum);
+       for (byte = register_size (current_gdbarch, regnum) - register_size (current_gdbarch, regnum);
+            byte < register_size (current_gdbarch, regnum);
             byte++)
          fprintf_filtered (file, "%02x", (unsigned char) raw_buffer[byte]);
       else
@@ -4618,11 +4567,11 @@ return_value_location (struct type *valtype,
          lo->buf_offset = TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? 4 : 0;
          hi->buf_offset = TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? 0 : 4;
          lo->reg_offset = ((TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
-                            && DEPRECATED_REGISTER_RAW_SIZE (FP0_REGNUM) == 8)
+                            && register_size (current_gdbarch, mips_regnum (current_gdbarch)->fp0) == 8)
                            ? 4 : 0);
          hi->reg_offset = lo->reg_offset;
-         lo->reg = FP0_REGNUM + 0;
-         hi->reg = FP0_REGNUM + 1;
+         lo->reg = mips_regnum (current_gdbarch)->fp0 + 0;
+         hi->reg = mips_regnum (current_gdbarch)->fp0 + 1;
          lo->len = 4;
          hi->len = 4;
        }
@@ -4631,10 +4580,10 @@ return_value_location (struct type *valtype,
          /* The floating point value fits in a single floating-point
             register. */
          lo->reg_offset = ((TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
-                            && DEPRECATED_REGISTER_RAW_SIZE (FP0_REGNUM) == 8
+                            && register_size (current_gdbarch, mips_regnum (current_gdbarch)->fp0) == 8
                             && len == 4)
                            ? 4 : 0);
-         lo->reg = FP0_REGNUM;
+         lo->reg = mips_regnum (current_gdbarch)->fp0;
          lo->len = len;
          lo->buf_offset = 0;
          hi->len = 0;
@@ -4687,7 +4636,7 @@ return_value_location (struct type *valtype,
            }
        }
       if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
-         && DEPRECATED_REGISTER_RAW_SIZE (regnum) == 8
+         && register_size (current_gdbarch, regnum) == 8
          && MIPS_SAVED_REGSIZE == 4)
        {
          /* Account for the fact that only the least-signficant part
@@ -4755,14 +4704,14 @@ mips_eabi_store_return_value (struct type *valtype, char *valbuf)
   memset (raw_buffer, 0, sizeof (raw_buffer));
   memcpy (raw_buffer + lo.reg_offset, valbuf + lo.buf_offset, lo.len);
   deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (lo.reg), raw_buffer,
-                                  DEPRECATED_REGISTER_RAW_SIZE (lo.reg));
+                                  register_size (current_gdbarch, lo.reg));
 
   if (hi.len > 0)
     {
       memset (raw_buffer, 0, sizeof (raw_buffer));
       memcpy (raw_buffer + hi.reg_offset, valbuf + hi.buf_offset, hi.len);
       deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (hi.reg), raw_buffer,
-                                      DEPRECATED_REGISTER_RAW_SIZE (hi.reg));
+                                      register_size (current_gdbarch, hi.reg));
     }
 }
 
@@ -4777,14 +4726,14 @@ mips_o64_store_return_value (struct type *valtype, char *valbuf)
   memset (raw_buffer, 0, sizeof (raw_buffer));
   memcpy (raw_buffer + lo.reg_offset, valbuf + lo.buf_offset, lo.len);
   deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (lo.reg), raw_buffer,
-                                  DEPRECATED_REGISTER_RAW_SIZE (lo.reg));
+                                  register_size (current_gdbarch, lo.reg));
 
   if (hi.len > 0)
     {
       memset (raw_buffer, 0, sizeof (raw_buffer));
       memcpy (raw_buffer + hi.reg_offset, valbuf + hi.buf_offset, hi.len);
       deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (hi.reg), raw_buffer,
-                                      DEPRECATED_REGISTER_RAW_SIZE (hi.reg));
+                                      register_size (current_gdbarch, hi.reg));
     }
 }
 
@@ -4804,7 +4753,7 @@ mips_o32_xfer_return_value (struct type *type,
          least significant part of FP0.  */
       if (mips_debug)
        fprintf_unfiltered (gdb_stderr, "Return float in $fp0\n");
-      mips_xfer_register (regcache, NUM_REGS + FP0_REGNUM, TYPE_LENGTH (type),
+      mips_xfer_register (regcache, NUM_REGS + mips_regnum (current_gdbarch)->fp0, TYPE_LENGTH (type),
                          TARGET_BYTE_ORDER, in, out, 0);
     }
   else if (TYPE_CODE (type) == TYPE_CODE_FLT
@@ -4819,15 +4768,15 @@ mips_o32_xfer_return_value (struct type *type,
       switch (TARGET_BYTE_ORDER)
        {
        case BFD_ENDIAN_LITTLE:
-         mips_xfer_register (regcache, NUM_REGS + FP0_REGNUM + 0, 4,
+         mips_xfer_register (regcache, NUM_REGS + mips_regnum (current_gdbarch)->fp0 + 0, 4,
                              TARGET_BYTE_ORDER, in, out, 0);
-         mips_xfer_register (regcache, NUM_REGS + FP0_REGNUM + 1, 4,
+         mips_xfer_register (regcache, NUM_REGS + mips_regnum (current_gdbarch)->fp0 + 1, 4,
                              TARGET_BYTE_ORDER, in, out, 4);
          break;
        case BFD_ENDIAN_BIG:
-         mips_xfer_register (regcache, NUM_REGS + FP0_REGNUM + 1, 4,
+         mips_xfer_register (regcache, NUM_REGS + mips_regnum (current_gdbarch)->fp0 + 1, 4,
                              TARGET_BYTE_ORDER, in, out, 0);
-         mips_xfer_register (regcache, NUM_REGS + FP0_REGNUM + 0, 4,
+         mips_xfer_register (regcache, NUM_REGS + mips_regnum (current_gdbarch)->fp0 + 0, 4,
                              TARGET_BYTE_ORDER, in, out, 4);
          break;
        default:
@@ -4854,7 +4803,7 @@ mips_o32_xfer_return_value (struct type *type,
       bfd_byte reg[MAX_REGISTER_SIZE];
       int regnum;
       int field;
-      for (field = 0, regnum = FP0_REGNUM;
+      for (field = 0, regnum = mips_regnum (current_gdbarch)->fp0;
           field < TYPE_NFIELDS (type);
           field++, regnum += 2)
        {
@@ -4879,9 +4828,9 @@ mips_o32_xfer_return_value (struct type *type,
       int regnum;
       for (offset = 0, regnum = V0_REGNUM;
           offset < TYPE_LENGTH (type);
-          offset += DEPRECATED_REGISTER_RAW_SIZE (regnum), regnum++)
+          offset += register_size (current_gdbarch, regnum), regnum++)
        {
-         int xfer = DEPRECATED_REGISTER_RAW_SIZE (regnum);
+         int xfer = register_size (current_gdbarch, regnum);
          if (offset + xfer > TYPE_LENGTH (type))
            xfer = TYPE_LENGTH (type) - offset;
          if (mips_debug)
@@ -4945,7 +4894,7 @@ mips_n32n64_xfer_return_value (struct type *type,
          of FP0.  */
       if (mips_debug)
        fprintf_unfiltered (gdb_stderr, "Return float in $fp0\n");
-      mips_xfer_register (regcache, NUM_REGS + FP0_REGNUM, TYPE_LENGTH (type),
+      mips_xfer_register (regcache, NUM_REGS + mips_regnum (current_gdbarch)->fp0, TYPE_LENGTH (type),
                          TARGET_BYTE_ORDER, in, out, 0);
     }
   else if (TYPE_CODE (type) == TYPE_CODE_STRUCT
@@ -4967,7 +4916,7 @@ mips_n32n64_xfer_return_value (struct type *type,
       bfd_byte reg[MAX_REGISTER_SIZE];
       int regnum;
       int field;
-      for (field = 0, regnum = FP0_REGNUM;
+      for (field = 0, regnum = mips_regnum (current_gdbarch)->fp0;
           field < TYPE_NFIELDS (type);
           field++, regnum += 2)
        {
@@ -4990,9 +4939,9 @@ mips_n32n64_xfer_return_value (struct type *type,
       int regnum;
       for (offset = 0, regnum = V0_REGNUM;
           offset < TYPE_LENGTH (type);
-          offset += DEPRECATED_REGISTER_RAW_SIZE (regnum), regnum++)
+          offset += register_size (current_gdbarch, regnum), regnum++)
        {
-         int xfer = DEPRECATED_REGISTER_RAW_SIZE (regnum);
+         int xfer = register_size (current_gdbarch, regnum);
          if (offset + xfer > TYPE_LENGTH (type))
            xfer = TYPE_LENGTH (type) - offset;
          if (mips_debug)
@@ -5010,9 +4959,9 @@ mips_n32n64_xfer_return_value (struct type *type,
       int regnum;
       for (offset = 0, regnum = V0_REGNUM;
           offset < TYPE_LENGTH (type);
-          offset += DEPRECATED_REGISTER_RAW_SIZE (regnum), regnum++)
+          offset += register_size (current_gdbarch, regnum), regnum++)
        {
-         int xfer = DEPRECATED_REGISTER_RAW_SIZE (regnum);
+         int xfer = register_size (current_gdbarch, regnum);
          int pos = 0;
          if (offset + xfer > TYPE_LENGTH (type))
            xfer = TYPE_LENGTH (type) - offset;
@@ -5143,76 +5092,22 @@ set_mipsfpu_auto_command (char *args, int from_tty)
   mips_fpu_type_auto = 1;
 }
 
-/* Command to set the processor type.  */
-
-void
-mips_set_processor_type_command (char *args, int from_tty)
-{
-  int i;
-
-  if (tmp_mips_processor_type == NULL || *tmp_mips_processor_type == '\0')
-    {
-      printf_unfiltered ("The known MIPS processor types are as follows:\n\n");
-      for (i = 0; mips_processor_type_table[i].name != NULL; ++i)
-       printf_unfiltered ("%s\n", mips_processor_type_table[i].name);
-
-      /* Restore the value.  */
-      tmp_mips_processor_type = xstrdup (mips_processor_type);
-
-      return;
-    }
-
-  if (!mips_set_processor_type (tmp_mips_processor_type))
-    {
-      error ("Unknown processor type `%s'.", tmp_mips_processor_type);
-      /* Restore its value.  */
-      tmp_mips_processor_type = xstrdup (mips_processor_type);
-    }
-}
-
-static void
-mips_show_processor_type_command (char *args, int from_tty)
-{
-}
-
-/* Modify the actual processor type. */
-
-static int
-mips_set_processor_type (char *str)
-{
-  int i;
-
-  if (str == NULL)
-    return 0;
-
-  for (i = 0; mips_processor_type_table[i].name != NULL; ++i)
-    {
-      if (strcasecmp (str, mips_processor_type_table[i].name) == 0)
-       {
-         mips_processor_type = str;
-         mips_processor_reg_names = mips_processor_type_table[i].regnames;
-         return 1;
-         /* FIXME tweak fpu flag too */
-       }
-    }
-
-  return 0;
-}
-
 /* Attempt to identify the particular processor model by reading the
-   processor id.  */
+   processor id.  NOTE: cagney/2003-11-15: Firstly it isn't clear that
+   the relevant processor still exists (it dates back to '94) and
+   secondly this is not the way to do this.  The processor type should
+   be set by forcing an architecture change.  */
 
-char *
-mips_read_processor_type (void)
+void
+deprecated_mips_set_processor_regs_hack (void)
 {
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
   CORE_ADDR prid;
 
   prid = read_register (PRID_REGNUM);
 
   if ((prid & ~0xf) == 0x700)
-    return savestring ("r3041", strlen ("r3041"));
-
-  return NULL;
+    tdep->mips_processor_reg_names = mips_r3041_reg_names;
 }
 
 /* Just like reinit_frame_cache, but with the right arguments to be
@@ -5601,11 +5496,11 @@ mips_stab_reg_to_regnum (int num)
   if (num >= 0 && num < 32)
     regnum = num;
   else if (num >= 38 && num < 70)
-    regnum = num + FP0_REGNUM - 38;
+    regnum = num + mips_regnum (current_gdbarch)->fp0 - 38;
   else if (num == 70)
-    regnum = HI_REGNUM;
+    regnum = mips_regnum (current_gdbarch)->hi;
   else if (num == 71)
-    regnum = LO_REGNUM;
+    regnum = mips_regnum (current_gdbarch)->lo;
   else
     /* This will hopefully (eventually) provoke a warning.  Should
        we be calling complaint() here?  */
@@ -5624,11 +5519,11 @@ mips_dwarf_dwarf2_ecoff_reg_to_regnum (int num)
   if (num >= 0 && num < 32)
     regnum = num;
   else if (num >= 32 && num < 64)
-    regnum = num + FP0_REGNUM - 32;
+    regnum = num + mips_regnum (current_gdbarch)->fp0 - 32;
   else if (num == 64)
-    regnum = HI_REGNUM;
+    regnum = mips_regnum (current_gdbarch)->hi;
   else if (num == 65)
-    regnum = LO_REGNUM;
+    regnum = mips_regnum (current_gdbarch)->lo;
   else
     /* This will hopefully (eventually) provoke a warning.  Should we
        be calling complaint() here?  */
@@ -5820,6 +5715,11 @@ mips_gdbarch_init (struct gdbarch_info info,
        continue;
       if (gdbarch_tdep (arches->gdbarch)->mips_abi != mips_abi)
        continue;
+      /* Need to be pedantic about which register virtual size is
+         used.  */
+      if (gdbarch_tdep (arches->gdbarch)->mips64_transfers_32bit_regs_p
+         != mips64_transfers_32bit_regs_p)
+       continue;
       return arches->gdbarch;
     }
 
@@ -5827,6 +5727,7 @@ mips_gdbarch_init (struct gdbarch_info info,
   tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep));
   gdbarch = gdbarch_alloc (&info, tdep);
   tdep->elf_flags = elf_flags;
+  tdep->mips64_transfers_32bit_regs_p = mips64_transfers_32bit_regs_p;
 
   /* Initially set everything according to the default ABI/ISA.  */
   set_gdbarch_short_bit (gdbarch, 16);
@@ -5834,8 +5735,6 @@ mips_gdbarch_init (struct gdbarch_info info,
   set_gdbarch_float_bit (gdbarch, 32);
   set_gdbarch_double_bit (gdbarch, 64);
   set_gdbarch_long_double_bit (gdbarch, 64);
-  set_gdbarch_deprecated_register_raw_size (gdbarch, mips_register_raw_size);
-  set_gdbarch_deprecated_register_byte (gdbarch, mips_register_byte);
   set_gdbarch_register_reggroup_p (gdbarch, mips_register_reggroup_p);
   set_gdbarch_pseudo_register_read (gdbarch, mips_pseudo_register_read);
   set_gdbarch_pseudo_register_write (gdbarch, mips_pseudo_register_write);
@@ -5845,13 +5744,42 @@ mips_gdbarch_init (struct gdbarch_info info,
   set_gdbarch_elf_make_msymbol_special (gdbarch, 
                                        mips_elf_make_msymbol_special);
 
-
-  if (info.osabi == GDB_OSABI_IRIX)
-    num_regs = 71;
-  else
-    num_regs = 90;
-  set_gdbarch_num_regs (gdbarch, num_regs);
-  set_gdbarch_num_pseudo_regs (gdbarch, num_regs);
+  /* Fill in the OS dependant register numbers.  */
+  {
+    struct mips_regnum *regnum = GDBARCH_OBSTACK_ZALLOC (gdbarch,
+                                                        struct mips_regnum);
+    tdep->regnum = regnum;
+    if (info.osabi == GDB_OSABI_IRIX)
+      {
+       regnum->fp0 = 32;
+       regnum->pc = 64;
+       regnum->cause = 65;
+       regnum->badvaddr = 66;
+       regnum->hi = 67;
+       regnum->lo = 68;
+       regnum->fp_control_status = 69;
+       regnum->fp_implementation_revision = 70;
+       num_regs = 71;
+      }
+    else
+      {
+       regnum->lo = MIPS_EMBED_LO_REGNUM;
+       regnum->hi = MIPS_EMBED_HI_REGNUM;
+       regnum->badvaddr = MIPS_EMBED_BADVADDR_REGNUM;
+       regnum->cause = MIPS_EMBED_CAUSE_REGNUM;
+       regnum->pc = MIPS_EMBED_PC_REGNUM;
+       regnum->fp0 = MIPS_EMBED_FP0_REGNUM;
+       regnum->fp_control_status = 70;
+       regnum->fp_implementation_revision = 71;
+       num_regs = 90;
+      }
+    /* FIXME: cagney/2003-11-15: For MIPS, hasn't PC_REGNUM been
+       replaced by read_pc?  */
+    set_gdbarch_pc_regnum (gdbarch, regnum->pc);
+    set_gdbarch_fp0_regnum (gdbarch, regnum->fp0);
+    set_gdbarch_num_regs (gdbarch, num_regs);
+    set_gdbarch_num_pseudo_regs (gdbarch, num_regs);
+  }
 
   switch (mips_abi)
     {
@@ -5863,7 +5791,7 @@ mips_gdbarch_init (struct gdbarch_info info,
       tdep->mips_default_stack_argsize = 4;
       tdep->mips_fp_register_double = 0;
       tdep->mips_last_arg_regnum = A0_REGNUM + 4 - 1;
-      tdep->mips_last_fp_arg_regnum = FPA0_REGNUM + 4 - 1;
+      tdep->mips_last_fp_arg_regnum = tdep->regnum->fp0 + 12 + 4 - 1;
       tdep->default_mask_address_p = 0;
       set_gdbarch_long_bit (gdbarch, 32);
       set_gdbarch_ptr_bit (gdbarch, 32);
@@ -5881,7 +5809,7 @@ mips_gdbarch_init (struct gdbarch_info info,
       tdep->mips_default_stack_argsize = 8;
       tdep->mips_fp_register_double = 1;
       tdep->mips_last_arg_regnum = A0_REGNUM + 4 - 1;
-      tdep->mips_last_fp_arg_regnum = FPA0_REGNUM + 4 - 1;
+      tdep->mips_last_fp_arg_regnum = tdep->regnum->fp0 + 12 + 4 - 1;
       tdep->default_mask_address_p = 0;
       set_gdbarch_long_bit (gdbarch, 32);
       set_gdbarch_ptr_bit (gdbarch, 32);
@@ -5898,7 +5826,7 @@ mips_gdbarch_init (struct gdbarch_info info,
       tdep->mips_default_stack_argsize = 4;
       tdep->mips_fp_register_double = 0;
       tdep->mips_last_arg_regnum = A0_REGNUM + 8 - 1;
-      tdep->mips_last_fp_arg_regnum = FPA0_REGNUM + 8 - 1;
+      tdep->mips_last_fp_arg_regnum = tdep->regnum->fp0 + 12 + 8 - 1;
       tdep->default_mask_address_p = 0;
       set_gdbarch_long_bit (gdbarch, 32);
       set_gdbarch_ptr_bit (gdbarch, 32);
@@ -5916,7 +5844,7 @@ mips_gdbarch_init (struct gdbarch_info info,
       tdep->mips_default_stack_argsize = 8;
       tdep->mips_fp_register_double = 1;
       tdep->mips_last_arg_regnum = A0_REGNUM + 8 - 1;
-      tdep->mips_last_fp_arg_regnum = FPA0_REGNUM + 8 - 1;
+      tdep->mips_last_fp_arg_regnum = tdep->regnum->fp0 + 12 + 8 - 1;
       tdep->default_mask_address_p = 0;
       set_gdbarch_long_bit (gdbarch, 64);
       set_gdbarch_ptr_bit (gdbarch, 64);
@@ -5934,7 +5862,7 @@ mips_gdbarch_init (struct gdbarch_info info,
       tdep->mips_default_stack_argsize = 8;
       tdep->mips_fp_register_double = 1;
       tdep->mips_last_arg_regnum = A0_REGNUM + 8 - 1;
-      tdep->mips_last_fp_arg_regnum = FPA0_REGNUM + 8 - 1;
+      tdep->mips_last_fp_arg_regnum = tdep->regnum->fp0 + 12 + 8 - 1;
       tdep->default_mask_address_p = 0;
       set_gdbarch_long_bit (gdbarch, 32);
       set_gdbarch_ptr_bit (gdbarch, 32);
@@ -5952,7 +5880,7 @@ mips_gdbarch_init (struct gdbarch_info info,
       tdep->mips_default_stack_argsize = 8;
       tdep->mips_fp_register_double = 1;
       tdep->mips_last_arg_regnum = A0_REGNUM + 8 - 1;
-      tdep->mips_last_fp_arg_regnum = FPA0_REGNUM + 8 - 1;
+      tdep->mips_last_fp_arg_regnum = tdep->regnum->fp0 + 12 + 8 - 1;
       tdep->default_mask_address_p = 0;
       set_gdbarch_long_bit (gdbarch, 64);
       set_gdbarch_ptr_bit (gdbarch, 64);
@@ -6010,11 +5938,14 @@ mips_gdbarch_init (struct gdbarch_info info,
   else
     tdep->mips_fpu_type = MIPS_FPU_DOUBLE;
 
-  /* MIPS version of register names.  NOTE: At present the MIPS
-     register name management is part way between the old -
-     #undef/#define MIPS_REGISTER_NAMES and the new REGISTER_NAME(nr).
-     Further work on it is required.  */
+  /* MIPS version of register names.  */
   set_gdbarch_register_name (gdbarch, mips_register_name);
+  if (info.osabi == GDB_OSABI_IRIX)
+    tdep->mips_processor_reg_names = mips_irix_reg_names;
+  else if (info.bfd_arch_info != NULL && info.bfd_arch_info->mach == bfd_mach_mips3900)
+    tdep->mips_processor_reg_names = mips_tx39_reg_names;
+  else
+    tdep->mips_processor_reg_names = mips_generic_reg_names;
   set_gdbarch_read_pc (gdbarch, mips_read_pc);
   set_gdbarch_write_pc (gdbarch, generic_target_write_pc);
   set_gdbarch_deprecated_target_read_fp (gdbarch, mips_read_sp); /* Draft FRAME base.  */
@@ -6206,10 +6137,6 @@ mips_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
   fprintf_unfiltered (file,
                      "mips_dump_tdep: MIPS_EABI = %d\n",
                      MIPS_EABI);
-  fprintf_unfiltered (file,
-                     "mips_dump_tdep: MIPS_LAST_FP_ARG_REGNUM = %d (%d regs)\n",
-                     MIPS_LAST_FP_ARG_REGNUM,
-                     MIPS_LAST_FP_ARG_REGNUM - FPA0_REGNUM + 1);
   fprintf_unfiltered (file,
                      "mips_dump_tdep: MIPS_FPU_TYPE = %d (%s)\n",
                      MIPS_FPU_TYPE,
@@ -6238,33 +6165,15 @@ mips_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
   fprintf_unfiltered (file,
                      "mips_dump_tdep: ATTACH_DETACH # %s\n",
                      XSTRING (ATTACH_DETACH));
-  fprintf_unfiltered (file,
-                     "mips_dump_tdep: BADVADDR_REGNUM = %d\n",
-                     BADVADDR_REGNUM);
-  fprintf_unfiltered (file,
-                     "mips_dump_tdep: CAUSE_REGNUM = %d\n",
-                     CAUSE_REGNUM);
   fprintf_unfiltered (file,
                      "mips_dump_tdep: DWARF_REG_TO_REGNUM # %s\n",
                      XSTRING (DWARF_REG_TO_REGNUM (REGNUM)));
   fprintf_unfiltered (file,
                      "mips_dump_tdep: ECOFF_REG_TO_REGNUM # %s\n",
                      XSTRING (ECOFF_REG_TO_REGNUM (REGNUM)));
-  fprintf_unfiltered (file,
-                     "mips_dump_tdep: FCRCS_REGNUM = %d\n",
-                     FCRCS_REGNUM);
-  fprintf_unfiltered (file,
-                     "mips_dump_tdep: FCRIR_REGNUM = %d\n",
-                     FCRIR_REGNUM);
   fprintf_unfiltered (file,
                      "mips_dump_tdep: FIRST_EMBED_REGNUM = %d\n",
                      FIRST_EMBED_REGNUM);
-  fprintf_unfiltered (file,
-                     "mips_dump_tdep: FPA0_REGNUM = %d\n",
-                     FPA0_REGNUM);
-  fprintf_unfiltered (file,
-                     "mips_dump_tdep:  HI_REGNUM = %d\n",
-                     HI_REGNUM);
   fprintf_unfiltered (file,
                      "mips_dump_tdep: IGNORE_HELPER_CALL # %s\n",
                      XSTRING (IGNORE_HELPER_CALL (PC)));
@@ -6277,9 +6186,6 @@ mips_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
   fprintf_unfiltered (file,
                      "mips_dump_tdep: LAST_EMBED_REGNUM = %d\n",
                      LAST_EMBED_REGNUM);
-  fprintf_unfiltered (file,
-                     "mips_dump_tdep: LO_REGNUM = %d\n",
-                     LO_REGNUM);
 #ifdef MACHINE_CPROC_FP_OFFSET
   fprintf_unfiltered (file,
                      "mips_dump_tdep: MACHINE_CPROC_FP_OFFSET = %d\n",
@@ -6312,8 +6218,6 @@ mips_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
   fprintf_unfiltered (file,
                      "mips_dump_tdep: MIPS_NUMREGS = %d\n",
                      MIPS_NUMREGS);
-  fprintf_unfiltered (file,
-                     "mips_dump_tdep: MIPS_REGISTER_NAMES = delete?\n");
   fprintf_unfiltered (file,
                      "mips_dump_tdep: MIPS_SAVED_REGSIZE = %d\n",
                      MIPS_SAVED_REGSIZE);
@@ -6587,16 +6491,18 @@ Show zeroing of upper 32 bits of 64-bit addresses.",
 
   /* Allow the user to control the size of 32 bit registers within the
      raw remote packet.  */
-  add_show_from_set (add_set_cmd ("remote-mips64-transfers-32bit-regs",
-                                 class_obscure,
-                                 var_boolean,
-                                 (char *)&mips64_transfers_32bit_regs_p, "\
-Set compatibility with MIPS targets that transfers 32 and 64 bit quantities.\n\
+  add_setshow_cmd ("remote-mips64-transfers-32bit-regs", class_obscure,
+                  var_boolean, &mips64_transfers_32bit_regs_p, "\
+Set compatibility with 64-bit MIPS targets that transfer 32-bit quantities.\n\
+Use \"on\" to enable backward compatibility with older MIPS 64 GDB+target\n\
+that would transfer 32 bits for some registers (e.g. SR, FSR) and\n\
+64 bits for others.  Use \"off\" to disable compatibility mode",  "\
+Show compatibility with 64-bit MIPS targets that transfer 32-bit quantities.\n\
 Use \"on\" to enable backward compatibility with older MIPS 64 GDB+target\n\
 that would transfer 32 bits for some registers (e.g. SR, FSR) and\n\
 64 bits for others.  Use \"off\" to disable compatibility mode",
-                                 &setlist),
-                    &showlist);
+                  set_mips64_transfers_32bit_regs, NULL,
+                  &setlist, &showlist);
 
   /* Debug this files internals. */
   add_show_from_set (add_set_cmd ("mips", class_maintenance, var_zinteger,
This page took 0.049864 seconds and 4 git commands to generate.