From 52a53d1f37b5648f7f01734ddbf53c214b9d589b Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Thu, 5 Nov 1998 20:22:40 +0000 Subject: [PATCH] * m32r-opc.c (m32r_cgen_insn_table_entries): Add FILL_SLOT attribute to bcl8,bncl8 entries. (macro_insn_table_entries): Add FILL_SLOT attribute to bcl8r,bncl8r entries. --- opcodes/ChangeLog | 9 + opcodes/m32r-opc.c | 1053 ++++++++++++++++++++------------------------ 2 files changed, 494 insertions(+), 568 deletions(-) diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index e1bde9912c2..724e89c39cf 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -12,6 +12,15 @@ Wed Nov 4 18:46:47 1998 Dave Brolley * po/POTFILES.in: Regenerated * po/opcodes.pot: Regenerated +start-sanitize-m32rx +Mon Nov 2 20:08:03 1998 Doug Evans + + * m32r-opc.c (m32r_cgen_insn_table_entries): Add FILL_SLOT attribute + to bcl8,bncl8 entries. + (macro_insn_table_entries): Add FILL_SLOT attribute + to bcl8r,bncl8r entries. + +end-sanitize-m32rx Mon Nov 2 15:05:33 1998 Geoffrey Noer * configure.in: detect cygwin* instead of cygwin32* diff --git a/opcodes/m32r-opc.c b/opcodes/m32r-opc.c index 55b8e32addf..27a1869579f 100644 --- a/opcodes/m32r-opc.c +++ b/opcodes/m32r-opc.c @@ -38,11 +38,76 @@ 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)); +/* Cover function to read and properly byteswap an insn value. */ + +CGEN_INSN_INT +cgen_get_insn_value (od, buf, length) + CGEN_OPCODE_DESC od; + unsigned char *buf; + int length; +{ + CGEN_INSN_INT value; + + switch (length) + { + case 8: + value = *buf; + break; + case 16: + if (CGEN_OPCODE_INSN_ENDIAN (od) == CGEN_ENDIAN_BIG) + value = bfd_getb16 (buf); + else + value = bfd_getl16 (buf); + break; + case 32: + if (CGEN_OPCODE_INSN_ENDIAN (od) == CGEN_ENDIAN_BIG) + value = bfd_getb32 (buf); + else + value = bfd_getl32 (buf); + break; + default: + abort (); + } + + return value; +} + +/* Cover function to store an insn value properly byteswapped. */ + +void +cgen_put_insn_value (od, buf, length, value) + CGEN_OPCODE_DESC od; + unsigned char *buf; + int length; + CGEN_INSN_INT value; +{ + switch (length) + { + case 8: + buf[0] = value; + break; + case 16: + if (CGEN_OPCODE_INSN_ENDIAN (od) == CGEN_ENDIAN_BIG) + bfd_putb16 (value, buf); + else + bfd_putl16 (value, buf); + break; + case 32: + if (CGEN_OPCODE_INSN_ENDIAN (od) == CGEN_ENDIAN_BIG) + bfd_putb32 (value, buf); + else + bfd_putl32 (value, buf); + break; + default: + abort (); + } +} + /* 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. LENGTH is the bit length of INSN_VALUE if known, otherwise 0. - 0 is only valid if `insn == NULL && ! defined (CGEN_INT_INSN)'. + 0 is only valid if `insn == NULL && ! CGEN_INT_INSN_P'. If INSN != NULL, LENGTH must be valid. ALIAS_P is non-zero if alias insns are to be included in the search. @@ -53,46 +118,44 @@ const CGEN_INSN * 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; + CGEN_INSN_BYTES insn_value; int length; CGEN_FIELDS *fields; int alias_p; { - char buf[16]; + unsigned char buf[16]; + unsigned char *bufp; + unsigned int base_insn; +#if CGEN_INT_INSN_P + CGEN_EXTRACT_INFO *info = NULL; +#else + CGEN_EXTRACT_INFO ex_info; + CGEN_EXTRACT_INFO *info = &ex_info; +#endif + +#if ! CGEN_INT_INSN_P + ex_info.dis_info = NULL; + ex_info.bytes = insn_value; + ex_info.valid = -1; +#endif if (!insn) { const CGEN_INSN_LIST *insn_list; -#ifdef CGEN_INT_INSN - switch (length) - { - case 8: - buf[0] = insn_value; - break; - case 16: - if (CGEN_OPCODE_ENDIAN (od) == CGEN_ENDIAN_BIG) - bfd_putb16 (insn_value, buf); - else - bfd_putl16 (insn_value, buf); - break; - case 32: - if (CGEN_OPCODE_ENDIAN (od) == CGEN_ENDIAN_BIG) - bfd_putb32 (insn_value, buf); - else - bfd_putl32 (insn_value, buf); - break; - default: - abort (); - } +#if CGEN_INT_INSN_P + cgen_put_insn_value (od, buf, length, insn_value); + bufp = buf; + base_insn = insn_value; /*???*/ #else - abort (); /* FIXME: unfinished */ + base_insn = cgen_get_insn_value (od, buf, length); + bufp = insn_value; #endif /* 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 (od, buf, insn_value); + insn_list = CGEN_DIS_LOOKUP_INSN (od, bufp, base_insn); while (insn_list != NULL) { insn = insn_list->insn; @@ -106,7 +169,7 @@ m32r_cgen_lookup_insn (od, 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)) (od, insn, NULL, + int elength = (*CGEN_EXTRACT_FN (insn)) (od, insn, info, insn_value, fields, (bfd_vma) 0); if (elength > 0) @@ -133,7 +196,7 @@ m32r_cgen_lookup_insn (od, insn, insn_value, length, fields, alias_p) abort (); /* ??? 0 is passed for `pc' */ - length = (*CGEN_EXTRACT_FN (insn)) (od, insn, NULL, insn_value, fields, + length = (*CGEN_EXTRACT_FN (insn)) (od, insn, info, insn_value, fields, (bfd_vma) 0); /* Sanity check: must succeed. Could relax this later if it ever proves useful. */ @@ -185,7 +248,7 @@ const CGEN_INSN * 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; + CGEN_INSN_BYTES insn_value; int length; int *indices; { @@ -205,6 +268,7 @@ m32r_cgen_lookup_get_insn_operands (od, insn, insn_value, length, indices) static const CGEN_ATTR_ENTRY MACH_attr[] = { + { "base", MACH_BASE }, { "m32r", MACH_M32R }, /* start-sanitize-m32rx */ { "m32rx", MACH_M32RX }, @@ -224,6 +288,18 @@ static const CGEN_ATTR_ENTRY PIPE_attr[] = }; /* end-sanitize-m32rx */ +const CGEN_ATTR_TABLE m32r_cgen_hardware_attr_table[] = +{ + { "MACH", & MACH_attr[0] }, + { "CACHE-ADDR", NULL }, + { "FUN-ACCESS", NULL }, + { "PC", NULL }, + { "PROFILE", NULL }, + { "SIGN-OPT", NULL }, + { "UNSIGNED", NULL }, + { 0, 0 } +}; + const CGEN_ATTR_TABLE m32r_cgen_operand_attr_table[] = { { "ABS-ADDR", NULL }, @@ -248,11 +324,12 @@ const CGEN_ATTR_TABLE m32r_cgen_insn_attr_table[] = { "COND-CTI", NULL }, { "FILL-SLOT", NULL }, { "NO-DIS", NULL }, - { "PARALLEL", NULL }, { "RELAX", NULL }, { "RELAXABLE", NULL }, + { "SKIP-CTI", NULL }, { "SPECIAL", NULL }, { "UNCOND-CTI", NULL }, + { "VIRTUAL", NULL }, { 0, 0 } }; @@ -292,6 +369,8 @@ CGEN_KEYWORD_ENTRY m32r_cgen_opval_h_cr_entries[] = { "spi", 2 }, { "spu", 3 }, { "bpc", 6 }, + { "bbpsw", 8 }, + { "bbpc", 14 }, { "cr0", 0 }, { "cr1", 1 }, { "cr2", 2 }, @@ -313,7 +392,7 @@ CGEN_KEYWORD_ENTRY m32r_cgen_opval_h_cr_entries[] = CGEN_KEYWORD m32r_cgen_opval_h_cr = { & m32r_cgen_opval_h_cr_entries[0], - 21 + 23 }; /* start-sanitize-m32rx */ @@ -336,29 +415,26 @@ CGEN_KEYWORD m32r_cgen_opval_h_accums = #define HW_ENT(n) m32r_cgen_hw_entries[n] static const CGEN_HW_ENTRY m32r_cgen_hw_entries[] = { - { HW_H_PC, & HW_ENT (HW_H_PC + 1), "h-pc", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_MEMORY, & HW_ENT (HW_H_MEMORY + 1), "h-memory", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_SINT, & HW_ENT (HW_H_SINT + 1), "h-sint", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_UINT, & HW_ENT (HW_H_UINT + 1), "h-uint", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_ADDR, & HW_ENT (HW_H_ADDR + 1), "h-addr", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_IADDR, & HW_ENT (HW_H_IADDR + 1), "h-iaddr", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_HI16, & HW_ENT (HW_H_HI16 + 1), "h-hi16", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_SLO16, & HW_ENT (HW_H_SLO16 + 1), "h-slo16", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_ULO16, & HW_ENT (HW_H_ULO16 + 1), "h-ulo16", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_GR, & HW_ENT (HW_H_GR + 1), "h-gr", CGEN_ASM_KEYWORD, (PTR) & m32r_cgen_opval_h_gr }, - { HW_H_CR, & HW_ENT (HW_H_CR + 1), "h-cr", CGEN_ASM_KEYWORD, (PTR) & m32r_cgen_opval_h_cr }, - { HW_H_ACCUM, & HW_ENT (HW_H_ACCUM + 1), "h-accum", CGEN_ASM_KEYWORD, (PTR) 0 }, -/* start-sanitize-m32rx */ - { HW_H_ACCUMS, & HW_ENT (HW_H_ACCUMS + 1), "h-accums", CGEN_ASM_KEYWORD, (PTR) & m32r_cgen_opval_h_accums }, -/* end-sanitize-m32rx */ - { HW_H_COND, & HW_ENT (HW_H_COND + 1), "h-cond", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_SM, & HW_ENT (HW_H_SM + 1), "h-sm", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_BSM, & HW_ENT (HW_H_BSM + 1), "h-bsm", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_IE, & HW_ENT (HW_H_IE + 1), "h-ie", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_BIE, & HW_ENT (HW_H_BIE + 1), "h-bie", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_BCOND, & HW_ENT (HW_H_BCOND + 1), "h-bcond", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_BPC, & HW_ENT (HW_H_BPC + 1), "h-bpc", CGEN_ASM_KEYWORD, (PTR) 0 }, - { HW_H_LOCK, & HW_ENT (HW_H_LOCK + 1), "h-lock", CGEN_ASM_KEYWORD, (PTR) 0 }, + { HW_H_PC, & HW_ENT (HW_H_PC + 1), "h-pc", CGEN_ASM_KEYWORD, (PTR) 0, { CGEN_HW_NBOOL_ATTRS, 0|(1<addr); -)", (PTR) 0, - { CGEN_INSN_NBOOL_ATTRS, 0, { (1<