X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=opcodes%2Fia64-gen.c;h=e12c145bea142b758f4c9caf8cf6eb2033cc79ab;hb=23572ecadc89af384c1804ad7692f32c55fbfc80;hp=c38cc3597703f2c6b3cc01d4cfb3c9664d819c43;hpb=bad9ceeabef165dfa96e52e0071120247d6fc591;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/ia64-gen.c b/opcodes/ia64-gen.c index c38cc35977..e12c145bea 100644 --- a/opcodes/ia64-gen.c +++ b/opcodes/ia64-gen.c @@ -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, 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); + } + } }