X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Fia64-gen.c;h=cb86e9404233d077fd818f9790c0c14cc3444be3;hb=0b92ab21c5c6920cc18c05efadd3a52fbd35c825;hp=c38cc3597703f2c6b3cc01d4cfb3c9664d819c43;hpb=bad9ceeabef165dfa96e52e0071120247d6fc591;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/ia64-gen.c b/opcodes/ia64-gen.c index c38cc35977..cb86e94042 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 @@ -53,9 +54,19 @@ #include #define _(String) gettext (String) +/* This is a copy of fprintf_vma from bfd/bfd-in2.h. We have to use this + always, because we might be compiled without BFD64 defined, if configured + for a 32-bit target and --enable-targets=all is used. This will work for + both 32-bit and 64-bit hosts. */ +#define _opcode_int64_low(x) ((unsigned long) (((x) & 0xffffffff))) +#define _opcode_int64_high(x) ((unsigned long) (((x) >> 32) & 0xffffffff)) +#define opcode_fprintf_vma(s,x) \ + fprintf ((s), "%08lx%08lx", _opcode_int64_high (x), _opcode_int64_low (x)) + 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 +248,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 +1580,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 +1923,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 +2074,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))); @@ -2699,9 +2710,9 @@ print_main_table (void) ptr->name->num, ptr->opcode->type, ptr->opcode->num_outputs); - fprintf_vma (stdout, ptr->opcode->opcode); + opcode_fprintf_vma (stdout, ptr->opcode->opcode); printf ("ull, 0x"); - fprintf_vma (stdout, ptr->opcode->mask); + opcode_fprintf_vma (stdout, ptr->opcode->mask); printf ("ull, { %d, %d, %d, %d, %d }, 0x%x, %d, },\n", ptr->opcode->operands[0], ptr->opcode->operands[1], @@ -2725,7 +2736,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); + } + } }