2005-11-03 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / opcodes / ia64-gen.c
index c38cc3597703f2c6b3cc01d4cfb3c9664d819c43..e12c145bea142b758f4c9caf8cf6eb2033cc79ab 100644 (file)
@@ -1,5 +1,6 @@
 /* ia64-gen.c -- Generate a shrunk set of opcode tables
-   Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+   Copyright 1999, 2000, 2001, 2002, 2004, 2005
+   Free Software Foundation, Inc.
    Written by Bob Manson, Cygnus Solutions, <manson@cygnus.com>
 
    This file is part of GDB, GAS, and the GNU binutils.
@@ -16,8 +17,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this file; see the file COPYING.  If not, write to the
-   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
+   Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
+   02110-1301, USA.  */
 
 /* While the ia64-opc-* set of opcode tables are easy to maintain,
    they waste a tremendous amount of space.  ia64-gen rearranges the
@@ -56,6 +57,7 @@
 const char * program_name = NULL;
 int debug = 0;
 
+#define NELEMS(a) (sizeof (a) / sizeof ((a)[0]))
 #define tmalloc(X) (X *) xmalloc (sizeof (X))
 
 /* The main opcode table entry.  Each entry is a unique combination of
@@ -237,8 +239,8 @@ static int dlistlen = 0;
 static int dlisttotlen = 0;
 
 
-static void fail (const char *, ...);
-static void warn (const char *, ...);
+static void fail (const char *, ...) ATTRIBUTE_PRINTF_1;
+static void warn (const char *, ...) ATTRIBUTE_PRINTF_1;
 static struct rdep * insert_resource (const char *, enum ia64_dependency_mode);
 static int  deplist_equals (struct deplist *, struct deplist *);
 static short insert_deplist (int, unsigned short *);
@@ -1569,7 +1571,7 @@ print_dependency_table ()
   for (i=0;i < dlistlen;i++)
     {
       int len = 2;
-      printf ("static const short dep%d[] = {\n  ", i);
+      printf ("static const unsigned short dep%d[] = {\n  ", i);
       for (j=0;j < dlists[i]->len; j++)
         {
           len += printf ("%d, ", dlists[i]->deps[j]);
@@ -1912,7 +1914,7 @@ gen_dis_table (ent)
   if ((needed_bytes + insn_list_len) > tot_insn_list_len)
     {
       tot_insn_list_len += 256;
-      insn_list = (char *) xrealloc (insn_list, tot_insn_list_len);
+      insn_list = (unsigned char *) xrealloc (insn_list, tot_insn_list_len);
     }
   our_offset = insn_list_len;
   insn_list_len += needed_bytes;
@@ -2063,7 +2065,7 @@ gen_dis_table (ent)
          /* Store the address of the entry being branched to.  */
          while (currbits >= 0)
            {
-             char *byte = insn_list + our_offset + bitsused / 8;
+             unsigned char *byte = insn_list + our_offset + bitsused / 8;
 
              if (idest & (1 << currbits))
                *byte |= (1 << (7 - (bitsused % 8)));
@@ -2725,7 +2727,26 @@ shrink (table)
   int curr_opcode;
 
   for (curr_opcode = 0; table[curr_opcode].name != NULL; curr_opcode++)
-    add_opcode_entry (table + curr_opcode);
+    {
+      add_opcode_entry (table + curr_opcode);
+      if (table[curr_opcode].num_outputs == 2
+         && ((table[curr_opcode].operands[0] == IA64_OPND_P1
+              && table[curr_opcode].operands[1] == IA64_OPND_P2)
+             || (table[curr_opcode].operands[0] == IA64_OPND_P2
+                 && table[curr_opcode].operands[1] == IA64_OPND_P1)))
+       {
+         struct ia64_opcode *alias = tmalloc(struct ia64_opcode);
+         unsigned i;
+
+         *alias = table[curr_opcode];
+         for (i = 2; i < NELEMS (alias->operands); ++i)
+           alias->operands[i - 1] = alias->operands[i];
+         alias->operands[NELEMS (alias->operands) - 1] = IA64_OPND_NIL;
+         --alias->num_outputs;
+         alias->flags |= PSEUDO;
+         add_opcode_entry (alias);
+       }
+    }
 }
 \f
 
This page took 0.027176 seconds and 4 git commands to generate.