From c2009f4a31b33b3615f0425bfac096b9f3055d22 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Mon, 3 Aug 1998 19:56:43 +0000 Subject: [PATCH] Move all global state data into opcode table struct, and treat opcode table as something that is "opened/closed". * cgen-asm.c (all fns): New first arg of opcode table descriptor. (cgen_asm_init): Delete. (cgen_set_parse_operand_fn): New function. * cgen-dis.c (all fns): New first arg of opcode table descriptor. (cgen_dis_init): Delete. * cgen-opc.c (all fns): New first arg of opcode table descriptor. (cgen_current_{opcode_table_mach,endian}): Delete. * cgen-asm.in (all fns): New first arg of opcode table descriptor. * cgen-dis.in (all fns): Ditto. * cgen-opc.in (all fns): Ditto. * m32r-asm.c,m32r-dis.c,m32r-opc.c,m32r-opc.h: Regenerate. * cgen-asm.in (parse_insn_normal): Ignore case in mnemonics. * cgen-dis.in (print_normal): Split into two. (print_address): New function. (extract_insn_normal): Clarify insn_value arg. (print_int_insn): Renamed from print_insn. (print_insn): New arg. (print_insn_@arch@): Open opcode table if not already done so. Move reading of insn into print_insn. --- opcodes/ChangeLog | 30 +++++ opcodes/cgen-opc.in | 31 +++-- opcodes/m32r-opc.c | 319 +++++++++++++++++++++++++++++++++++++++----- opcodes/m32r-opc.h | 28 +++- 4 files changed, 362 insertions(+), 46 deletions(-) diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index a9bb9c2ccdc..a1ba0d37502 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,33 @@ +Mon Aug 3 12:43:16 1998 Doug Evans + + Move all global state data into opcode table struct, and treat + opcode table as something that is "opened/closed". + * cgen-asm.c (all fns): New first arg of opcode table descriptor. + (cgen_asm_init): Delete. + (cgen_set_parse_operand_fn): New function. + * cgen-dis.c (all fns): New first arg of opcode table descriptor. + (cgen_dis_init): Delete. + * cgen-opc.c (all fns): New first arg of opcode table descriptor. + (cgen_current_{opcode_table_mach,endian}): Delete. +start-sanitize-cygnus + * cgen-asm.in (all fns): New first arg of opcode table descriptor. + * cgen-dis.in (all fns): Ditto. + * cgen-opc.in (all fns): Ditto. +end-sanitize-cygnus + * m32r-asm.c,m32r-dis.c,m32r-opc.c,m32r-opc.h: Regenerate. + +start-sanitize-cygnus + * cgen-asm.in (parse_insn_normal): Ignore case in mnemonics. + + * cgen-dis.in (print_normal): Split into two. + (print_address): New function. + (extract_insn_normal): Clarify insn_value arg. + (print_int_insn): Renamed from print_insn. + (print_insn): New arg. + (print_insn_@arch@): Open opcode table if not already done so. + Move reading of insn into print_insn. + +end-sanitize-cygnus Thu Jul 30 21:41:10 1998 Frank Ch. Eigler * d30v-opc.c (d30v_opcode_table): Add new "LKR" flag to some diff --git a/opcodes/cgen-opc.in b/opcodes/cgen-opc.in index 57a03dda330..197daedd707 100644 --- a/opcodes/cgen-opc.in +++ b/opcodes/cgen-opc.in @@ -30,6 +30,14 @@ along with this program; if not, write to the Free Software Foundation, Inc., #include "@prefix@-opc.h" #include "opintl.h" +/* The hash functions are recorded here to help keep assembler code out of + the disassembler and vice versa. */ + +static int asm_hash_insn_p PARAMS ((const CGEN_INSN *)); +static unsigned int asm_hash_insn PARAMS ((const char *)); +static int dis_hash_insn_p PARAMS ((const CGEN_INSN *)); +static unsigned int dis_hash_insn PARAMS ((const char *, unsigned long)); + /* Look up instruction INSN_VALUE and extract its fields. INSN, if non-null, is the insn table entry. Otherwise INSN_VALUE is examined to compute it. @@ -42,7 +50,8 @@ along with this program; if not, write to the Free Software Foundation, Inc., wasn't recognized. */ const CGEN_INSN * -@arch@_cgen_lookup_insn (insn, insn_value, length, fields, alias_p) +@arch@_cgen_lookup_insn (od, insn, insn_value, length, fields, alias_p) + CGEN_OPCODE_DESC od; const CGEN_INSN *insn; cgen_insn_t insn_value; int length; @@ -62,13 +71,13 @@ const CGEN_INSN * buf[0] = insn_value; break; case 16: - if (cgen_current_endian == CGEN_ENDIAN_BIG) + if (CGEN_OPCODE_ENDIAN (od) == CGEN_ENDIAN_BIG) bfd_putb16 (insn_value, buf); else bfd_putl16 (insn_value, buf); break; case 32: - if (cgen_current_endian == CGEN_ENDIAN_BIG) + if (CGEN_OPCODE_ENDIAN (od) == CGEN_ENDIAN_BIG) bfd_putb32 (insn_value, buf); else bfd_putl32 (insn_value, buf); @@ -83,7 +92,7 @@ const CGEN_INSN * /* The instructions are stored in hash lists. Pick the first one and keep trying until we find the right one. */ - insn_list = CGEN_DIS_LOOKUP_INSN (buf, insn_value); + insn_list = CGEN_DIS_LOOKUP_INSN (od, buf, insn_value); while (insn_list != NULL) { insn = insn_list->insn; @@ -97,7 +106,7 @@ const CGEN_INSN * if ((insn_value & CGEN_INSN_MASK (insn)) == CGEN_INSN_VALUE (insn)) { /* ??? 0 is passed for `pc' */ - int elength = (*CGEN_EXTRACT_FN (insn)) (insn, NULL, + int elength = (*CGEN_EXTRACT_FN (insn)) (od, insn, NULL, insn_value, fields, (bfd_vma) 0); if (elength > 0) @@ -124,7 +133,7 @@ const CGEN_INSN * abort (); /* ??? 0 is passed for `pc' */ - length = (*CGEN_EXTRACT_FN (insn)) (insn, NULL, insn_value, fields, + length = (*CGEN_EXTRACT_FN (insn)) (od, insn, NULL, insn_value, fields, (bfd_vma) 0); /* Sanity check: must succeed. Could relax this later if it ever proves useful. */ @@ -141,7 +150,8 @@ const CGEN_INSN * in. */ void -@arch@_cgen_get_insn_operands (insn, fields, indices) +@arch@_cgen_get_insn_operands (od, insn, fields, indices) + CGEN_OPCODE_DESC od; const CGEN_INSN * insn; const CGEN_FIELDS * fields; int *indices; @@ -172,7 +182,8 @@ void recognized. */ const CGEN_INSN * -@arch@_cgen_lookup_get_insn_operands (insn, insn_value, length, indices) +@arch@_cgen_lookup_get_insn_operands (od, insn, insn_value, length, indices) + CGEN_OPCODE_DESC od; const CGEN_INSN *insn; cgen_insn_t insn_value; int length; @@ -182,11 +193,11 @@ const CGEN_INSN * /* Pass non-zero for ALIAS_P only if INSN != NULL. If INSN == NULL, we want a real insn. */ - insn = @arch@_cgen_lookup_insn (insn, insn_value, length, &fields, + insn = @arch@_cgen_lookup_insn (od, insn, insn_value, length, &fields, insn != NULL); if (! insn) return NULL; - @arch@_cgen_get_insn_operands (insn, &fields, indices); + @arch@_cgen_get_insn_operands (od, insn, &fields, indices); return insn; } diff --git a/opcodes/m32r-opc.c b/opcodes/m32r-opc.c index a1a1f65cde2..55b8e32addf 100644 --- a/opcodes/m32r-opc.c +++ b/opcodes/m32r-opc.c @@ -30,6 +30,14 @@ along with this program; if not, write to the Free Software Foundation, Inc., #include "m32r-opc.h" #include "opintl.h" +/* The hash functions are recorded here to help keep assembler code out of + the disassembler and vice versa. */ + +static int asm_hash_insn_p PARAMS ((const CGEN_INSN *)); +static unsigned int asm_hash_insn PARAMS ((const char *)); +static int dis_hash_insn_p PARAMS ((const CGEN_INSN *)); +static unsigned int dis_hash_insn PARAMS ((const char *, unsigned long)); + /* Look up instruction INSN_VALUE and extract its fields. INSN, if non-null, is the insn table entry. Otherwise INSN_VALUE is examined to compute it. @@ -42,7 +50,8 @@ along with this program; if not, write to the Free Software Foundation, Inc., wasn't recognized. */ const CGEN_INSN * -m32r_cgen_lookup_insn (insn, insn_value, length, fields, alias_p) +m32r_cgen_lookup_insn (od, insn, insn_value, length, fields, alias_p) + CGEN_OPCODE_DESC od; const CGEN_INSN *insn; cgen_insn_t insn_value; int length; @@ -62,13 +71,13 @@ m32r_cgen_lookup_insn (insn, insn_value, length, fields, alias_p) buf[0] = insn_value; break; case 16: - if (cgen_current_endian == CGEN_ENDIAN_BIG) + if (CGEN_OPCODE_ENDIAN (od) == CGEN_ENDIAN_BIG) bfd_putb16 (insn_value, buf); else bfd_putl16 (insn_value, buf); break; case 32: - if (cgen_current_endian == CGEN_ENDIAN_BIG) + if (CGEN_OPCODE_ENDIAN (od) == CGEN_ENDIAN_BIG) bfd_putb32 (insn_value, buf); else bfd_putl32 (insn_value, buf); @@ -83,7 +92,7 @@ m32r_cgen_lookup_insn (insn, insn_value, length, fields, alias_p) /* The instructions are stored in hash lists. Pick the first one and keep trying until we find the right one. */ - insn_list = CGEN_DIS_LOOKUP_INSN (buf, insn_value); + insn_list = CGEN_DIS_LOOKUP_INSN (od, buf, insn_value); while (insn_list != NULL) { insn = insn_list->insn; @@ -97,7 +106,7 @@ m32r_cgen_lookup_insn (insn, insn_value, length, fields, alias_p) if ((insn_value & CGEN_INSN_MASK (insn)) == CGEN_INSN_VALUE (insn)) { /* ??? 0 is passed for `pc' */ - int elength = (*CGEN_EXTRACT_FN (insn)) (insn, NULL, + int elength = (*CGEN_EXTRACT_FN (insn)) (od, insn, NULL, insn_value, fields, (bfd_vma) 0); if (elength > 0) @@ -124,7 +133,7 @@ m32r_cgen_lookup_insn (insn, insn_value, length, fields, alias_p) abort (); /* ??? 0 is passed for `pc' */ - length = (*CGEN_EXTRACT_FN (insn)) (insn, NULL, insn_value, fields, + length = (*CGEN_EXTRACT_FN (insn)) (od, insn, NULL, insn_value, fields, (bfd_vma) 0); /* Sanity check: must succeed. Could relax this later if it ever proves useful. */ @@ -141,7 +150,8 @@ m32r_cgen_lookup_insn (insn, insn_value, length, fields, alias_p) in. */ void -m32r_cgen_get_insn_operands (insn, fields, indices) +m32r_cgen_get_insn_operands (od, insn, fields, indices) + CGEN_OPCODE_DESC od; const CGEN_INSN * insn; const CGEN_FIELDS * fields; int *indices; @@ -172,7 +182,8 @@ m32r_cgen_get_insn_operands (insn, fields, indices) recognized. */ const CGEN_INSN * -m32r_cgen_lookup_get_insn_operands (insn, insn_value, length, indices) +m32r_cgen_lookup_get_insn_operands (od, insn, insn_value, length, indices) + CGEN_OPCODE_DESC od; const CGEN_INSN *insn; cgen_insn_t insn_value; int length; @@ -182,12 +193,12 @@ m32r_cgen_lookup_get_insn_operands (insn, insn_value, length, indices) /* Pass non-zero for ALIAS_P only if INSN != NULL. If INSN == NULL, we want a real insn. */ - insn = m32r_cgen_lookup_insn (insn, insn_value, length, &fields, + insn = m32r_cgen_lookup_insn (od, insn, insn_value, length, &fields, insn != NULL); if (! insn) return NULL; - m32r_cgen_get_insn_operands (insn, &fields, indices); + m32r_cgen_get_insn_operands (od, insn, &fields, indices); return insn; } /* Attributes. */ @@ -997,6 +1008,7 @@ const CGEN_INSN m32r_cgen_insn_table_entries[MAX_INSNS] = M32R_INSN_ADD, "add", "add", { { MNEM, ' ', OP (DR), ',', OP (SR), 0 } }, { 16, 16, 0xf0f0 }, 0xa0, + "(set dr (add dr sr))", (PTR) & fmt_add_ops[0], { CGEN_INSN_NBOOL_ATTRS, 0|A(PARALLEL), { (1<addr); +)", (PTR) 0, { CGEN_INSN_NBOOL_ATTRS, 0, { (1<