Suppress ARI warnings for vsprintf
[deliverable/binutils-gdb.git] / cpu / frv.opc
index 46985b6110ae05376a980ace6a9b5508610cc1ae..1b0b05c29a061cb1d33076aed7e3893cc1179d6d 100644 (file)
@@ -1,6 +1,7 @@
 /* Fujitsu FRV opcode support, for GNU Binutils.  -*- C -*-
 
 /* Fujitsu FRV opcode support, for GNU Binutils.  -*- C -*-
 
-   Copyright 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+   Copyright 2000, 2001, 2003, 2004, 2005, 2007, 2009
+   Free Software Foundation, Inc.
 
    Contributed by Red Hat Inc; developed under contract from Fujitsu.
 
 
    Contributed by Red Hat Inc; developed under contract from Fujitsu.
 
@@ -8,7 +9,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -18,9 +19,9 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
 
-*/
 
 /* This file is an addendum to frv.cpu.  Heavy use of C code isn't
    appropriate in .cpu files, so it resides here.  This especially applies
 
 /* This file is an addendum to frv.cpu.  Heavy use of C code isn't
    appropriate in .cpu files, so it resides here.  This especially applies
@@ -35,8 +36,7 @@
    <arch>-opc.c additions use: "-- opc.c"
    <arch>-asm.c additions use: "-- asm.c"
    <arch>-dis.c additions use: "-- dis.c"
    <arch>-opc.c additions use: "-- opc.c"
    <arch>-asm.c additions use: "-- asm.c"
    <arch>-dis.c additions use: "-- dis.c"
-   <arch>-ibd.h additions use: "-- ibd.h"
-*/
+   <arch>-ibd.h additions use: "-- ibd.h".  */
 \f
 /* -- opc.h */
 
 \f
 /* -- opc.h */
 
 /* Vliw support.  */
 #define FRV_VLIW_SIZE 8 /* fr550 has largest vliw size of 8.  */
 #define PAD_VLIW_COMBO ,UNIT_NIL,UNIT_NIL,UNIT_NIL,UNIT_NIL
 /* Vliw support.  */
 #define FRV_VLIW_SIZE 8 /* fr550 has largest vliw size of 8.  */
 #define PAD_VLIW_COMBO ,UNIT_NIL,UNIT_NIL,UNIT_NIL,UNIT_NIL
-typedef CGEN_ATTR_VALUE_TYPE VLIW_COMBO[FRV_VLIW_SIZE];
+
+typedef CGEN_ATTR_VALUE_ENUM_TYPE VLIW_COMBO[FRV_VLIW_SIZE];
 
 typedef struct
 {
 
 typedef struct
 {
-  int                   next_slot;
-  int                   constraint_violation;
-  unsigned long         mach;
-  unsigned long         elf_flags;
-  CGEN_ATTR_VALUE_TYPE *unit_mapping;
-  VLIW_COMBO           *current_vliw;
-  CGEN_ATTR_VALUE_TYPE  major[FRV_VLIW_SIZE];
-  const CGEN_INSN*      insn[FRV_VLIW_SIZE];
+  int                    next_slot;
+  int                    constraint_violation;
+  unsigned long          mach;
+  unsigned long          elf_flags;
+  CGEN_ATTR_VALUE_ENUM_TYPE * unit_mapping;
+  VLIW_COMBO *           current_vliw;
+  CGEN_ATTR_VALUE_ENUM_TYPE   major[FRV_VLIW_SIZE];
+  const CGEN_INSN *      insn[FRV_VLIW_SIZE];
 } FRV_VLIW;
 
 } FRV_VLIW;
 
-int frv_is_branch_major PARAMS ((CGEN_ATTR_VALUE_TYPE, unsigned long));
-int frv_is_float_major  PARAMS ((CGEN_ATTR_VALUE_TYPE, unsigned long));
-int frv_is_media_major  PARAMS ((CGEN_ATTR_VALUE_TYPE, unsigned long));
-int frv_is_branch_insn  PARAMS ((const CGEN_INSN *));
-int frv_is_float_insn   PARAMS ((const CGEN_INSN *));
-int frv_is_media_insn   PARAMS ((const CGEN_INSN *));
-void frv_vliw_reset     PARAMS ((FRV_VLIW *, unsigned long mach, unsigned long elf_flags));
-int frv_vliw_add_insn   PARAMS ((FRV_VLIW *, const CGEN_INSN *));
-int spr_valid           PARAMS ((long));
+int frv_is_branch_major (CGEN_ATTR_VALUE_ENUM_TYPE, unsigned long);
+int frv_is_float_major  (CGEN_ATTR_VALUE_ENUM_TYPE, unsigned long);
+int frv_is_media_major  (CGEN_ATTR_VALUE_ENUM_TYPE, unsigned long);
+int frv_is_branch_insn  (const CGEN_INSN *);
+int frv_is_float_insn   (const CGEN_INSN *);
+int frv_is_media_insn   (const CGEN_INSN *);
+void frv_vliw_reset     (FRV_VLIW *, unsigned long, unsigned long);
+int frv_vliw_add_insn   (FRV_VLIW *, const CGEN_INSN *);
+int spr_valid           (long);
 /* -- */
 \f
 /* -- opc.c */
 /* -- */
 \f
 /* -- opc.c */
+#include "opintl.h"
 #include "elf/frv.h"
 #include <stdio.h>
 
 #include "elf/frv.h"
 #include <stdio.h>
 
-static int match_unit
-  PARAMS ((FRV_VLIW *, CGEN_ATTR_VALUE_TYPE, CGEN_ATTR_VALUE_TYPE));
-static int match_vliw
-  PARAMS ((VLIW_COMBO *, VLIW_COMBO *, int));
-static VLIW_COMBO * add_next_to_vliw
-  PARAMS ((FRV_VLIW *, CGEN_ATTR_VALUE_TYPE));
-static int find_major_in_vliw
-  PARAMS ((FRV_VLIW *, CGEN_ATTR_VALUE_TYPE));
-static int fr400_check_insn_major_constraints
-  PARAMS ((FRV_VLIW *, CGEN_ATTR_VALUE_TYPE));
-static int fr450_check_insn_major_constraints
-  PARAMS ((FRV_VLIW *, CGEN_ATTR_VALUE_TYPE));
-static int fr500_check_insn_major_constraints
-  PARAMS ((FRV_VLIW *, CGEN_ATTR_VALUE_TYPE));
-static int fr550_check_insn_major_constraints
-  PARAMS ((FRV_VLIW *, CGEN_ATTR_VALUE_TYPE, const CGEN_INSN *));
-static int check_insn_major_constraints
-  PARAMS ((FRV_VLIW *, CGEN_ATTR_VALUE_TYPE, const CGEN_INSN *));
+/* DEBUG appears below as argument of OP macro.  */
+#undef DEBUG
 
 
-int
-frv_is_branch_major (CGEN_ATTR_VALUE_TYPE major, unsigned long mach)
+/* Returns TRUE if {MAJOR,MACH} is a major branch of the FRV
+   development tree.  */
+
+bfd_boolean
+frv_is_branch_major (CGEN_ATTR_VALUE_ENUM_TYPE major, unsigned long mach)
 {
   switch (mach)
     {
     case bfd_mach_fr400:
       if (major >= FR400_MAJOR_B_1 && major <= FR400_MAJOR_B_6)
 {
   switch (mach)
     {
     case bfd_mach_fr400:
       if (major >= FR400_MAJOR_B_1 && major <= FR400_MAJOR_B_6)
-       return 1; /* is a branch */
+       return TRUE;
       break;
     case bfd_mach_fr450:
       if (major >= FR450_MAJOR_B_1 && major <= FR450_MAJOR_B_6)
       break;
     case bfd_mach_fr450:
       if (major >= FR450_MAJOR_B_1 && major <= FR450_MAJOR_B_6)
-       return 1; /* is a branch */
+       return TRUE;
       break;
     default:
       if (major >= FR500_MAJOR_B_1 && major <= FR500_MAJOR_B_6)
       break;
     default:
       if (major >= FR500_MAJOR_B_1 && major <= FR500_MAJOR_B_6)
-       return 1; /* is a branch */
+       return TRUE;
       break;
     }
 
       break;
     }
 
-  return 0; /* not a branch */
+  return FALSE;
 }
 
 }
 
-int
-frv_is_float_major (CGEN_ATTR_VALUE_TYPE major, unsigned long mach)
+/* Returns TRUE if {MAJOR,MACH} supports floating point insns.  */
+
+bfd_boolean
+frv_is_float_major (CGEN_ATTR_VALUE_ENUM_TYPE major, unsigned long mach)
 {
   switch (mach)
     {
     case bfd_mach_fr400:
     case bfd_mach_fr450:
 {
   switch (mach)
     {
     case bfd_mach_fr400:
     case bfd_mach_fr450:
-      return 0; /* No float insns */
+      return FALSE;
     default:
       if (major >= FR500_MAJOR_F_1 && major <= FR500_MAJOR_F_8)
     default:
       if (major >= FR500_MAJOR_F_1 && major <= FR500_MAJOR_F_8)
-       return 1; /* is a float insn */
+       return TRUE;
       break;
     }
 
       break;
     }
 
-  return 0; /* not a branch */
+  return FALSE;
 }
 
 }
 
-int
-frv_is_media_major (CGEN_ATTR_VALUE_TYPE major, unsigned long mach)
+/* Returns TRUE if {MAJOR,MACH} supports media insns.  */
+
+bfd_boolean
+frv_is_media_major (CGEN_ATTR_VALUE_ENUM_TYPE major, unsigned long mach)
 {
   switch (mach)
     {
     case bfd_mach_fr400:
       if (major >= FR400_MAJOR_M_1 && major <= FR400_MAJOR_M_2)
 {
   switch (mach)
     {
     case bfd_mach_fr400:
       if (major >= FR400_MAJOR_M_1 && major <= FR400_MAJOR_M_2)
-       return 1; /* is a media insn */
+       return TRUE;
       break;
     case bfd_mach_fr450:
       if (major >= FR450_MAJOR_M_1 && major <= FR450_MAJOR_M_6)
       break;
     case bfd_mach_fr450:
       if (major >= FR450_MAJOR_M_1 && major <= FR450_MAJOR_M_6)
-       return 1; /* is a media insn */
+       return TRUE;
       break;
     default:
       if (major >= FR500_MAJOR_M_1 && major <= FR500_MAJOR_M_8)
       break;
     default:
       if (major >= FR500_MAJOR_M_1 && major <= FR500_MAJOR_M_8)
-       return 1; /* is a media insn */
+       return TRUE;
       break;
     }
 
       break;
     }
 
-  return 0; /* not a branch */
+  return FALSE;
 }
 
 }
 
-int
+bfd_boolean
 frv_is_branch_insn (const CGEN_INSN *insn)
 {
   if (frv_is_branch_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR400_MAJOR),
                           bfd_mach_fr400))
 frv_is_branch_insn (const CGEN_INSN *insn)
 {
   if (frv_is_branch_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR400_MAJOR),
                           bfd_mach_fr400))
-    return 1;
+    return TRUE;
   if (frv_is_branch_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR450_MAJOR),
                           bfd_mach_fr450))
   if (frv_is_branch_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR450_MAJOR),
                           bfd_mach_fr450))
-    return 1;
+    return TRUE;
   if (frv_is_branch_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR500_MAJOR),
                           bfd_mach_fr500))
   if (frv_is_branch_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR500_MAJOR),
                           bfd_mach_fr500))
-    return 1;
+    return TRUE;
 
 
-  return 0;
+  return FALSE;
 }
 
 }
 
-int
+bfd_boolean
 frv_is_float_insn (const CGEN_INSN *insn)
 {
   if (frv_is_float_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR400_MAJOR),
                          bfd_mach_fr400))
 frv_is_float_insn (const CGEN_INSN *insn)
 {
   if (frv_is_float_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR400_MAJOR),
                          bfd_mach_fr400))
-    return 1;
+    return TRUE;
   if (frv_is_float_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR450_MAJOR),
                          bfd_mach_fr450))
   if (frv_is_float_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR450_MAJOR),
                          bfd_mach_fr450))
-    return 1;
+    return TRUE;
   if (frv_is_float_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR500_MAJOR),
                          bfd_mach_fr500))
   if (frv_is_float_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR500_MAJOR),
                          bfd_mach_fr500))
-    return 1;
+    return TRUE;
 
 
-  return 0;
+  return FALSE;
 }
 
 }
 
-int
+bfd_boolean
 frv_is_media_insn (const CGEN_INSN *insn)
 {
   if (frv_is_media_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR400_MAJOR),
                          bfd_mach_fr400))
 frv_is_media_insn (const CGEN_INSN *insn)
 {
   if (frv_is_media_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR400_MAJOR),
                          bfd_mach_fr400))
-    return 1;
+    return TRUE;
   if (frv_is_media_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR450_MAJOR),
                          bfd_mach_fr450))
   if (frv_is_media_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR450_MAJOR),
                          bfd_mach_fr450))
-    return 1;
+    return TRUE;
   if (frv_is_media_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR500_MAJOR),
                          bfd_mach_fr500))
   if (frv_is_media_major (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_FR500_MAJOR),
                          bfd_mach_fr500))
-    return 1;
+    return TRUE;
 
 
-  return 0;
+  return FALSE;
 }
 
 /* This table represents the allowable packing for vliw insns for the fr400.
 }
 
 /* This table represents the allowable packing for vliw insns for the fr400.
@@ -283,7 +276,7 @@ static VLIW_COMBO fr550_allowed_vliw[] =
 /* Some insns are assigned specialized implementation units which map to
    different actual implementation units on different machines.  These
    tables perform that mapping.  */
 /* Some insns are assigned specialized implementation units which map to
    different actual implementation units on different machines.  These
    tables perform that mapping.  */
-static CGEN_ATTR_VALUE_TYPE fr400_unit_mapping[] =
+static CGEN_ATTR_VALUE_ENUM_TYPE fr400_unit_mapping[] =
 {
 /* unit in insn    actual unit */
 /* NIL      */     UNIT_NIL,
 {
 /* unit in insn    actual unit */
 /* NIL      */     UNIT_NIL,
@@ -318,7 +311,7 @@ static CGEN_ATTR_VALUE_TYPE fr400_unit_mapping[] =
 /* Some insns are assigned specialized implementation units which map to
    different actual implementation units on different machines.  These
    tables perform that mapping.  */
 /* Some insns are assigned specialized implementation units which map to
    different actual implementation units on different machines.  These
    tables perform that mapping.  */
-static CGEN_ATTR_VALUE_TYPE fr450_unit_mapping[] =
+static CGEN_ATTR_VALUE_ENUM_TYPE fr450_unit_mapping[] =
 {
 /* unit in insn    actual unit */
 /* NIL      */     UNIT_NIL,
 {
 /* unit in insn    actual unit */
 /* NIL      */     UNIT_NIL,
@@ -350,7 +343,7 @@ static CGEN_ATTR_VALUE_TYPE fr450_unit_mapping[] =
 /* MCLRACC-1*/     UNIT_FM0  /* mclracc,A==1   insn only in FM0 unit.  */
 };
 
 /* MCLRACC-1*/     UNIT_FM0  /* mclracc,A==1   insn only in FM0 unit.  */
 };
 
-static CGEN_ATTR_VALUE_TYPE fr500_unit_mapping[] =
+static CGEN_ATTR_VALUE_ENUM_TYPE fr500_unit_mapping[] =
 {
 /* unit in insn    actual unit */
 /* NIL      */     UNIT_NIL,
 {
 /* unit in insn    actual unit */
 /* NIL      */     UNIT_NIL,
@@ -382,7 +375,7 @@ static CGEN_ATTR_VALUE_TYPE fr500_unit_mapping[] =
 /* MCLRACC-1*/     UNIT_FM01 /* mclracc,A==1 in FM0 or FM1 unit.  */
 };
 
 /* MCLRACC-1*/     UNIT_FM01 /* mclracc,A==1 in FM0 or FM1 unit.  */
 };
 
-static CGEN_ATTR_VALUE_TYPE fr550_unit_mapping[] =
+static CGEN_ATTR_VALUE_ENUM_TYPE fr550_unit_mapping[] =
 {
 /* unit in insn    actual unit */
 /* NIL      */     UNIT_NIL,
 {
 /* unit in insn    actual unit */
 /* NIL      */     UNIT_NIL,
@@ -443,20 +436,20 @@ frv_vliw_reset (FRV_VLIW *vliw, unsigned long mach, unsigned long elf_flags)
     }
 }
 
     }
 }
 
-/* Return 1 if unit1 is a match for unit2.
+/* Return TRUE if unit1 is a match for unit2.
    Unit1 comes from the insn's UNIT attribute. unit2 comes from one of the
    *_allowed_vliw tables above.  */
    Unit1 comes from the insn's UNIT attribute. unit2 comes from one of the
    *_allowed_vliw tables above.  */
-static int
+static bfd_boolean
 match_unit (FRV_VLIW *vliw,
 match_unit (FRV_VLIW *vliw,
-           CGEN_ATTR_VALUE_TYPE unit1, CGEN_ATTR_VALUE_TYPE unit2)
+           CGEN_ATTR_VALUE_ENUM_TYPE unit1, CGEN_ATTR_VALUE_ENUM_TYPE unit2)
 {
   /* Map any specialized implementation units to actual ones.  */
   unit1 = vliw->unit_mapping[unit1];
 
   if (unit1 == unit2)
 {
   /* Map any specialized implementation units to actual ones.  */
   unit1 = vliw->unit_mapping[unit1];
 
   if (unit1 == unit2)
-    return 1;
+    return TRUE;
   if (unit1 < unit2)
   if (unit1 < unit2)
-    return 0;
+    return FALSE;
 
   switch (unit1)
     {
 
   switch (unit1)
     {
@@ -466,43 +459,41 @@ match_unit (FRV_VLIW *vliw,
       /* The 01 versions of these units are within 2 enums of the 0 or 1
         versions.  */
       if (unit1 - unit2 <= 2)
       /* The 01 versions of these units are within 2 enums of the 0 or 1
         versions.  */
       if (unit1 - unit2 <= 2)
-       return 1;
+       return TRUE;
       break;
     case UNIT_IALL:
     case UNIT_FMALL:
       /* The ALL versions of these units are within 5 enums of the 0, 1, 2 or 3
         versions.  */
       if (unit1 - unit2 <= 5)
       break;
     case UNIT_IALL:
     case UNIT_FMALL:
       /* The ALL versions of these units are within 5 enums of the 0, 1, 2 or 3
         versions.  */
       if (unit1 - unit2 <= 5)
-       return 1;
+       return TRUE;
       break;
     default:
       break;
     }
 
       break;
     default:
       break;
     }
 
-  return 0;
+  return FALSE;
 }
 
 }
 
-/* Return 1 if the vliws match, 0 otherwise.  */
+/* Return TRUE if the vliws match, FALSE otherwise.  */
 
 
-static int
+static bfd_boolean
 match_vliw (VLIW_COMBO *vliw1, VLIW_COMBO *vliw2, int vliw_size)
 {
   int i;
 
   for (i = 0; i < vliw_size; ++i)
 match_vliw (VLIW_COMBO *vliw1, VLIW_COMBO *vliw2, int vliw_size)
 {
   int i;
 
   for (i = 0; i < vliw_size; ++i)
-    {
-      if ((*vliw1)[i] != (*vliw2)[i])
-       return 0;
-    }
+    if ((*vliw1)[i] != (*vliw2)[i])
+      return FALSE;
 
 
-  return 1;
+  return TRUE;
 }
 
 /* Find the next vliw vliw in the table that can accomodate the new insn.
    If one is found then return it. Otherwise return NULL.  */
 
 static VLIW_COMBO *
 }
 
 /* Find the next vliw vliw in the table that can accomodate the new insn.
    If one is found then return it. Otherwise return NULL.  */
 
 static VLIW_COMBO *
-add_next_to_vliw (FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE unit)
+add_next_to_vliw (FRV_VLIW *vliw, CGEN_ATTR_VALUE_ENUM_TYPE unit)
 {
   int           next    = vliw->next_slot;
   VLIW_COMBO    *current = vliw->current_vliw;
 {
   int           next    = vliw->next_slot;
   VLIW_COMBO    *current = vliw->current_vliw;
@@ -510,9 +501,9 @@ add_next_to_vliw (FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE unit)
 
   if (next <= 0)
     {
 
   if (next <= 0)
     {
-      fprintf (stderr, "frv-opc.c line %d: bad vliw->next_slot value.\n",
-              __LINE__);
-      abort (); /* Should never happen */
+      /* xgettext:c-format */
+      opcodes_error_handler (_("internal error: bad vliw->next_slot value"));
+      abort ();
     }
 
   /* The table is sorted by units allowed within slots, so vliws with
     }
 
   /* The table is sorted by units allowed within slots, so vliws with
@@ -529,28 +520,26 @@ add_next_to_vliw (FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE unit)
   return NULL;
 }
 
   return NULL;
 }
 
-/* Look for the given major insn type in the given vliw. Return 1 if found,
-   return 0 otherwise.  */
+/* Look for the given major insn type in the given vliw.
+   Returns TRUE if found, FALSE otherwise.  */
 
 
-static int
-find_major_in_vliw (FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE major)
+static bfd_boolean
+find_major_in_vliw (FRV_VLIW *vliw, CGEN_ATTR_VALUE_ENUM_TYPE major)
 {
   int i;
 
   for (i = 0; i < vliw->next_slot; ++i)
     if (vliw->major[i] == major)
 {
   int i;
 
   for (i = 0; i < vliw->next_slot; ++i)
     if (vliw->major[i] == major)
-      return 1;
+      return TRUE;
 
 
-  return 0;
+  return FALSE;
 }
 
 /* Check for constraints between the insns in the vliw due to major insn
    types.  */
 
 }
 
 /* Check for constraints between the insns in the vliw due to major insn
    types.  */
 
-static int
-fr400_check_insn_major_constraints (
-  FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE major
-)
+static bfd_boolean
+fr400_check_insn_major_constraints (FRV_VLIW *vliw, CGEN_ATTR_VALUE_ENUM_TYPE major)
 {
   /* In the cpu file, all media insns are represented as being allowed in
      both media units. This makes it easier since this is the case for fr500.
 {
   /* In the cpu file, all media insns are represented as being allowed in
      both media units. This makes it easier since this is the case for fr500.
@@ -562,19 +551,17 @@ fr400_check_insn_major_constraints (
       return ! find_major_in_vliw (vliw, FR400_MAJOR_M_1)
        &&   ! find_major_in_vliw (vliw, FR400_MAJOR_M_2);
     case FR400_MAJOR_M_1:
       return ! find_major_in_vliw (vliw, FR400_MAJOR_M_1)
        &&   ! find_major_in_vliw (vliw, FR400_MAJOR_M_2);
     case FR400_MAJOR_M_1:
-      return !find_major_in_vliw (vliw, FR400_MAJOR_M_2);
+      return ! find_major_in_vliw (vliw, FR400_MAJOR_M_2);
     default:
       break;
     }
     default:
       break;
     }
-  return 1;
+  return TRUE;
 }
 
 }
 
-static int
-fr450_check_insn_major_constraints (
-  FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE major
-)
+static bfd_boolean
+fr450_check_insn_major_constraints (FRV_VLIW *vliw, CGEN_ATTR_VALUE_ENUM_TYPE major)
 {
 {
-  CGEN_ATTR_VALUE_TYPE other_major;
+  CGEN_ATTR_VALUE_ENUM_TYPE other_major;
 
   /* Our caller guarantees there's at least one other instruction.  */
   other_major = CGEN_INSN_ATTR_VALUE (vliw->insn[0], CGEN_INSN_FR450_MAJOR);
 
   /* Our caller guarantees there's at least one other instruction.  */
   other_major = CGEN_INSN_ATTR_VALUE (vliw->insn[0], CGEN_INSN_FR450_MAJOR);
@@ -582,7 +569,7 @@ fr450_check_insn_major_constraints (
   /* (M4, M5) and (M4, M6) are allowed.  */
   if (other_major == FR450_MAJOR_M_4)
     if (major == FR450_MAJOR_M_5 || major == FR450_MAJOR_M_6)
   /* (M4, M5) and (M4, M6) are allowed.  */
   if (other_major == FR450_MAJOR_M_4)
     if (major == FR450_MAJOR_M_5 || major == FR450_MAJOR_M_6)
-      return 1;
+      return TRUE;
 
   /* Otherwise, instructions in even-numbered media categories cannot be
      executed in parallel with other media instructions.  */
 
   /* Otherwise, instructions in even-numbered media categories cannot be
      executed in parallel with other media instructions.  */
@@ -602,38 +589,37 @@ fr450_check_insn_major_constraints (
               || other_major == FR450_MAJOR_M_6);
 
     default:
               || other_major == FR450_MAJOR_M_6);
 
     default:
-      return 1;
+      return TRUE;
     }
 }
 
     }
 }
 
-static int
-find_unit_in_vliw (
-  FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE unit
-)
+static bfd_boolean
+find_unit_in_vliw (FRV_VLIW *vliw, CGEN_ATTR_VALUE_ENUM_TYPE unit)
 {
   int i;
 {
   int i;
+
   for (i = 0; i < vliw->next_slot; ++i)
     if (CGEN_INSN_ATTR_VALUE (vliw->insn[i], CGEN_INSN_UNIT) == unit)
   for (i = 0; i < vliw->next_slot; ++i)
     if (CGEN_INSN_ATTR_VALUE (vliw->insn[i], CGEN_INSN_UNIT) == unit)
-      return 1;
+      return TRUE;
 
 
-  return 0; /* not found */
+  return FALSE; /* Not found.  */
 }
 
 }
 
-static int
-find_major_in_slot (
-  FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE major, CGEN_ATTR_VALUE_TYPE slot
-)
+static bfd_boolean
+find_major_in_slot (FRV_VLIW *vliw,
+                   CGEN_ATTR_VALUE_ENUM_TYPE major,
+                   CGEN_ATTR_VALUE_ENUM_TYPE slot)
 {
   int i;
 
   for (i = 0; i < vliw->next_slot; ++i)
     if (vliw->major[i] == major && (*vliw->current_vliw)[i] == slot)
 {
   int i;
 
   for (i = 0; i < vliw->next_slot; ++i)
     if (vliw->major[i] == major && (*vliw->current_vliw)[i] == slot)
-      return 1;
+      return TRUE;
 
 
-  return 0;
+  return FALSE;
 }
 
 }
 
-static int
+static bfd_boolean
 fr550_find_media_in_vliw (FRV_VLIW *vliw)
 {
   int i;
 fr550_find_media_in_vliw (FRV_VLIW *vliw)
 {
   int i;
@@ -649,13 +635,13 @@ fr550_find_media_in_vliw (FRV_VLIW *vliw)
          || CGEN_INSN_NUM (vliw->insn[i]) == FRV_INSN_MCLRACC_1)
        continue;
 
          || CGEN_INSN_NUM (vliw->insn[i]) == FRV_INSN_MCLRACC_1)
        continue;
 
-      return 1; /* found one */
+      return TRUE; /* Found one.  */
     }
 
     }
 
-  return 0;
+  return FALSE;
 }
 
 }
 
-static int
+static bfd_boolean
 fr550_find_float_in_vliw (FRV_VLIW *vliw)
 {
   int i;
 fr550_find_float_in_vliw (FRV_VLIW *vliw)
 {
   int i;
@@ -669,19 +655,19 @@ fr550_find_float_in_vliw (FRV_VLIW *vliw)
       if (CGEN_INSN_NUM (vliw->insn[i]) == FRV_INSN_FNOP)
        continue;
 
       if (CGEN_INSN_NUM (vliw->insn[i]) == FRV_INSN_FNOP)
        continue;
 
-      return 1; /* found one */
+      return TRUE; /* Found one.  */
     }
 
     }
 
-  return 0;
+  return FALSE;
 }
 
 }
 
-static int
-fr550_check_insn_major_constraints (
-  FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE major, const CGEN_INSN *insn
-)
+static bfd_boolean
+fr550_check_insn_major_constraints (FRV_VLIW *vliw,
+                                   CGEN_ATTR_VALUE_ENUM_TYPE major,
+                                   const CGEN_INSN *insn)
 {
 {
-  CGEN_ATTR_VALUE_TYPE unit;
-  CGEN_ATTR_VALUE_TYPE slot = (*vliw->current_vliw)[vliw->next_slot];
+  CGEN_ATTR_VALUE_ENUM_TYPE unit;
+  CGEN_ATTR_VALUE_ENUM_TYPE slot = (*vliw->current_vliw)[vliw->next_slot];
   switch (slot)
     {
     case UNIT_I2:
   switch (slot)
     {
     case UNIT_I2:
@@ -692,8 +678,8 @@ fr550_check_insn_major_constraints (
       break;
     case UNIT_FM2:
     case UNIT_FM3:
       break;
     case UNIT_FM2:
     case UNIT_FM3:
-      /* Floating point insns other than FNOP in slot f2 or f3 cannot coexist with
-        media insns.  */
+      /* Floating point insns other than FNOP in slot f2 or f3 cannot coexist
+        with media insns.  */
       if (major >= FR550_MAJOR_F_1 && major <= FR550_MAJOR_F_4
          && CGEN_INSN_NUM (insn) != FRV_INSN_FNOP)
        return ! fr550_find_media_in_vliw (vliw);
       if (major >= FR550_MAJOR_F_1 && major <= FR550_MAJOR_F_4
          && CGEN_INSN_NUM (insn) != FRV_INSN_FNOP)
        return ! fr550_find_media_in_vliw (vliw);
@@ -703,30 +689,31 @@ fr550_check_insn_major_constraints (
          && CGEN_INSN_NUM (insn) != FRV_INSN_MNOP)
        return ! fr550_find_float_in_vliw (vliw);
       /* F-2 in slot f2 or f3 cannot coexist with F-2 or F-4 in slot f1 or f2
          && CGEN_INSN_NUM (insn) != FRV_INSN_MNOP)
        return ! fr550_find_float_in_vliw (vliw);
       /* F-2 in slot f2 or f3 cannot coexist with F-2 or F-4 in slot f1 or f2
-        respectively.
-       */
+        respectively.  */
       if (major == FR550_MAJOR_F_2)
       if (major == FR550_MAJOR_F_2)
-       return ! find_major_in_slot (vliw, FR550_MAJOR_F_2, slot - (UNIT_FM2 - UNIT_FM0))
-         &&   ! find_major_in_slot (vliw, FR550_MAJOR_F_4, slot - (UNIT_FM2 - UNIT_FM0));
+       return ! find_major_in_slot (vliw, FR550_MAJOR_F_2,
+                                    slot - (UNIT_FM2 - UNIT_FM0))
+         &&   ! find_major_in_slot (vliw, FR550_MAJOR_F_4,
+                                    slot - (UNIT_FM2 - UNIT_FM0));
       /* M-2 or M-5 in slot m2 or m3 cannot coexist with M-2 in slot m1 or m2
         respectively.  */
       if (major == FR550_MAJOR_M_2 || major == FR550_MAJOR_M_5)
       /* M-2 or M-5 in slot m2 or m3 cannot coexist with M-2 in slot m1 or m2
         respectively.  */
       if (major == FR550_MAJOR_M_2 || major == FR550_MAJOR_M_5)
-       return ! find_major_in_slot (vliw, FR550_MAJOR_M_2, slot - (UNIT_FM2 - UNIT_FM0));
+       return ! find_major_in_slot (vliw, FR550_MAJOR_M_2,
+                                    slot - (UNIT_FM2 - UNIT_FM0));
       /* M-4 in slot m2 or m3 cannot coexist with M-4 in slot m1 or m2
         respectively.  */
       if (major == FR550_MAJOR_M_4)
       /* M-4 in slot m2 or m3 cannot coexist with M-4 in slot m1 or m2
         respectively.  */
       if (major == FR550_MAJOR_M_4)
-       return ! find_major_in_slot (vliw, FR550_MAJOR_M_4, slot - (UNIT_FM2 - UNIT_FM0));
+       return ! find_major_in_slot (vliw, FR550_MAJOR_M_4,
+                                    slot - (UNIT_FM2 - UNIT_FM0));
       break;
     default:
       break;
     }
       break;
     default:
       break;
     }
-  return 1; /* all ok */
+  return TRUE; /* All OK.  */
 }
 
 }
 
-static int
-fr500_check_insn_major_constraints (
-  FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE major
-)
+static bfd_boolean
+fr500_check_insn_major_constraints (FRV_VLIW *vliw, CGEN_ATTR_VALUE_ENUM_TYPE major)
 {
   /* TODO: A table might be faster for some of the more complex instances
      here.  */
 {
   /* TODO: A table might be faster for some of the more complex instances
      here.  */
@@ -745,7 +732,7 @@ fr500_check_insn_major_constraints (
     case FR500_MAJOR_F_4:
     case FR500_MAJOR_F_8:
     case FR500_MAJOR_M_8:
     case FR500_MAJOR_F_4:
     case FR500_MAJOR_F_8:
     case FR500_MAJOR_M_8:
-      return 1; /* OK */
+      return TRUE; /* OK */
     case FR500_MAJOR_I_2:
       /* Cannot coexist with I-3 insn.  */
       return ! find_major_in_vliw (vliw, FR500_MAJOR_I_3);
     case FR500_MAJOR_I_2:
       /* Cannot coexist with I-3 insn.  */
       return ! find_major_in_vliw (vliw, FR500_MAJOR_I_3);
@@ -824,61 +811,59 @@ fr500_check_insn_major_constraints (
        &&   ! find_major_in_vliw (vliw, FR500_MAJOR_F_6)
        &&   ! find_major_in_vliw (vliw, FR500_MAJOR_F_7);
     default:
        &&   ! find_major_in_vliw (vliw, FR500_MAJOR_F_6)
        &&   ! find_major_in_vliw (vliw, FR500_MAJOR_F_7);
     default:
-      fprintf (stderr, "frv-opc.c, line %d: bad major code, aborting.\n",
-              __LINE__);
+      /* xgettext:c-format */
+      opcodes_error_handler (_("internal error: bad major code"));
       abort ();
       break;
     }
       abort ();
       break;
     }
-  return 1;
+  return TRUE;
 }
 
 }
 
-static int
-check_insn_major_constraints (
-  FRV_VLIW *vliw, CGEN_ATTR_VALUE_TYPE major, const CGEN_INSN *insn
-)
+static bfd_boolean
+check_insn_major_constraints (FRV_VLIW *vliw,
+                             CGEN_ATTR_VALUE_ENUM_TYPE major,
+                             const CGEN_INSN *insn)
 {
 {
-  int rc;
   switch (vliw->mach)
     {
     case bfd_mach_fr400:
   switch (vliw->mach)
     {
     case bfd_mach_fr400:
-      rc = fr400_check_insn_major_constraints (vliw, major);
-      break;
+      return fr400_check_insn_major_constraints (vliw, major);
+
     case bfd_mach_fr450:
     case bfd_mach_fr450:
-      rc = fr450_check_insn_major_constraints (vliw, major);
-      break;
+      return fr450_check_insn_major_constraints (vliw, major);
+
     case bfd_mach_fr550:
     case bfd_mach_fr550:
-      rc = fr550_check_insn_major_constraints (vliw, major, insn);
-      break;
+      return fr550_check_insn_major_constraints (vliw, major, insn);
+
     default:
     default:
-      rc = fr500_check_insn_major_constraints (vliw, major);
-      break;
+      return fr500_check_insn_major_constraints (vliw, major);
     }
     }
-  return rc;
 }
 
 }
 
-/* Add in insn to the VLIW vliw if possible. Return 0 if successful,
-   non-zero otherwise.  */
+/* Add in insn to the VLIW vliw if possible.
+   Return 0 if successful, non-zero otherwise.  */
+
 int
 frv_vliw_add_insn (FRV_VLIW *vliw, const CGEN_INSN *insn)
 {
 int
 frv_vliw_add_insn (FRV_VLIW *vliw, const CGEN_INSN *insn)
 {
-  int index;
-  CGEN_ATTR_VALUE_TYPE major;
-  CGEN_ATTR_VALUE_TYPE unit;
+  int slot_index;
+  CGEN_ATTR_VALUE_ENUM_TYPE major;
+  CGEN_ATTR_VALUE_ENUM_TYPE unit;
   VLIW_COMBO *new_vliw;
 
   if (vliw->constraint_violation || CGEN_INSN_INVALID_P (insn))
     return 1;
 
   VLIW_COMBO *new_vliw;
 
   if (vliw->constraint_violation || CGEN_INSN_INVALID_P (insn))
     return 1;
 
-  index = vliw->next_slot;
-  if (index >= FRV_VLIW_SIZE)
+  slot_index = vliw->next_slot;
+  if (slot_index >= FRV_VLIW_SIZE)
     return 1;
 
   unit = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_UNIT);
   if (unit == UNIT_NIL)
     {
     return 1;
 
   unit = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_UNIT);
   if (unit == UNIT_NIL)
     {
-      fprintf (stderr, "frv-opc.c line %d: bad insn unit.\n",
-              __LINE__);
-      abort (); /* no UNIT specified for this insn in frv.cpu  */
+      /* xgettext:c-format */
+      opcodes_error_handler (_("internal error: bad insn unit"));
+      abort ();
     }
 
   switch (vliw->mach)
     }
 
   switch (vliw->mach)
@@ -897,7 +882,7 @@ frv_vliw_add_insn (FRV_VLIW *vliw, const CGEN_INSN *insn)
       break;
     }
 
       break;
     }
 
-  if (index <= 0)
+  if (slot_index <= 0)
     {
       /* Any insn can be added to slot 0.  */
       while (! match_unit (vliw, unit, (*vliw->current_vliw)[0]))
     {
       /* Any insn can be added to slot 0.  */
       while (! match_unit (vliw, unit, (*vliw->current_vliw)[0]))
@@ -917,8 +902,8 @@ frv_vliw_add_insn (FRV_VLIW *vliw, const CGEN_INSN *insn)
       if (new_vliw && check_insn_major_constraints (vliw, major, insn))
        {
          vliw->current_vliw = new_vliw;
       if (new_vliw && check_insn_major_constraints (vliw, major, insn))
        {
          vliw->current_vliw = new_vliw;
-         vliw->major[index] = major;
-         vliw->insn[index] = insn;
+         vliw->major[slot_index] = major;
+         vliw->insn[slot_index] = insn;
          vliw->next_slot++;
          return 0;
        }
          vliw->next_slot++;
          return 0;
        }
@@ -934,48 +919,161 @@ frv_vliw_add_insn (FRV_VLIW *vliw, const CGEN_INSN *insn)
   return 1;
 }
 
   return 1;
 }
 
-int
-spr_valid (regno)
-     long regno;
+bfd_boolean
+spr_valid (long regno)
 {
 {
-  if (regno < 0)     return 0;
-  if (regno <= 4095) return 1;
-  return 0;
+  if (regno < 0)     return FALSE;
+  if (regno <= 4095) return TRUE;
+  return FALSE;
 }
 /* -- */
 \f
 /* -- asm.c */
 }
 /* -- */
 \f
 /* -- asm.c */
-static const char * parse_ulo16
-  PARAMS ((CGEN_CPU_DESC, const char **, int, unsigned long *));
-static const char * parse_uslo16
-  PARAMS ((CGEN_CPU_DESC, const char **, int, unsigned long *));
-static const char * parse_uhi16
-  PARAMS ((CGEN_CPU_DESC, const char **, int, unsigned long *));
-static long parse_register_number
-  PARAMS ((const char **));
-static const char * parse_spr
-  PARAMS ((CGEN_CPU_DESC, const char **, CGEN_KEYWORD *, long *));
-static const char * parse_d12
-  PARAMS ((CGEN_CPU_DESC, const char **, int, long *));
-static const char * parse_s12
-  PARAMS ((CGEN_CPU_DESC, const char **, int, long *));
-static const char * parse_u12
-  PARAMS ((CGEN_CPU_DESC, const char **, int, long *));
-static const char * parse_even_register
-  PARAMS ((CGEN_CPU_DESC, const char **, CGEN_KEYWORD *, long *));
-static const char * parse_A0
-  PARAMS ((CGEN_CPU_DESC, const char **, int, long *));
-static const char * parse_A1
-  PARAMS ((CGEN_CPU_DESC, const char **, int, long *));
-static const char * parse_A
-  PARAMS ((CGEN_CPU_DESC, const char **, int, long *, long));
+inline static const char *
+parse_symbolic_address (CGEN_CPU_DESC cd,
+                       const char **strp,
+                       int opindex,
+                       int opinfo,
+                       enum cgen_parse_operand_result *resultp,
+                       bfd_vma *valuep)
+{
+  enum cgen_parse_operand_result result_type;
+  const char *errmsg = (* cd->parse_operand_fn)
+    (cd, CGEN_PARSE_OPERAND_SYMBOLIC, strp, opindex, opinfo,
+     &result_type, valuep);
+
+  if (errmsg == NULL
+      && result_type != CGEN_PARSE_OPERAND_RESULT_QUEUED)
+    return "symbolic expression required";
+
+  if (resultp)
+    *resultp = result_type;
+
+  return errmsg;
+}
+
+static const char *
+parse_ldd_annotation (CGEN_CPU_DESC cd,
+                     const char **strp,
+                     int opindex,
+                     unsigned long *valuep)
+{
+  const char *errmsg;
+  enum cgen_parse_operand_result result_type;
+  bfd_vma value;
+
+  if (**strp == '#' || **strp == '%')
+    {
+      if (strncasecmp (*strp + 1, "tlsdesc(", 8) == 0)
+       {
+         *strp += 9;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_TLSDESC_RELAX,
+                                          &result_type, &value);
+         if (**strp != ')')
+           return "missing ')'";
+         if (valuep)
+           *valuep = value;
+         ++*strp;
+         if (errmsg)
+           return errmsg;
+       }
+    }
+  
+  while (**strp == ' ' || **strp == '\t')
+    ++*strp;
+  
+  if (**strp != '@')
+    return "missing `@'";
+
+  ++*strp;
+
+  return NULL;
+}
+
+static const char *
+parse_call_annotation (CGEN_CPU_DESC cd,
+                      const char **strp,
+                      int opindex,
+                      unsigned long *valuep)
+{
+  const char *errmsg;
+  enum cgen_parse_operand_result result_type;
+  bfd_vma value;
+
+  if (**strp == '#' || **strp == '%')
+    {
+      if (strncasecmp (*strp + 1, "gettlsoff(", 10) == 0)
+       {
+         *strp += 11;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GETTLSOFF_RELAX,
+                                          &result_type, &value);
+         if (**strp != ')')
+           return "missing ')'";
+         if (valuep)
+           *valuep = value;
+         ++*strp;
+         if (errmsg)
+           return errmsg;
+       }
+    }
+  
+  while (**strp == ' ' || **strp == '\t')
+    ++*strp;
+  
+  if (**strp != '@')
+    return "missing `@'";
+
+  ++*strp;
+
+  return NULL;
+}
+
+static const char *
+parse_ld_annotation (CGEN_CPU_DESC cd,
+                    const char **strp,
+                    int opindex,
+                    unsigned long *valuep)
+{
+  const char *errmsg;
+  enum cgen_parse_operand_result result_type;
+  bfd_vma value;
+
+  if (**strp == '#' || **strp == '%')
+    {
+      if (strncasecmp (*strp + 1, "tlsoff(", 7) == 0)
+       {
+         *strp += 8;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_TLSOFF_RELAX,
+                                          &result_type, &value);
+         if (**strp != ')')
+           return "missing ')'";
+         if (valuep)
+           *valuep = value;
+         ++*strp;
+         if (errmsg)
+           return errmsg;
+       }
+    }
+  
+  while (**strp == ' ' || **strp == '\t')
+    ++*strp;
+  
+  if (**strp != '@')
+    return "missing `@'";
+
+  ++*strp;
+
+  return NULL;
+}
 
 static const char *
 
 static const char *
-parse_ulo16 (cd, strp, opindex, valuep)
-     CGEN_CPU_DESC cd;
-     const char **strp;
-     int opindex;
-     unsigned long *valuep;
+parse_ulo16 (CGEN_CPU_DESC cd,
+            const char **strp,
+            int opindex,
+            unsigned long *valuep)
 {
   const char *errmsg;
   enum cgen_parse_operand_result result_type;
 {
   const char *errmsg;
   enum cgen_parse_operand_result result_type;
@@ -987,7 +1085,7 @@ parse_ulo16 (cd, strp, opindex, valuep)
        {
          *strp += 4;
          errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_LO16,
        {
          *strp += 4;
          errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_LO16,
-                                      &result_type, &value);
+                                      & result_type, & value);
          if (**strp != ')')
            return "missing `)'";
          ++*strp;
          if (**strp != ')')
            return "missing `)'";
          ++*strp;
@@ -1000,86 +1098,108 @@ parse_ulo16 (cd, strp, opindex, valuep)
       if (strncasecmp (*strp + 1, "gprello(", 8) == 0)
        {
          *strp += 9;
       if (strncasecmp (*strp + 1, "gprello(", 8) == 0)
        {
          *strp += 9;
-         errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GPRELLO,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GPRELLO,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
-         if (errmsg == NULL
-             && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value &= 0xffff;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotlo(", 6) == 0)
        {
          *strp += 7;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotlo(", 6) == 0)
        {
          *strp += 7;
-         errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GOTLO,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTLO,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
-         if (errmsg == NULL
-             && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value &= 0xffff;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotfuncdesclo(", 14) == 0)
        {
          *strp += 15;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotfuncdesclo(", 14) == 0)
        {
          *strp += 15;
-         errmsg = cgen_parse_address (cd, strp, opindex,
-                                      BFD_RELOC_FRV_FUNCDESC_GOTLO,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_FUNCDESC_GOTLO,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
-         if (errmsg == NULL
-             && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value &= 0xffff;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotofflo(", 9) == 0)
        {
          *strp += 10;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotofflo(", 9) == 0)
        {
          *strp += 10;
-         errmsg = cgen_parse_address (cd, strp, opindex,
-                                      BFD_RELOC_FRV_GOTOFFLO,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTOFFLO,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
-         if (errmsg == NULL
-             && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value &= 0xffff;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotofffuncdesclo(", 17) == 0)
        {
          *strp += 18;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotofffuncdesclo(", 17) == 0)
        {
          *strp += 18;
-         errmsg = cgen_parse_address (cd, strp, opindex,
-                                      BFD_RELOC_FRV_FUNCDESC_GOTOFFLO,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_FUNCDESC_GOTOFFLO,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "gottlsdesclo(", 13) == 0)
+       {
+         *strp += 14;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTTLSDESCLO,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "tlsmofflo(", 10) == 0)
+       {
+         *strp += 11;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_TLSMOFFLO,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "gottlsofflo(", 12) == 0)
+       {
+         *strp += 13;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTTLSOFFLO,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
-         if (errmsg == NULL
-             && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value &= 0xffff;
          *valuep = value;
          return errmsg;
        }
     }
          *valuep = value;
          return errmsg;
        }
     }
-  return cgen_parse_signed_integer (cd, strp, opindex, valuep);
+  return cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
 }
 
 static const char *
 }
 
 static const char *
-parse_uslo16 (cd, strp, opindex, valuep)
-     CGEN_CPU_DESC cd;
-     const char **strp;
-     int opindex;
-     unsigned long *valuep;
+parse_uslo16 (CGEN_CPU_DESC cd,
+             const char **strp,
+             int opindex,
+             signed long *valuep)
 {
   const char *errmsg;
   enum cgen_parse_operand_result result_type;
 {
   const char *errmsg;
   enum cgen_parse_operand_result result_type;
@@ -1091,7 +1211,7 @@ parse_uslo16 (cd, strp, opindex, valuep)
        {
          *strp += 4;
          errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_LO16,
        {
          *strp += 4;
          errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_LO16,
-                                      &result_type, &value);
+                                      & result_type, & value);
          if (**strp != ')')
            return "missing `)'";
          ++*strp;
          if (**strp != ')')
            return "missing `)'";
          ++*strp;
@@ -1104,86 +1224,108 @@ parse_uslo16 (cd, strp, opindex, valuep)
       else if (strncasecmp (*strp + 1, "gprello(", 8) == 0)
        {
          *strp += 9;
       else if (strncasecmp (*strp + 1, "gprello(", 8) == 0)
        {
          *strp += 9;
-         errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GPRELLO,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GPRELLO,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
-         if (errmsg == NULL
-             && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value &= 0xffff;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotlo(", 6) == 0)
        {
          *strp += 7;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotlo(", 6) == 0)
        {
          *strp += 7;
-         errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GOTLO,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTLO,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
-         if (errmsg == NULL
-             && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value &= 0xffff;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotfuncdesclo(", 14) == 0)
        {
          *strp += 15;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotfuncdesclo(", 14) == 0)
        {
          *strp += 15;
-         errmsg = cgen_parse_address (cd, strp, opindex,
-                                      BFD_RELOC_FRV_FUNCDESC_GOTLO,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_FUNCDESC_GOTLO,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
-         if (errmsg == NULL
-             && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value &= 0xffff;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotofflo(", 9) == 0)
        {
          *strp += 10;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotofflo(", 9) == 0)
        {
          *strp += 10;
-         errmsg = cgen_parse_address (cd, strp, opindex,
-                                      BFD_RELOC_FRV_GOTOFFLO,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTOFFLO,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
-         if (errmsg == NULL
-             && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value &= 0xffff;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotofffuncdesclo(", 17) == 0)
        {
          *strp += 18;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotofffuncdesclo(", 17) == 0)
        {
          *strp += 18;
-         errmsg = cgen_parse_address (cd, strp, opindex,
-                                      BFD_RELOC_FRV_FUNCDESC_GOTOFFLO,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_FUNCDESC_GOTOFFLO,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "gottlsdesclo(", 13) == 0)
+       {
+         *strp += 14;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTTLSDESCLO,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "tlsmofflo(", 10) == 0)
+       {
+         *strp += 11;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_TLSMOFFLO,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "gottlsofflo(", 12) == 0)
+       {
+         *strp += 13;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTTLSOFFLO,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
-         if (errmsg == NULL
-             && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value &= 0xffff;
          *valuep = value;
          return errmsg;
        }
     }
          *valuep = value;
          return errmsg;
        }
     }
-  return cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
+  return cgen_parse_signed_integer (cd, strp, opindex, valuep);
 }
 
 static const char *
 }
 
 static const char *
-parse_uhi16 (cd, strp, opindex, valuep)
-     CGEN_CPU_DESC cd;
-     const char **strp;
-     int opindex;
-     unsigned long *valuep;
+parse_uhi16 (CGEN_CPU_DESC cd,
+            const char **strp,
+            int opindex,
+            unsigned long *valuep)
 {
   const char *errmsg;
   enum cgen_parse_operand_result result_type;
 {
   const char *errmsg;
   enum cgen_parse_operand_result result_type;
@@ -1195,86 +1337,116 @@ parse_uhi16 (cd, strp, opindex, valuep)
        {
          *strp += 4;
          errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_HI16,
        {
          *strp += 4;
          errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_HI16,
-                                      &result_type, &value);
+                                      & result_type, & value);
          if (**strp != ')')
            return "missing `)'";
          ++*strp;
          if (errmsg == NULL
              && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
          if (**strp != ')')
            return "missing `)'";
          ++*strp;
          if (errmsg == NULL
              && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value >>= 16;
+           {
+             /* If value is wider than 32 bits then be
+                careful about how we extract bits 16-31.  */
+             if (sizeof (value) > 4)
+               value &= (((bfd_vma)1 << 16) << 16) - 1;
+
+             value >>= 16;
+           }
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gprelhi(", 8) == 0)
        {
          *strp += 9;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gprelhi(", 8) == 0)
        {
          *strp += 9;
-         errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GPRELHI,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GPRELHI,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
-         if (errmsg == NULL
-             && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value >>= 16;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gothi(", 6) == 0)
        {
          *strp += 7;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gothi(", 6) == 0)
        {
          *strp += 7;
-         errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GOTHI,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTHI,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
-         if (errmsg == NULL
-             && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value >>= 16;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotfuncdeschi(", 14) == 0)
        {
          *strp += 15;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotfuncdeschi(", 14) == 0)
        {
          *strp += 15;
-         errmsg = cgen_parse_address (cd, strp, opindex,
-                                      BFD_RELOC_FRV_FUNCDESC_GOTHI,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_FUNCDESC_GOTHI,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
-         if (errmsg == NULL
-             && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value >>= 16;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotoffhi(", 9) == 0)
        {
          *strp += 10;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotoffhi(", 9) == 0)
        {
          *strp += 10;
-         errmsg = cgen_parse_address (cd, strp, opindex,
-                                      BFD_RELOC_FRV_GOTOFFHI,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTOFFHI,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
-         if (errmsg == NULL
-             && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value >>= 16;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotofffuncdeschi(", 17) == 0)
        {
          *strp += 18;
          *valuep = value;
          return errmsg;
        }
       else if (strncasecmp (*strp + 1, "gotofffuncdeschi(", 17) == 0)
        {
          *strp += 18;
-         errmsg = cgen_parse_address (cd, strp, opindex,
-                                      BFD_RELOC_FRV_FUNCDESC_GOTOFFHI,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_FUNCDESC_GOTOFFHI,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "gottlsdeschi(", 13) == 0)
+       {
+         *strp += 14;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTTLSDESCHI,
+                                          &result_type, &value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "tlsmoffhi(", 10) == 0)
+       {
+         *strp += 11;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_TLSMOFFHI,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "gottlsoffhi(", 12) == 0)
+       {
+         *strp += 13;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTTLSOFFHI,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
-         if (errmsg == NULL
-             && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
-           value >>= 16;
          *valuep = value;
          return errmsg;
        }
          *valuep = value;
          return errmsg;
        }
@@ -1283,10 +1455,10 @@ parse_uhi16 (cd, strp, opindex, valuep)
 }
 
 static long
 }
 
 static long
-parse_register_number (strp)
-     const char **strp;
+parse_register_number (const char **strp)
 {
   int regno;
 {
   int regno;
+
   if (**strp < '0' || **strp > '9')
     return -1; /* error */
 
   if (**strp < '0' || **strp > '9')
     return -1; /* error */
 
@@ -1298,11 +1470,10 @@ parse_register_number (strp)
 }
 
 static const char *
 }
 
 static const char *
-parse_spr (cd, strp, table, valuep)
-     CGEN_CPU_DESC cd;
-     const char **strp;
-     CGEN_KEYWORD * table;
-     long *valuep;
+parse_spr (CGEN_CPU_DESC cd,
+          const char **strp,
+          CGEN_KEYWORD * table,
+          long *valuep)
 {
   const char *save_strp;
   long regno;
 {
   const char *save_strp;
   long regno;
@@ -1313,10 +1484,10 @@ parse_spr (cd, strp, table, valuep)
       *strp += 4;
       regno = parse_register_number (strp);
       if (**strp != ']')
       *strp += 4;
       regno = parse_register_number (strp);
       if (**strp != ']')
-        return "missing `]'";
+        return _("missing `]'");
       ++*strp;
       if (! spr_valid (regno))
       ++*strp;
       if (! spr_valid (regno))
-       return "Special purpose register number is out of range";
+       return _("Special purpose register number is out of range");
       *valuep = regno;
       return NULL;
     }
       *valuep = regno;
       return NULL;
     }
@@ -1326,7 +1497,7 @@ parse_spr (cd, strp, table, valuep)
   if (regno != -1)
     {
       if (! spr_valid (regno))
   if (regno != -1)
     {
       if (! spr_valid (regno))
-       return "Special purpose register number is out of range";
+       return _("Special purpose register number is out of range");
       *valuep = regno;
       return NULL;
     }
       *valuep = regno;
       return NULL;
     }
@@ -1336,11 +1507,10 @@ parse_spr (cd, strp, table, valuep)
 }
 
 static const char *
 }
 
 static const char *
-parse_d12 (cd, strp, opindex, valuep)
-     CGEN_CPU_DESC cd;
-     const char **strp;
-     int opindex;
-     long *valuep;
+parse_d12 (CGEN_CPU_DESC cd,
+          const char **strp,
+          int opindex,
+          long *valuep)
 {
   const char *errmsg;
   enum cgen_parse_operand_result result_type;
 {
   const char *errmsg;
   enum cgen_parse_operand_result result_type;
@@ -1352,8 +1522,9 @@ parse_d12 (cd, strp, opindex, valuep)
       if (strncasecmp (*strp + 1, "gprel12(", 8) == 0)
         {
           *strp += 9;
       if (strncasecmp (*strp + 1, "gprel12(", 8) == 0)
         {
           *strp += 9;
-          errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GPREL12,
-                                       &result_type, &value);
+          errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GPREL12,
+                                          & result_type, & value);
           if (**strp != ')')
             return "missing `)'";
           ++*strp;
           if (**strp != ')')
             return "missing `)'";
           ++*strp;
@@ -1363,8 +1534,9 @@ parse_d12 (cd, strp, opindex, valuep)
       else if (strncasecmp (*strp + 1, "got12(", 6) == 0)
        {
          *strp += 7;
       else if (strncasecmp (*strp + 1, "got12(", 6) == 0)
        {
          *strp += 7;
-         errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GOT12,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOT12,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
@@ -1374,9 +1546,9 @@ parse_d12 (cd, strp, opindex, valuep)
       else if (strncasecmp (*strp + 1, "gotfuncdesc12(", 14) == 0)
        {
          *strp += 15;
       else if (strncasecmp (*strp + 1, "gotfuncdesc12(", 14) == 0)
        {
          *strp += 15;
-         errmsg = cgen_parse_address (cd, strp, opindex,
-                                      BFD_RELOC_FRV_FUNCDESC_GOT12,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_FUNCDESC_GOT12,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
@@ -1386,9 +1558,9 @@ parse_d12 (cd, strp, opindex, valuep)
       else if (strncasecmp (*strp + 1, "gotoff12(", 9) == 0)
        {
          *strp += 10;
       else if (strncasecmp (*strp + 1, "gotoff12(", 9) == 0)
        {
          *strp += 10;
-         errmsg = cgen_parse_address (cd, strp, opindex,
-                                      BFD_RELOC_FRV_GOTOFF12,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTOFF12,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
@@ -1398,9 +1570,45 @@ parse_d12 (cd, strp, opindex, valuep)
       else if (strncasecmp (*strp + 1, "gotofffuncdesc12(", 17) == 0)
        {
          *strp += 18;
       else if (strncasecmp (*strp + 1, "gotofffuncdesc12(", 17) == 0)
        {
          *strp += 18;
-         errmsg = cgen_parse_address (cd, strp, opindex,
-                                      BFD_RELOC_FRV_FUNCDESC_GOTOFF12,
-                                      &result_type, &value);
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_FUNCDESC_GOTOFF12,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "gottlsdesc12(", 13) == 0)
+       {
+         *strp += 14;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTTLSDESC12,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "tlsmoff12(", 10) == 0)
+       {
+         *strp += 11;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_TLSMOFF12,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "gottlsoff12(", 12) == 0)
+       {
+         *strp += 13;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTTLSOFF12,
+                                          & result_type, & value);
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
          if (**strp != ')')
            return "missing ')'";
          ++*strp;
@@ -1412,93 +1620,126 @@ parse_d12 (cd, strp, opindex, valuep)
 }
 
 static const char *
 }
 
 static const char *
-parse_s12 (cd, strp, opindex, valuep)
-     CGEN_CPU_DESC cd;
-     const char **strp;
-     int opindex;
-     long *valuep;
+parse_s12 (CGEN_CPU_DESC cd,
+          const char **strp,
+          int opindex,
+          long *valuep)
 {
   const char *errmsg;
   enum cgen_parse_operand_result result_type;
   bfd_vma value;
  
   /* Check for small data reference.  */
 {
   const char *errmsg;
   enum cgen_parse_operand_result result_type;
   bfd_vma value;
  
   /* Check for small data reference.  */
-  if ((**strp == '#' || **strp == '%')
-      && strncasecmp (*strp + 1, "gprel12(", 8) == 0)
-    {
-      *strp += 9;
-      errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GPREL12,
-                                    &result_type, &value);
-      if (**strp != ')')
-        return "missing `)'";
-      ++*strp;
-      *valuep = value;
-      return errmsg;
-    }
-  else if ((**strp == '#' || **strp == '%')
-          && strncasecmp (*strp + 1, "got12(", 6) == 0)
-    {
-      *strp += 7;
-      errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GOT12,
-                                  &result_type, &value);
-      if (**strp != ')')
-       return "missing ')'";
-      ++*strp;
-      *valuep = value;
-      return errmsg;
-    }
-  else if ((**strp == '#' || **strp == '%')
-          && strncasecmp (*strp + 1, "gotfuncdesc12(", 14) == 0)
-    {
-      *strp += 15;
-      errmsg = cgen_parse_address (cd, strp, opindex,
-                                  BFD_RELOC_FRV_FUNCDESC_GOT12,
-                                  &result_type, &value);
-      if (**strp != ')')
-       return "missing ')'";
-      ++*strp;
-      *valuep = value;
-      return errmsg;
-    }
-  else if ((**strp == '#' || **strp == '%')
-          && strncasecmp (*strp + 1, "gotoff12(", 9) == 0)
-    {
-      *strp += 10;
-      errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GOTOFF12,
-                                  &result_type, &value);
-      if (**strp != ')')
-       return "missing ')'";
-      ++*strp;
-      *valuep = value;
-      return errmsg;
-    }
-  else if ((**strp == '#' || **strp == '%')
-          && strncasecmp (*strp + 1, "gotofffuncdesc12(", 17) == 0)
-    {
-      *strp += 18;
-      errmsg = cgen_parse_address (cd, strp, opindex,
-                                  BFD_RELOC_FRV_FUNCDESC_GOTOFF12,
-                                  &result_type, &value);
-      if (**strp != ')')
-       return "missing ')'";
-      ++*strp;
-      *valuep = value;
-      return errmsg;
-    }
-  else
+  if (**strp == '#' || **strp == '%')
     {
     {
-      if (**strp == '#')
-        ++*strp;
-      return cgen_parse_signed_integer (cd, strp, opindex, valuep);
+      if (strncasecmp (*strp + 1, "gprel12(", 8) == 0)
+       {
+         *strp += 9;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GPREL12,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing `)'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "got12(", 6) == 0)
+       {
+         *strp += 7;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOT12,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "gotfuncdesc12(", 14) == 0)
+       {
+         *strp += 15;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_FUNCDESC_GOT12,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "gotoff12(", 9) == 0)
+       {
+         *strp += 10;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTOFF12,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "gotofffuncdesc12(", 17) == 0)
+       {
+         *strp += 18;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_FUNCDESC_GOTOFF12,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "gottlsdesc12(", 13) == 0)
+       {
+         *strp += 14;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTTLSDESC12,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "tlsmoff12(", 10) == 0)
+       {
+         *strp += 11;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_TLSMOFF12,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+      else if (strncasecmp (*strp + 1, "gottlsoff12(", 12) == 0)
+       {
+         *strp += 13;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GOTTLSOFF12,
+                                          & result_type, & value);
+         if (**strp != ')')
+           return "missing ')'";
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
     }
     }
+
+  if (**strp == '#')
+    ++*strp;
+  return cgen_parse_signed_integer (cd, strp, opindex, valuep);
 }
 
 static const char *
 }
 
 static const char *
-parse_u12 (cd, strp, opindex, valuep)
-     CGEN_CPU_DESC cd;
-     const char **strp;
-     int opindex;
-     long *valuep;
+parse_u12 (CGEN_CPU_DESC cd,
+          const char **strp,
+          int opindex,
+          long *valuep)
 {
   const char *errmsg;
   enum cgen_parse_operand_result result_type;
 {
   const char *errmsg;
   enum cgen_parse_operand_result result_type;
@@ -1509,8 +1750,9 @@ parse_u12 (cd, strp, opindex, valuep)
       && strncasecmp (*strp + 1, "gprel12(", 8) == 0)
     {
       *strp += 9;
       && strncasecmp (*strp + 1, "gprel12(", 8) == 0)
     {
       *strp += 9;
-      errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GPRELU12,
-                                    &result_type, &value);
+      errmsg = parse_symbolic_address (cd, strp, opindex,
+                                      BFD_RELOC_FRV_GPRELU12,
+                                      & result_type, & value);
       if (**strp != ')')
         return "missing `)'";
       ++*strp;
       if (**strp != ')')
         return "missing `)'";
       ++*strp;
@@ -1526,12 +1768,11 @@ parse_u12 (cd, strp, opindex, valuep)
 }
 
 static const char *
 }
 
 static const char *
-parse_A (cd, strp, opindex, valuep, A)
-     CGEN_CPU_DESC cd;
-     const char **strp;
-     int opindex;
-     long *valuep;
-     long A;
+parse_A (CGEN_CPU_DESC cd,
+        const char **strp,
+        int opindex,
+        unsigned long *valuep,
+        unsigned long A)
 {
   const char *errmsg;
  
 {
   const char *errmsg;
  
@@ -1543,37 +1784,34 @@ parse_A (cd, strp, opindex, valuep, A)
     return errmsg;
 
   if (*valuep != A)
     return errmsg;
 
   if (*valuep != A)
-    return "Value of A operand must be 0 or 1";
+    return _("Value of A operand must be 0 or 1");
 
   return NULL;
 }
 
 static const char *
 
   return NULL;
 }
 
 static const char *
-parse_A0 (cd, strp, opindex, valuep)
-     CGEN_CPU_DESC cd;
-     const char **strp;
-     int opindex;
-     long *valuep;
+parse_A0 (CGEN_CPU_DESC cd,
+         const char **strp,
+         int opindex,
+         unsigned long *valuep)
 {
   return parse_A (cd, strp, opindex, valuep, 0);
 }
 
 static const char *
 {
   return parse_A (cd, strp, opindex, valuep, 0);
 }
 
 static const char *
-parse_A1 (cd, strp, opindex, valuep)
-     CGEN_CPU_DESC cd;
-     const char **strp;
-     int opindex;
-     long *valuep;
+parse_A1 (CGEN_CPU_DESC cd,
+         const char **strp,
+         int opindex,
+         unsigned long *valuep)
 {
   return parse_A (cd, strp, opindex, valuep, 1);
 }
 
 static const char *
 {
   return parse_A (cd, strp, opindex, valuep, 1);
 }
 
 static const char *
-parse_even_register (cd, strP, tableP, valueP)
-     CGEN_CPU_DESC  cd;
-     const char **  strP;
-     CGEN_KEYWORD * tableP;
-     long *         valueP;
+parse_even_register (CGEN_CPU_DESC  cd,
+                    const char **  strP,
+                    CGEN_KEYWORD * tableP,
+                    long *         valueP)
 {
   const char * errmsg;
   const char * saved_star_strP = * strP;
 {
   const char * errmsg;
   const char * saved_star_strP = * strP;
@@ -1588,23 +1826,60 @@ parse_even_register (cd, strP, tableP, valueP)
 
   return errmsg;
 }
 
   return errmsg;
 }
+
+static const char *
+parse_call_label (CGEN_CPU_DESC cd,
+                 const char **strp,
+                 int opindex,
+                 int opinfo,
+                 enum cgen_parse_operand_result *resultp,
+                 bfd_vma *valuep)
+{
+  const char *errmsg;
+  bfd_vma value;
+  /* Check for small data reference.  */
+  if (opinfo == 0 && (**strp == '#' || **strp == '%'))
+    {
+      if (strncasecmp (*strp + 1, "gettlsoff(", 10) == 0)
+       {
+         *strp += 11;
+         errmsg = parse_symbolic_address (cd, strp, opindex,
+                                          BFD_RELOC_FRV_GETTLSOFF,
+                                          resultp, &value);
+         if (**strp != ')')
+           return _("missing `)'");
+         ++*strp;
+         *valuep = value;
+         return errmsg;
+       }
+    }
+
+  return cgen_parse_address (cd, strp, opindex, opinfo, resultp, valuep);
+}
+
 /* -- */
 \f
 /* -- dis.c */
 /* -- */
 \f
 /* -- dis.c */
-static void print_spr
-  PARAMS ((CGEN_CPU_DESC, PTR, CGEN_KEYWORD *, long, unsigned));
-static void print_hi
-  PARAMS ((CGEN_CPU_DESC, PTR, long, unsigned, bfd_vma, int));
-static void print_lo
-  PARAMS ((CGEN_CPU_DESC, PTR, long, unsigned, bfd_vma, int));
+static void
+print_at (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+         void * dis_info,
+         long reloc_ann ATTRIBUTE_UNUSED,
+         long value ATTRIBUTE_UNUSED,
+         bfd_vma pc ATTRIBUTE_UNUSED,
+         int length ATTRIBUTE_UNUSED)
+{
+  disassemble_info *info = (disassemble_info *) dis_info;
+
+  (*info->fprintf_func) (info->stream, "@");
+}  
 
 static void
 
 static void
-print_spr (cd, dis_info, names, regno, attrs)
-     CGEN_CPU_DESC cd;
-     PTR dis_info;
-     CGEN_KEYWORD *names;
-     long regno;
-     unsigned int attrs;
+print_spr (CGEN_CPU_DESC cd,
+          void * dis_info,
+          CGEN_KEYWORD *names,
+          long regno,
+          unsigned int attrs)
 {
   /* Use the register index format for any unnamed registers.  */
   if (cgen_keyword_lookup_value (names, regno) == NULL)
 {
   /* Use the register index format for any unnamed registers.  */
   if (cgen_keyword_lookup_value (names, regno) == NULL)
@@ -1617,29 +1892,25 @@ print_spr (cd, dis_info, names, regno, attrs)
 }
 
 static void
 }
 
 static void
-print_hi (cd, dis_info, value, attrs, pc, length)
-     CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
-     PTR dis_info;
-     long value;
-     unsigned int attrs ATTRIBUTE_UNUSED;
-     bfd_vma pc ATTRIBUTE_UNUSED;
-     int length ATTRIBUTE_UNUSED;
+print_hi (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+         void * dis_info,
+         long value,
+         unsigned int attrs ATTRIBUTE_UNUSED,
+         bfd_vma pc ATTRIBUTE_UNUSED,
+         int length ATTRIBUTE_UNUSED)
 {
   disassemble_info *info = (disassemble_info *) dis_info;
 {
   disassemble_info *info = (disassemble_info *) dis_info;
-  if (value)
-    (*info->fprintf_func) (info->stream, "0x%lx", value);
-  else
-    (*info->fprintf_func) (info->stream, "hi(0x%lx)", value);
+
+  (*info->fprintf_func) (info->stream, value ? "0x%lx" : "hi(0x%lx)", value);
 }
 
 static void
 }
 
 static void
-print_lo (cd, dis_info, value, attrs, pc, length)
-     CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
-     PTR dis_info;
-     long value;
-     unsigned int attrs ATTRIBUTE_UNUSED;
-     bfd_vma pc ATTRIBUTE_UNUSED;
-     int length ATTRIBUTE_UNUSED;
+print_lo (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+         void * dis_info,
+         long value,
+         unsigned int attrs ATTRIBUTE_UNUSED,
+         bfd_vma pc ATTRIBUTE_UNUSED,
+         int length ATTRIBUTE_UNUSED)
 {
   disassemble_info *info = (disassemble_info *) dis_info;
   if (value)
 {
   disassemble_info *info = (disassemble_info *) dis_info;
   if (value)
This page took 0.04812 seconds and 4 git commands to generate.