From 5c99495d9ee0f146eb707038aa9652fec603cdfe Mon Sep 17 00:00:00 2001 From: Duy Nguyen Date: Wed, 22 Oct 2025 03:04:13 +0000 Subject: [PATCH] rx: Update opcode decoding, disassembly, and ELF definitions This update adapts the RX binutils backend to support RXv2 and RXv3 architectures. The changes are pickup from https://llvm-gcc-renesas.com/rx/rx-latest-source-code/ Signed-off-by: Duy Nguyen --- bfd/archures.c | 1 + bfd/bfd-in2.h | 1 + bfd/cpu-rx.c | 11 +- bfd/elf32-rx.c | 202 ++++- gas/config/rx-defs.h | 27 +- gas/config/rx-parse.y | 235 ++++-- gas/config/tc-rx.c | 424 +++++++--- include/dis-asm.h | 5 +- include/elf/rx.h | 11 +- include/opcode/rx.h | 7 +- include/sim/sim-rx.h | 26 +- ld/configure.tgt | 1 + opcodes/disassemble.c | 7 + opcodes/rx-decode.c | 1727 +++++++++++++++++++++-------------------- opcodes/rx-decode.opc | 58 +- opcodes/rx-dis.c | 43 +- 16 files changed, 1671 insertions(+), 1115 deletions(-) diff --git a/bfd/archures.c b/bfd/archures.c index c4decc59e4ae..e4cede3f49d9 100644 --- a/bfd/archures.c +++ b/bfd/archures.c @@ -454,6 +454,7 @@ DESCRIPTION .#define bfd_mach_rx 0x75 .#define bfd_mach_rx_v2 0x76 .#define bfd_mach_rx_v3 0x77 +.#define bfd_mach_rx_v3_dfpu 0x78 . bfd_arch_s390, {* IBM s390. *} .#define bfd_mach_s390_31 31 .#define bfd_mach_s390_64 64 diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 40ec416ddeda..6a83ac77c89d 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -1715,6 +1715,7 @@ enum bfd_architecture #define bfd_mach_rx 0x75 #define bfd_mach_rx_v2 0x76 #define bfd_mach_rx_v3 0x77 +#define bfd_mach_rx_v3_dfpu 0x78 bfd_arch_s390, /* IBM s390. */ #define bfd_mach_s390_31 31 #define bfd_mach_s390_64 64 diff --git a/bfd/cpu-rx.c b/bfd/cpu-rx.c index a5fccbe7d6a6..a78dbdfb9801 100644 --- a/bfd/cpu-rx.c +++ b/bfd/cpu-rx.c @@ -1,5 +1,5 @@ /* BFD support for the RX processor. - Copyright (C) 2008-2024 Free Software Foundation, Inc. + Copyright (C) 2008-2025 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -27,12 +27,13 @@ bfd_default_compatible, bfd_default_scan, \ bfd_arch_default_fill, next, 0 } -static const bfd_arch_info_type arch_info_struct[2] = +static const bfd_arch_info_type arch_info_struct[4] = { - N (bfd_mach_rx_v2, "rx:v2", 3, false, arch_info_struct + 1), - N (bfd_mach_rx_v3, "rx:v3", 3, false, NULL) + N (bfd_mach_rx, "rx", 3, false, arch_info_struct + 1), + N (bfd_mach_rx_v2, "rx:v2", 3, false, arch_info_struct + 2), + N (bfd_mach_rx_v3, "rx:v3", 3, false, arch_info_struct + 3), + N (bfd_mach_rx_v3_dfpu, "rx:v3", 3, false, NULL) }; const bfd_arch_info_type bfd_rx_arch = N (bfd_mach_rx, "rx", 4, true, arch_info_struct + 0); - diff --git a/bfd/elf32-rx.c b/bfd/elf32-rx.c index db1ab777d3f7..365dabc56c01 100644 --- a/bfd/elf32-rx.c +++ b/bfd/elf32-rx.c @@ -1,5 +1,5 @@ /* Renesas RX specific support for 32-bit ELF. - Copyright (C) 2008-2024 Free Software Foundation, Inc. + Copyright (C) 2008-2025 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -671,17 +671,43 @@ rx_elf_relocate_section relocation = 0; else { + relocation += rel->r_addend; if (howto->pc_relative) { - relocation -= (input_section->output_section->vma + bfd_vma pc_pos = input_section->output_section->vma + input_section->output_offset - + rel->r_offset); + + rel->r_offset; + // sanity check + if (pc_pos > UINT32_MAX || relocation > UINT32_MAX) + { + /* xgettext:c-format */ + _bfd_error_handler(_("%pB:%pA: invalid relocation range %s "), + input_bfd, input_section, + name); + return false; + } + + uint32_t forward_jump, backward_jump; + if (relocation > pc_pos) + { + forward_jump = relocation - pc_pos; + backward_jump = UINT32_MAX - relocation + pc_pos + 1; + } + else + { + forward_jump = UINT32_MAX - pc_pos + relocation + 1; + backward_jump = pc_pos - relocation; + } + if (forward_jump < backward_jump) + relocation = forward_jump; + else + relocation = -(bfd_signed_vma)backward_jump; + if (r_type != R_RX_RH_3_PCREL && r_type != R_RX_DIR3U_PCREL) relocation ++; } - relocation += rel->r_addend; } r = bfd_reloc_ok; @@ -745,12 +771,15 @@ rx_elf_relocate_section case R_RX_RH_8_NEG: WARN_REDHAT ("RX_RH_8_NEG"); - relocation = - relocation; + relocation = -(bfd_signed_vma)relocation; /* Fall through. */ case R_RX_DIR8S_PCREL: + if(((bfd_signed_vma)relocation >= -128) && ((bfd_signed_vma)relocation <=127)) + { UNSAFE_FOR_PID; RANGE (-128, 127); OP (0) = relocation; + } break; case R_RX_DIR8S: @@ -767,7 +796,7 @@ rx_elf_relocate_section case R_RX_RH_16_NEG: WARN_REDHAT ("RX_RH_16_NEG"); - relocation = - relocation; + relocation = -(bfd_signed_vma)relocation; /* Fall through. */ case R_RX_DIR16S_PCREL: UNSAFE_FOR_PID; @@ -794,7 +823,7 @@ rx_elf_relocate_section case R_RX_DIR16S: UNSAFE_FOR_PID; - RANGE (-32768, 65535); + RANGE (-32768, 32767); /*Applied range_check_1015.patch*/ if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE)) { OP (1) = relocation; @@ -844,15 +873,18 @@ rx_elf_relocate_section break; case R_RX_DIR3U_PCREL: + if((relocation >= 3) && (relocation <=10)) + { RANGE (3, 10); OP (0) &= 0xf8; OP (0) |= relocation & 0x07; + } break; case R_RX_RH_24_NEG: UNSAFE_FOR_PID; WARN_REDHAT ("RX_RH_24_NEG"); - relocation = - relocation; + relocation = -(bfd_signed_vma)relocation; /* Fall through. */ case R_RX_DIR24S_PCREL: RANGE (-0x800000, 0x7fffff); @@ -1460,7 +1492,10 @@ rx_elf_relocate_section if (r != bfd_reloc_ok) { - const char * msg = NULL; + /* xgettext:c-format */ + const char * msg = _("%pB(%pA): internal error: unknown error"); + + bool relocation_ok = false; switch (r) { @@ -1470,15 +1505,18 @@ rx_elf_relocate_section if (r_type == R_RX_DIR24S_PCREL) /* xgettext:c-format */ msg = _("%pB(%pA): error: call to undefined function '%s'"); - else + else { (*info->callbacks->reloc_overflow) (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0, input_bfd, input_section, rel->r_offset); + relocation_ok = true; + } break; case bfd_reloc_undefined: (*info->callbacks->undefined_symbol) (info, name, input_bfd, input_section, rel->r_offset, true); + relocation_ok = true; break; case bfd_reloc_other: @@ -1502,13 +1540,13 @@ rx_elf_relocate_section break; default: - /* xgettext:c-format */ - msg = _("%pB(%pA): internal error: unknown error"); break; } - if (msg) + if (!relocation_ok) { _bfd_error_handler (msg, input_bfd, input_section, name); + return false; + } } } @@ -2456,6 +2494,7 @@ elf32_rx_relax_section (bfd *abfd, if (irel->r_addend & RX_RELAXA_IMM6) { long ssymval; + const long delta = 10000; GET_RELOC; @@ -2464,7 +2503,7 @@ elf32_rx_relax_section (bfd *abfd, code = insn[0] & 0x03; - if (code == 0 && ssymval <= 8388607 && ssymval >= -8388608) + if (code == 0 && ssymval <= 8388607 && ssymval >= -(8388608 - delta)) { unsigned int newrel = ELF32_R_TYPE (srel->r_info); @@ -2478,7 +2517,7 @@ elf32_rx_relax_section (bfd *abfd, } } - else if (code == 3 && ssymval <= 32767 && ssymval >= -32768) + else if (code == 3 && ssymval <= 32767 && ssymval >= -(32768 - delta)) { unsigned int newrel = ELF32_R_TYPE (srel->r_info); @@ -2592,7 +2631,7 @@ elf32_rx_relax_section (bfd *abfd, { int dspcode, offset = 0; long ssymval; - + const long delta = 10000; GET_RELOC; if ((insn[0] & 0xfc) == 0xfc) @@ -2611,7 +2650,7 @@ elf32_rx_relax_section (bfd *abfd, ssymval = (long) symval; code = (insn[1] >> 2) & 3; - if (code == 0 && ssymval <= 8388607 && ssymval >= -8388608) + if (code == 0 && ssymval <= 8388607 && ssymval >= -(8388608 - delta)) { unsigned int newrel = ELF32_R_TYPE (srel->r_info); @@ -2625,7 +2664,7 @@ elf32_rx_relax_section (bfd *abfd, } } - else if (code == 3 && ssymval <= 32767 && ssymval >= -32768) + else if (code == 3 && ssymval <= 32767 && ssymval >= -(32768 - delta)) { unsigned int newrel = ELF32_R_TYPE (srel->r_info); @@ -3049,7 +3088,8 @@ elf32_rx_relax_section (bfd *abfd, return true; error_return: - free (free_contents); + if (free_contents != NULL) + free (free_contents); if (shndx_buf != NULL) { @@ -3057,7 +3097,8 @@ elf32_rx_relax_section (bfd *abfd, free (shndx_buf); } - free (free_intsyms); + if (free_intsyms != NULL) + free (free_intsyms); return false; } @@ -3122,6 +3163,15 @@ describe_flags (flagword flags, char *buf) else strcat (buf, ", GCC ABI"); + if(flags & E_FLAG_RX_V1) + strcat (buf, ", V1"); + else if(flags & E_FLAG_RX_V2) + strcat (buf, ", V2"); + else if(flags & E_FLAG_RX_V3) + strcat (buf, ", V3"); + + if(flags & E_FLAG_RX_V3_DFPU) + strcat (buf, ", DFPU support"); if (flags & E_FLAG_RX_SINSNS_SET) strcat (buf, flags & E_FLAG_RX_SINSNS_YES ? ", uses String instructions" : ", bans String instructions"); @@ -3165,10 +3215,24 @@ rx_elf_merge_private_bfd_data (bfd * ibfd, struct bfd_link_info *info) old_flags &= ~ E_FLAG_RX_SINSNS_MASK; old_flags |= (new_flags & E_FLAG_RX_SINSNS_MASK); } - - known_flags = E_FLAG_RX_ABI | E_FLAG_RX_64BIT_DOUBLES - | E_FLAG_RX_DSP | E_FLAG_RX_PID | E_FLAG_RX_SINSNS_MASK; - + /* if different ISA versions update to the newest one */ + if ((new_flags & E_FLAG_RX_V3) || (old_flags & E_FLAG_RX_V3)) + { + new_flags &= ~ E_FLAG_RX_V_MASK; + new_flags |= E_FLAG_RX_V3; + old_flags &= ~ E_FLAG_RX_V_MASK; + old_flags |= E_FLAG_RX_V3; + } + else if ((new_flags & E_FLAG_RX_V2) || (old_flags & E_FLAG_RX_V2)) + { + new_flags &= ~ E_FLAG_RX_V_MASK; + new_flags |= E_FLAG_RX_V2; + old_flags &= ~ E_FLAG_RX_V_MASK; + old_flags |= E_FLAG_RX_V2; + } + known_flags = E_FLAG_RX_ABI | E_FLAG_RX_64BIT_DOUBLES | + E_FLAG_RX_DSP | E_FLAG_RX_PID | E_FLAG_RX_SINSNS_MASK | + E_FLAG_RX_V_MASK | E_FLAG_RX_V3_DFPU; if ((old_flags ^ new_flags) & known_flags) { /* Only complain if flag bits we care about do not match. @@ -3226,17 +3290,18 @@ rx_elf_print_private_bfd_data (bfd * abfd, void * ptr) static int elf32_rx_machine (bfd * abfd ATTRIBUTE_UNUSED) { -#if 0 /* FIXME: EF_RX_CPU_MASK collides with E_FLAG_RX_... - Need to sort out how these flag bits are used. - For now we assume that the flags are OK. */ - if ((elf_elfheader (abfd)->e_flags & EF_RX_CPU_MASK) == EF_RX_CPU_RX) -#endif - if ((elf_elfheader (abfd)->e_flags & E_FLAG_RX_V2)) - return bfd_mach_rx_v2; - else if ((elf_elfheader (abfd)->e_flags & E_FLAG_RX_V3)) - return bfd_mach_rx_v3; - else - return bfd_mach_rx; + const int flags = elf_elfheader (abfd)->e_flags; + + switch (flags & (E_FLAG_RX_V1|E_FLAG_RX_V2|E_FLAG_RX_V3)) { + case E_FLAG_RX_V3: + if (flags & E_FLAG_RX_V3_DFPU) + return bfd_mach_rx_v3_dfpu; + return bfd_mach_rx_v3; + case E_FLAG_RX_V2: + return bfd_mach_rx_v2; + case E_FLAG_RX_V1: + return bfd_mach_rx; + } return 0; } @@ -3260,7 +3325,7 @@ rx_elf_object_p (bfd * abfd) && abfd->target_defaulted) return false; - /* BFD->target_defaulted is not set to TRUE when a target is chosen + /* BFD->target_defaulted is not set to true when a target is chosen as a fallback, so we check for "scanning" to know when to stop using the non-swapping target. */ if (abfd->xvec == &rx_elf32_be_ns_vec @@ -3311,7 +3376,7 @@ rx_elf_object_p (bfd * abfd) The correct LMA for the section is fffc0140 + (2050-2010). */ - phdr[i].p_vaddr = sec->sh_addr + (sec->sh_offset - phdr[i].p_offset); + phdr[i].p_vaddr = sec->sh_addr - (sec->sh_offset - phdr[i].p_offset); break; } } @@ -3321,9 +3386,10 @@ rx_elf_object_p (bfd * abfd) bsec = abfd->sections; while (bsec) { - if (phdr[i].p_filesz - && phdr[i].p_vaddr <= bsec->vma - && bsec->vma <= phdr[i].p_vaddr + (phdr[i].p_filesz - 1)) + if (bsec->flags & (SEC_LOAD | SEC_ALLOC) + && phdr[i].p_vaddr > 0 + && phdr[i].p_offset <= (bfd_vma) bsec->filepos + && (bfd_vma) bsec->filepos + 1 <= phdr[i].p_offset + (phdr[i].p_filesz)) { bsec->lma = phdr[i].p_paddr + (bsec->vma - phdr[i].p_vaddr); } @@ -3724,6 +3790,59 @@ elf32_rx_modify_headers (bfd *abfd, struct bfd_link_info *info) return _bfd_elf_modify_headers (abfd, info); } +/* Issue 816133. + Note we intercept the elf_backend_section_flags vector rather than the + elf_section_from_shdr vector because the former is called from inside + _bfd_elf_make_section_from_shdr (which sets the LMA for sections) whereas + the latter is only called from some, but not all, of the places where + BFD sections are built from ELF header values. */ + + static bool + rx_set_section_flags (const Elf_Internal_Shdr * hdr) + { + bfd * abfd; + Elf_Internal_Phdr * phdr; + asection * sec; + unsigned int i; + + sec = hdr->bfd_section; + abfd = sec->owner; + + /* We are forced to set the VADDR of segments to be the same as their PADDR + when they are written out to a file. (See elf32_rx_modify_program_headers + above). This means that when we read in the section headers from such a + modified file we can find that we have sections whoes SH_ADDR field does + not match up with the P_VADDR field of any program header. This means + that the ELF_IS_SECTION_IN_SEGMENT macro will fail for this section and so + the _bfd_elf_make_section_from_shdr function call above will have defaulted + to setting the section's LMA to its VMA. + + We want to catch this effect and compute the correct LMA for the section. */ + + /* We only care about loadable sections that have real contents. */ + if ((hdr->bfd_section->flags & (SEC_ALLOC | SEC_LOAD)) != (SEC_ALLOC | SEC_LOAD) + || hdr->sh_size == 0) + return true; + + phdr = elf_tdata (abfd)->phdr; + + for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++) + { + if (phdr->p_type == PT_LOAD + /* We cannot use the VADDR of the segment to match to the + section's VMA so instead we look at file offsets. */ + && hdr->sh_offset >= phdr->p_offset + && hdr->sh_offset < phdr->p_offset + phdr->p_filesz) + { + /* FIXME: Should we check that the section ends inside the segment as well ? */ + sec->lma = phdr->p_paddr + hdr->sh_offset - phdr->p_offset; + break; + } + } + + return true; + } + /* The default literal sections should always be marked as "code" (i.e., SHF_EXECINSTR). This is particularly important for big-endian mode when we do not want their contents byte reversed. */ @@ -3829,7 +3948,7 @@ rx_table_find (struct bfd_hash_entry *vent, void *vinfo) } } - /* Return TRUE to keep scanning, FALSE to end the traversal. */ + /* Return true to keep scanning, false to end the traversal. */ return true; } @@ -4064,6 +4183,7 @@ rx_additional_link_map_text (bfd *obfd, struct bfd_link_info *info, FILE *mapfil #define elf_symbol_leading_char ('_') #define elf_backend_can_gc_sections 1 #define elf_backend_modify_headers elf32_rx_modify_headers +#define elf_backend_section_flags rx_set_section_flags #define bfd_elf32_bfd_reloc_type_lookup rx_reloc_type_lookup #define bfd_elf32_bfd_reloc_name_lookup rx_reloc_name_lookup diff --git a/gas/config/rx-defs.h b/gas/config/rx-defs.h index 1ff822d0d9c0..16d396b93838 100644 --- a/gas/config/rx-defs.h +++ b/gas/config/rx-defs.h @@ -1,5 +1,5 @@ /* rx-defs.h Renesas RX internal definitions - Copyright (C) 2008-2024 Free Software Foundation, Inc. + Copyright (C) 2008-2025 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -35,18 +35,33 @@ enum rx_cpu_types { + RX72T, + RX71M, + RX66T, + RX64M, RX600, RX610, + RX230, RX200, + RX13T, RX100, - RXV2, - RXV3, - RXV3FPU, + RX140, + RX_CPU_UNINIT +}; + +enum rx_isa_types +{ + RX_V1 = 1, + RX_V2 = 2, + RX_V3 = 3, + RX_ISA_UNINIT }; extern int rx_pid_register; extern int rx_gp_register; +extern unsigned int rx_dfpu; extern enum rx_cpu_types rx_cpu; +extern enum rx_isa_types rx_isa; extern int rx_error (const char *); extern void rx_lex_init (char *, char *); @@ -54,7 +69,11 @@ extern void rx_base1 (int); extern void rx_base2 (int, int); extern void rx_base3 (int, int, int); extern void rx_base4 (int, int, int, int); +extern void rx_base5 (int, int, int, int, int); +extern void rx_base6 (int, int, int, int, int, int); +extern void rx_base7 (int, int, int, int, int, int, int); extern void rx_field (int, int, int); +extern void rx_big_endian (int, int); extern void rx_op (expressionS, int, int); extern void rx_disp3 (expressionS, int); extern void rx_field5s (expressionS); diff --git a/gas/config/rx-parse.y b/gas/config/rx-parse.y index a8bead28d214..77c9684e9cb0 100644 --- a/gas/config/rx-parse.y +++ b/gas/config/rx-parse.y @@ -1,5 +1,5 @@ /* rx-parse.y Renesas RX parser - Copyright (C) 2008-2024 Free Software Foundation, Inc. + Copyright (C) 2008-2025 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -25,8 +25,11 @@ static int rx_lex (void); +#define COND_UN 17 #define COND_EQ 0 #define COND_NE 1 +#define COND_LT 9 +#define COND_LE 11 #define MEMEX 0x06 @@ -35,8 +38,11 @@ static int rx_lex (void); #define LSIZE 2 #define DSIZE 3 -/* .sb .sw .l .uw */ -static int sizemap[] = { BSIZE, WSIZE, LSIZE, WSIZE }; +#define ENDIAN16 1 +#define ENDIAN32 3 + +/* .sb .sw .l .uw .d */ +static int sizemap[] = { BSIZE, WSIZE, LSIZE, WSIZE, DSIZE }; /* Ok, here are the rules for using these macros... @@ -67,6 +73,9 @@ static int sizemap[] = { BSIZE, WSIZE, LSIZE, WSIZE }; #define B2(b1, b2) rx_base2 (b1, b2) #define B3(b1, b2, b3) rx_base3 (b1, b2, b3) #define B4(b1, b2, b3, b4) rx_base4 (b1, b2, b3, b4) +#define B5(b1, b2, b3, b4, b5) rx_base5 (b1, b2, b3, b4, b5) +#define B6(b1, b2, b3, b4, b5, b6) rx_base6 (b1, b2, b3, b4, b5, b6) +#define B7(b1, b2, b3, b4, b5, b6, b7) rx_base7 (b1, b2, b3, b4, b5, b6, b7) /* POS is bits from the MSB of the first byte to the LSB of the last byte. */ #define F(val,pos,sz) rx_field (val, pos, sz) @@ -106,7 +115,11 @@ static int sizemap[] = { BSIZE, WSIZE, LSIZE, WSIZE }; #define id24(a,b2,b3) B3 (0xfb + a, b2, b3) -static void rx_check_float_support (void); +static const char* rx_get_creg_name (int); +static void rx_check_float_support (void); +static void rx_check_v2 (void); +static void rx_check_v3 (void); +static void rx_check_dfpu (void); static int rx_intop (expressionS, int, int); static int rx_uintop (expressionS, int); static int rx_disp3op (expressionS); @@ -118,9 +131,6 @@ static int immediate (expressionS, int, int, int); static int displacement (expressionS, int); static void rtsd_immediate (expressionS); static void rx_range (expressionS, int, int); -static void rx_check_v2 (void); -static void rx_check_v3 (void); -static void rx_check_dfpu (void); static int need_flag = 0; static int rx_in_brackets = 0; @@ -142,11 +152,13 @@ static int sub_op2; expressionS exp; } +%define parse.error verbose + %type REG FLAG CREG BCND BMCND SCCND ACC DREG DREGH DREGL DCREG DCMP %type flag bwl bw memex %type EXPR disp -%token REG FLAG CREG ACC DREG DREGH DREGL DCREG +%token REG FLAG CREG ACC DREG DREGH DREGL DCREG CM %token EXPR UNKNOWN_OPCODE IS_OPCODE @@ -485,22 +497,32 @@ statement : /* ---------------------------------------------------------------------- */ | PUSHC CREG - { if ($2 == 13) - { rx_check_v2 (); } - if ($2 < 16) - { B2 (0x7e, 0xc0); F ($2, 12, 4); } + { const char *cname = rx_get_creg_name($2); + if (strcasecmp(cname,"extb") == 0) rx_check_v2(); + if (cname != NULL) + { + if (strcasecmp(cname,"fpsw") == 0) rx_check_float_support (); + B2 (0x7e, 0xc0); F ($2, 12, 4); + } else - as_bad (_("PUSHC can only push the first 16 control registers")); } + as_bad (_("PUSHC unknown register")); } /* ---------------------------------------------------------------------- */ | POPC CREG - { if ($2 == 13) - { rx_check_v2 (); } - if ($2 < 16) - { B2 (0x7e, 0xe0); F ($2, 12, 4); } + { const char *cname = rx_get_creg_name($2); + if (strcasecmp(cname,"extb") == 0) rx_check_v2(); + if (cname != NULL) + { + if (strcasecmp(cname,"pc") != 0) + { + if (strcasecmp(cname,"fpsw") == 0) rx_check_float_support (); + B2 (0x7e, 0xe0); F ($2, 12, 4); + } + else + as_bad (_("POPC on PC is prohibited")); } else - as_bad (_("POPC can only pop the first 16 control registers")); } + as_bad (_("POPC unknown register")); } /* ---------------------------------------------------------------------- */ @@ -538,7 +560,7 @@ statement : | SWHILE bwl { B2 (0x7f, 0x84); F ($2, 14, 2); rx_note_string_insn_use (); } | SSTR bwl - { B2 (0x7f, 0x88); F ($2, 14, 2); } + { B2 (0x7f, 0x88); F ($2, 14, 2); rx_note_string_insn_use (); } /* ---------------------------------------------------------------------- */ @@ -646,8 +668,8 @@ statement : | EMUL { sub_op = 6; } op_xchg | EMULU { sub_op = 7; } op_xchg | XCHG { sub_op = 16; } op_xchg - | ITOF { sub_op = 17; } op_xchg - | UTOF { sub_op = 21; } op_xchg + | ITOF { sub_op = 17; rx_check_float_support (); } op_xchg + | UTOF { sub_op = 21; rx_check_v2(); } op_xchg /* ---------------------------------------------------------------------- */ @@ -790,17 +812,33 @@ statement : /* ---------------------------------------------------------------------- */ | MVTC REG ',' CREG - { if ($4 == 13) - rx_check_v2 (); - id24 (2, 0x68, 0x00); F ($4 % 16, 20, 4); F ($4 / 16, 15, 1); - F ($2, 16, 4); } + { const char *cname = rx_get_creg_name($4); + if (strcasecmp(cname,"extb") == 0) rx_check_v2(); + if (cname != NULL) + { + if (strcasecmp(cname,"pc") != 0) + { + if (strcasecmp(cname,"fpsw") == 0) rx_check_float_support (); + id24 (2, 0x68, 0x00); F ($4 % 16, 20, 4); F ($4 / 16, 15, 1); + F ($2, 16, 4); + } + else + as_bad (_("MVTC on PC is prohibited")); } + else + as_bad (_("MVTC unknown register")); } /* ---------------------------------------------------------------------- */ | MVFC CREG ',' REG - { if ($2 == 13) - rx_check_v2 (); - id24 (2, 0x6a, 0); F ($2, 15, 5); F ($4, 20, 4); } + { const char *cname = rx_get_creg_name($2); + if (strcasecmp(cname,"extb") == 0) rx_check_v2(); + if (cname != NULL) + { + if (strcasecmp(cname,"fpsw") == 0) rx_check_float_support (); + id24 (2, 0x6a, 0); F ($2, 15, 5); F ($4, 20, 4); + } + else + as_bad (_("MVFC unknown register")); } /* ---------------------------------------------------------------------- */ @@ -812,9 +850,19 @@ statement : /* ---------------------------------------------------------------------- */ | MVTC '#' EXPR ',' CREG - { if ($5 == 13) - rx_check_v2 (); - id24 (2, 0x73, 0x00); F ($5, 19, 5); IMM ($3, 12); } + { const char *cname = rx_get_creg_name($5); + if (strcasecmp(cname,"extb") == 0) rx_check_v2(); + if (cname != NULL) + { + if (strcasecmp(cname,"pc") != 0) + { + if (strcasecmp(cname,"fpsw") == 0) rx_check_float_support (); + id24 (2, 0x73, 0x00); F ($5, 19, 5); IMM ($3, 12); + } + else + as_bad (_("MVTC on PC is prohibited")); } + else + as_bad (_("MVTC unknown register")); } /* ---------------------------------------------------------------------- */ @@ -909,6 +957,7 @@ statement : as_bad (_("RDACW expects #1 or #2"));} /* ---------------------------------------------------------------------- */ + /* LEFT these unchanged */ | BFMOV { rx_check_v3(); sub_op = 1; } op_bfield | BFMOVZ { rx_check_v3(); sub_op = 0; } op_bfield @@ -928,8 +977,27 @@ statement : | DDIV { rx_check_dfpu(); sub_op = 0x05; } double3_op | DMUL { rx_check_dfpu(); sub_op = 0x02; } double3_op | DSUB { rx_check_dfpu(); sub_op = 0x01; } double3_op - | DCMP DREG ',' DREG { rx_check_dfpu(); - B4(0x76, 0x90, 0x08, 0x00); F($1, 24, 4); F($2, 28, 4); F($4, 16, 4); } + + | DCMP DREG ',' DREG { rx_check_dfpu(); } + { + switch ($1) + { + case COND_UN: + { B4 (0x76, 0x90, 0x08, 0x10); F ($4, 16, 4); F ($2, 28, 4);} + break; + case COND_EQ: + { B4 (0x76, 0x90, 0x08, 0x20); F ($4, 16, 4); F ($2, 28, 4);} + break; + case COND_LT: + { B4 (0x76, 0x90, 0x08, 0x40); F ($4, 16, 4); F ($2, 28, 4);} + break; + case COND_LE: + { B4 (0x76, 0x90, 0x08, 0x60); F ($4, 16, 4); F ($2, 28, 4);} + break; + default: rx_error (_("CM must be UN, EQ, LT or LE")); + } + } + | DMOV DOT_D REG ',' DREGH { rx_check_dfpu(); B4(0xfd, 0x77, 0x80, 0x03); F($3, 20, 4); F($5, 24, 4); } @@ -951,17 +1019,27 @@ statement : | DMOV DOT_D DREG ',' '[' REG ']' { rx_check_dfpu(); B4(0xfc, 0x78, 0x08, 0x00); F($6, 16, 4); F($3, 24, 4); } - | DMOV DOT_D DREG ',' disp '[' REG ']' - { rx_check_dfpu(); - B3(0xfc, 0x78, 0x08); F($7, 16, 4); DSP($5, 14, DSIZE); - POST($3 << 4); } + + | DMOV DOT_D DREG ',' disp '[' REG ']' { rx_check_dfpu(); } + { + if (exp_val ($5) >= 0 && exp_val($5) <= 954) + { B5 (0xfc, 0x79, 0x08, 0x00, 0x00); F ($7, 16, 4); F ($3, 32, 4); F ((exp_val($5) / 4), 24, 8); } + else + { B6 (0xfc, 0x7a, 0x08, 0x00, 0x00, 0x00); F ($7, 16, 4); F ($3, 40, 4); F ((exp_val($5) / 4), 24, 16); rx_big_endian (24, ENDIAN16);} + } + | DMOV DOT_D '[' REG ']' ',' DREG { rx_check_dfpu(); B4(0xfc, 0xc8, 0x08, 0x00); F($4, 16, 4); F($7, 24, 4); } - | DMOV DOT_D disp '[' REG ']' ',' DREG - { rx_check_dfpu(); - B3(0xfc, 0xc8, 0x08); F($5, 16, 4); DSP($3, 14, DSIZE); - POST($8 << 4); } + + | DMOV DOT_D disp '[' REG ']' ',' DREG { rx_check_dfpu(); } + { + if (exp_val ($3) >= 0 && exp_val($3)<= 954) + { B5 (0xfc, 0xc9, 0x08, 0x00, 0x00); F ($5, 16, 4); F ($8, 32, 4); F ((exp_val($3) / 4), 24, 8);} + else + { B6 (0xfc, 0xca, 0x08, 0x00, 0x00, 0x00); F ($5, 16, 4); F ($8, 40, 4); F ((exp_val($3) / 4), 24, 16); rx_big_endian (24, ENDIAN16);} + } + | DMOV DOT_D '#' EXPR ',' DREGH { rx_check_dfpu(); B3(0xf9, 0x03, 0x03); F($6, 16, 4); IMM($4, -1); } @@ -971,18 +1049,27 @@ statement : | DMOV DOT_L '#' EXPR ',' DREGL { rx_check_dfpu(); B3(0xf9, 0x03, 0x00); F($6, 16, 4); IMM($4, -1); } - | DPOPM DOT_D DREG '-' DREG - { rx_check_dfpu(); - B3(0x75, 0xb8, 0x00); F($3, 16, 4); F($5 - $3, 20, 4); } - | DPOPM DOT_L DCREG '-' DCREG - { rx_check_dfpu(); - B3(0x75, 0xa8, 0x00); F($3, 16, 4); F($5 - $3, 20, 4); } - | DPUSHM DOT_D DREG '-' DREG - { rx_check_dfpu(); - B3(0x75, 0xb0, 0x00); F($3, 16, 4); F($5 - $3, 20, 4); } - | DPUSHM DOT_L DCREG '-' DCREG - { rx_check_dfpu(); - B3(0x75, 0xa0, 0x00); F($3, 16, 4); F($5 - $3, 20, 4); } + + | DPOPM DOT_D DREG '-' DREG { rx_check_dfpu(); } + { B3 (0x75, 0xB8, 0x00); F ($3, 16, 4); F ($5 - $3, 20, 4); } + { if ($3 > $5) + rx_error (_("DPOPM first reg must be <= second reg")); } + + | DPOPM DOT_L DCREG '-' DCREG { rx_check_dfpu(); } + { B3 (0x75, 0xA8, 0x00); F ($3, 16, 4); F ($5 - $3, 20, 4); } + { if ($3 > $5) + rx_error (_("DPOPM first reg must be <= second reg")); } + + | DPUSHM DOT_D DREG '-' DREG { rx_check_dfpu(); } + { B3 (0x75, 0xB0, 0x00); F ($3, 16, 4); F ($5 - $3, 20, 4); } + { if ($3 > $5) + rx_error (_("DPUSHM first reg must be <= second reg")); } + + | DPUSHM DOT_L DCREG '-' DCREG { rx_check_dfpu(); } + { B3 (0x75, 0xA0, 0x00); F ($3, 16, 4); F ($5 - $3, 20, 4); } + { if ($3 > $5) + rx_error (_("DPUSHM first reg must be <= second reg")); } + | MVFDC DCREG ',' REG { rx_check_dfpu(); B4(0xfd, 0x75, 0x80, 0x04); F($2, 24, 4); F($4, 20, 4); } @@ -990,16 +1077,16 @@ statement : { rx_check_dfpu(); B3(0x75, 0x90, 0x1b); } | MVTDC REG ',' DCREG { rx_check_dfpu(); - B4(0xfd, 0x77, 0x80, 0x04); F($2, 24, 4); F($4, 20, 4); } + B4(0xfd, 0x77, 0x80, 0x04); F($2, 20, 4); F($4, 24, 4); } | FTOD REG ',' DREG { rx_check_dfpu(); - B4(0xfd, 0x77, 0x80, 0x0a); F($2, 24, 4); F($4, 20, 4); } + B4(0xfd, 0x77, 0x80, 0x0a); F($2, 20, 4); F($4, 24, 4); } | ITOD REG ',' DREG { rx_check_dfpu(); - B4(0xfd, 0x77, 0x80, 0x09); F($2, 24, 4); F($4, 20, 4); } + B4(0xfd, 0x77, 0x80, 0x09); F($2, 20, 4); F($4, 24, 4); } | UTOD REG ',' DREG { rx_check_dfpu(); - B4(0xfd, 0x77, 0x80, 0x0d); F($2, 24, 4); F($4, 20, 4); } + B4(0xfd, 0x77, 0x80, 0x0d); F($2, 20, 4); F($4, 24, 4); } /* ---------------------------------------------------------------------- */ @@ -1038,6 +1125,8 @@ op_dp20_rm | disp '[' REG ']' memex ',' REG { B4 (MEMEX, 0x20 + ($5 << 6), 0x00 + sub_op, 0x00); F ($3, 24, 4); F ($7, 28, 4); DSP ($1, 14, sizemap[$5]); } + | REG ',' REG ',' REG { rx_check_v3(); } + { id24 (4, 0x60, 0x00); F($5, 12, 4); F($1, 16, 4); F($3, 20, 4); } ; op_dp20_i @@ -1073,7 +1162,7 @@ op_dp20_ri | op_dp20_i ; -/* xchg, utof, itof, emul, emulu */ +/* xchg, utof, itof, emul, emulu, utof */ op_xchg : REG ',' REG { id24 (1, 0x03 + (sub_op<<2), 0); F ($1, 16, 4); F ($3, 20, 4); } @@ -1105,7 +1194,7 @@ float3_op | disp '[' REG ']' opt_l ',' REG { rx_check_float_support (); id24 (1, 0x80 + (sub_op << 2), 0); F ($3, 16, 4); F ($7, 20, 4); DSP ($1, 14, LSIZE); } | REG ',' REG ',' REG - { rx_check_v2 (); id24 (4, 0x80 + (sub_op << 4), 0 ); F ($1, 16, 4); F ($3, 20, 4); F ($5, 12, 4); } + { rx_check_float_support (); rx_check_v2 (); id24 (4, 0x80 + (sub_op << 4), 0 ); F ($1, 16, 4); F ($3, 20, 4); F ($5, 12, 4); } ; float2_op @@ -1154,7 +1243,7 @@ op_xor ; op_bfield - : { rx_check_v3(); } + : { } '#' EXPR ',' '#' EXPR ',' '#' EXPR ',' REG ',' REG { rx_range($3, 0, 31); rx_range($6, 0, 31); rx_range($9, 1, 31); B3(0xfc, 0x5a + (sub_op << 2), 0); F($11, 16, 4); F($13, 20, 4); @@ -1248,7 +1337,7 @@ token_table[] = /* reserved */ /* reserved */ /* reserved */ - { "wr", CREG, 7 }, + /* reserved */ { "bpsw", CREG, 8 }, { "bpc", CREG, 9 }, @@ -1279,7 +1368,7 @@ token_table[] = { "dr13", DREG, 13 }, { "dr14", DREG, 14 }, { "dr15", DREG, 15 }, - + { "drh0", DREGH, 0 }, { "drh1", DREGH, 1 }, { "drh2", DREGH, 2 }, @@ -1322,7 +1411,7 @@ token_table[] = { "DCR1", DCREG, 1 }, { "DCR2", DCREG, 2 }, { "DCR3", DCREG, 3 }, - + { ".s", DOT_S, 0 }, { ".b", DOT_B, 0 }, { ".w", DOT_W, 0 }, @@ -1498,6 +1587,7 @@ condition_opcode_table[] = { "b", BCND }, { "bm", BMCND }, { "sc", SCCND }, + { "dcmp", DCMP }, }; #define NUM_CONDITION_OPCODES (sizeof (condition_opcode_table) / sizeof (condition_opcode_table[0])) @@ -1511,6 +1601,7 @@ struct condition_symbol static struct condition_symbol condition_table[] = { { "z", 0 }, + { "un", 17 }, { "eq", 0 }, { "geu", 2 }, { "c", 2 }, @@ -2054,6 +2145,16 @@ rx_range (expressionS exp, int minv, int maxv) as_warn (_("Value %ld out of range %d..%d"), (long) val, minv, maxv); } +static const char * +rx_get_creg_name (int value) +{ + unsigned int i; + for (i = 0; i < NUM_TOKENS; i ++) + if ((token_table[i].token == CREG) && (token_table[i].val == value)) + return token_table[i].string; + return NULL; +} + static void rx_check_float_support (void) { @@ -2064,20 +2165,20 @@ rx_check_float_support (void) static void rx_check_v2 (void) { - if (rx_cpu < RXV2) + if ((rx_isa != RX_V2) && (rx_isa != RX_V3)) rx_error (_("target CPU type does not support v2 instructions")); } static void rx_check_v3 (void) { - if (rx_cpu < RXV3) + if (rx_isa != RX_V3) rx_error (_("target CPU type does not support v3 instructions")); } static void rx_check_dfpu (void) { - if (rx_cpu != RXV3FPU) - rx_error (_("target CPU type does not support double float instructions")); + if (!rx_dfpu || rx_isa != RX_V3) + rx_error (_("target CPU does not have DFPU support")); } diff --git a/gas/config/tc-rx.c b/gas/config/tc-rx.c index 157f8958e199..8ac931f61b9e 100644 --- a/gas/config/tc-rx.c +++ b/gas/config/tc-rx.c @@ -1,5 +1,5 @@ /* tc-rx.c -- Assembler for the Renesas RX - Copyright (C) 2008-2024 Free Software Foundation, Inc. + Copyright (C) 2008-2025 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -43,7 +43,7 @@ const char FLT_CHARS[] = "dD"; #ifndef TE_LINUX bool rx_use_conventional_section_names = false; -static int elf_flags = E_FLAG_RX_ABI; +static int elf_flags = E_FLAG_RX_ABI | E_FLAG_RX_V1; #else bool rx_use_conventional_section_names = true; static int elf_flags; @@ -54,8 +54,12 @@ static bool rx_pid_mode = false; static int rx_num_int_regs = 0; int rx_pid_register; int rx_gp_register; +unsigned int rx_dfpu = 0; -enum rx_cpu_types rx_cpu = RX600; +enum rx_cpu_types rx_cpu = RX_CPU_UNINIT; + +enum rx_isa_types rx_isa = RX_ISA_UNINIT; +enum rx_isa_types rx_highest_allowed_isa = RX_ISA_UNINIT; static void rx_fetchalign (int ignore ATTRIBUTE_UNUSED); @@ -74,6 +78,8 @@ enum options OPTION_USES_GCC_ABI, OPTION_USES_RX_ABI, OPTION_CPU, + OPTION_ISA, + OPTION_DFPU, OPTION_DISALLOW_STRING_INSNS, }; @@ -99,32 +105,38 @@ struct option md_longopts[] = {"relax", no_argument, NULL, OPTION_RELAX}, {"mpid", no_argument, NULL, OPTION_PID}, {"mint-register", required_argument, NULL, OPTION_INT_REGS}, - {"mgcc-abi", no_argument, NULL, OPTION_USES_GCC_ABI}, {"mrx-abi", no_argument, NULL, OPTION_USES_RX_ABI}, {"mcpu", required_argument, NULL, OPTION_CPU}, + {"misa", required_argument, NULL, OPTION_ISA}, {"mno-allow-string-insns", no_argument, NULL, OPTION_DISALLOW_STRING_INSNS}, + {"dfpu", no_argument, NULL, OPTION_DFPU}, {NULL, no_argument, NULL, 0} }; -size_t md_longopts_size = sizeof (md_longopts); +const size_t md_longopts_size = sizeof (md_longopts); struct cpu_type { const char *cpu_name; enum rx_cpu_types type; - int flag; + enum rx_isa_types highest_isa; }; struct cpu_type cpu_type_list[] = { - {"rx100", RX100, 0}, - {"rx200", RX200, 0}, - {"rx600", RX600, 0}, - {"rx610", RX610, 0}, - {"rxv2", RXV2, E_FLAG_RX_V2}, - {"rxv3", RXV3, E_FLAG_RX_V3}, - {"rxv3-dfpu", RXV3FPU, E_FLAG_RX_V3}, + {"rx100", RX100, RX_V1}, + {"rx13T", RX13T, RX_V1}, + {"rx140", RX140, RX_V2}, + {"rx200", RX200, RX_V1}, + {"rx230", RX230, RX_V2}, + {"rx600", RX600, RX_V1}, + {"rx610", RX610, RX_V1}, + {"rx64M", RX64M, RX_V2}, + {"rx66T", RX66T, RX_V3}, + {"rx71M", RX71M, RX_V2}, + {"rx72T", RX72T, RX_V3} }; + int md_parse_option (int c ATTRIBUTE_UNUSED, const char * arg ATTRIBUTE_UNUSED) { @@ -171,29 +183,50 @@ md_parse_option (int c ATTRIBUTE_UNUSED, const char * arg ATTRIBUTE_UNUSED) rx_num_int_regs = atoi (optarg); return 1; - case OPTION_USES_GCC_ABI: - elf_flags &= ~ E_FLAG_RX_ABI; - return 1; - case OPTION_USES_RX_ABI: elf_flags |= E_FLAG_RX_ABI; return 1; case OPTION_CPU: { - unsigned int i; - for (i = 0; i < ARRAY_SIZE (cpu_type_list); i++) - { - if (strcasecmp (arg, cpu_type_list[i].cpu_name) == 0) - { - rx_cpu = cpu_type_list[i].type; - elf_flags |= cpu_type_list[i].flag; - return 1; - } - } - as_warn (_("unrecognised RX CPU type %s"), arg); - break; + unsigned int i; + for (i = 0; i < ARRAY_SIZE (cpu_type_list); i++) + { + if (strcasecmp (arg, cpu_type_list[i].cpu_name) == 0) + { + rx_cpu = cpu_type_list[i].type; + rx_highest_allowed_isa = cpu_type_list[i].highest_isa; + return 1; + } + } + as_warn (_("unrecognised RX CPU type %s"), arg); + break; + } + + case OPTION_ISA: + if (strcasecmp (arg, "v3") == 0) + { + rx_isa = RX_V3; } + else if (strcasecmp (arg, "v2") == 0) + { + rx_isa = RX_V2; + } + else if (strcasecmp (arg, "v1") == 0) + { + rx_isa = RX_V1; + } + else + { + as_warn (_("unrecognised RX ISA type %s"), arg); + break; + } + return 1; + + case OPTION_DFPU: + rx_dfpu = 1; + elf_flags |= E_FLAG_RX_V3_DFPU; + return 1; case OPTION_DISALLOW_STRING_INSNS: elf_flags |= E_FLAG_RX_SINSNS_SET | E_FLAG_RX_SINSNS_NO; @@ -217,8 +250,10 @@ md_show_usage (FILE * stream) fprintf (stream, _(" --mrelax\n")); fprintf (stream, _(" --mpid\n")); fprintf (stream, _(" --mint-register=\n")); - fprintf (stream, _(" --mcpu=\n")); + fprintf (stream, _(" --mcpu=\n")); + fprintf (stream, _(" --misa=\n")); fprintf (stream, _(" --mno-allow-string-insns")); + /*Applied 5th Hunk manually */ } static void @@ -408,7 +443,7 @@ parse_rx_section (char * name) asection * sec; int type; int attr = SHF_ALLOC | SHF_EXECINSTR; - int align = 1; + int align = 0; char end_char; do @@ -645,6 +680,10 @@ const pseudo_typeS md_pseudo_table[] = { "word", cons, 4 }, { "fetchalign", rx_fetchalign, 0 }, + /*Applied binpatch130_462.txt*/ + {"file", (void (*) (int)) dwarf2_directive_file, 0}, + {"loc", dwarf2_directive_loc, 0}, + {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0}, /* End of list marker. */ { NULL, NULL, 0 } @@ -689,6 +728,40 @@ md_begin (void) S_SET_VALUE (rx_gpreg_symbol, rx_gp_register); S_SET_SEGMENT (rx_gpreg_symbol, absolute_section); } + + switch (rx_isa) + { + case RX_V3: + if ((rx_cpu != RX_CPU_UNINIT) && (rx_highest_allowed_isa < RX_V3)) + as_bad ("RXv3 ISA is not supported for this CPU"); + break; + case RX_V2: + if ((rx_cpu != RX_CPU_UNINIT) && (rx_highest_allowed_isa < RX_V2)) + as_bad("RXv2 ISA is not supported for this CPU"); + break; + case RX_V1: + /* all cpu's support v1 (backward compatible) */ + break; + case RX_ISA_UNINIT: + if (rx_cpu == RX_CPU_UNINIT) + { + rx_cpu = RX600; + rx_highest_allowed_isa = RX_V1; + } + rx_isa = rx_highest_allowed_isa; + break; + } + + if(rx_isa == RX_V2) + { + elf_flags &= ~E_FLAG_RX_V1; + elf_flags |= E_FLAG_RX_V2; + } + if(rx_isa == RX_V3) + { + elf_flags &= ~E_FLAG_RX_V1; + elf_flags |= E_FLAG_RX_V3; + } } char * rx_lex_start; @@ -700,7 +773,7 @@ char * rx_lex_end; typedef struct rx_bytesT { - char base[4]; + char base[8]; /* If this is negative, it's a special-purpose frag as per the defines above. */ int n_base; char ops[8]; @@ -854,6 +927,42 @@ rx_base4 (int b1, int b2, int b3, int b4) rx_bytes.n_base = 4; } +void +rx_base5 (int b1, int b2, int b3, int b4, int b5) +{ + rx_bytes.base[0] = b1; + rx_bytes.base[1] = b2; + rx_bytes.base[2] = b3; + rx_bytes.base[3] = b4; + rx_bytes.base[4] = b5; + rx_bytes.n_base = 5; +} + +void +rx_base6 (int b1, int b2, int b3, int b4, int b5, int b6) +{ + rx_bytes.base[0] = b1; + rx_bytes.base[1] = b2; + rx_bytes.base[2] = b3; + rx_bytes.base[3] = b4; + rx_bytes.base[4] = b5; + rx_bytes.base[5] = b6; + rx_bytes.n_base = 6; +} + +void +rx_base7 (int b1, int b2, int b3, int b4, int b5, int b6, int b7) +{ + rx_bytes.base[0] = b1; + rx_bytes.base[1] = b2; + rx_bytes.base[2] = b3; + rx_bytes.base[3] = b4; + rx_bytes.base[4] = b5; + rx_bytes.base[5] = b6; + rx_bytes.base[6] = b7; + rx_bytes.n_base = 7; +} + /* This gets complicated when the field spans bytes, because fields are numbered from the MSB of the first byte as zero, and bits are stored LSB towards the LSB of the byte. Thus, a simple four-bit @@ -870,16 +979,27 @@ rx_field (int val, int pos, int sz) int bytep, bitp; if (sz > 0) + { + if ((val < 0 || val >= (1LL << sz)) && sz < 32) + { + as_bad(_("Value %d doesn't fit in unsigned %d-bit field"), val, sz); + } + else if (sz == 32) { - if (val < 0 || val >= (1 << sz)) - as_bad (_("Value %d doesn't fit in unsigned %d-bit field"), val, sz); + if ((unsigned int)val > 0xffffffff || val >= (1LL << sz)) + { + as_bad(_("Value %d doesn't fit in unsigned %d-bit field"), val, sz); + } } + } else + { + sz = -sz; + if (val < -(1LL << (sz - 1)) || val >= (1LL << (sz - 1))) { - sz = - sz; - if (val < -(1 << (sz - 1)) || val >= (1 << (sz - 1))) - as_bad (_("Value %d doesn't fit in signed %d-bit field"), val, sz); + as_bad(_("Value %d doesn't fit in signed %d-bit field"), val, sz); } + } /* This code points at 'M' in the above example. */ bytep = pos / 8; @@ -959,6 +1079,29 @@ rx_bfield(expressionS s, expressionS d, expressionS w) rx_bytes.n_ops = 2; } +void +rx_big_endian (int pos, int sz) +{ + int byte = pos / 8; + int done = 1; + int end = byte + sz; + + while (done) + { + if (byte <= end) + { + char tmp = rx_bytes.base[byte]; + //printf ("Op: 0x%x\n", rx_bytes.base[byte]); + rx_bytes.base[byte] = rx_bytes.base[end]; + rx_bytes.base[end] = tmp; + } + else + done = 0; + byte++; + end--; + } +} + #define OP(x) rx_bytes.ops[rx_bytes.n_ops++] = (x) #define F_PRECISION 2 @@ -1128,6 +1271,8 @@ md_assemble (char * str) fragS * frag_then = frag_now; expressionS *exp; + dwarf2_emit_insn (0); /*applied gas-rx-list_462.patch */ + memset (& rx_bytes, 0, sizeof (rx_bytes)); rx_lex_init (str, str + strlen (str)); @@ -1303,7 +1448,7 @@ static unsigned char *nops[] = { NULL, nop_1, nop_2, nop_3, nop_4, nop_5, nop_6, void rx_handle_align (fragS * frag) { - /* If handling an alignment frag, use an optimal NOP pattern. + /* If handling an alignment frag in a code section, use an optimal NOP pattern. Only do this if a fill value has not already been provided. FIXME: This test fails if the provided fill value is zero. */ if ((frag->fr_type == rs_align @@ -1319,10 +1464,33 @@ rx_handle_align (fragS * frag) { if (count > BIGGEST_NOP) { - base[0] = 0x2e; - base[1] = count; - frag->fr_var = 2; - } + if (count < 256) + { + base[0] = 0x2e; /* BRA.B */ + base[1] = count; + base[2] = 0; + frag->fr_fix += 2; + } + else if (count < (1 << 16)) + { + base[0] = 0x38; /* BRA.W */ + base[1] = count & 0xFF; + base[2] = count >> 8; + base[3] = 0; + frag->fr_fix += 3; + } + else + { + gas_assert(count < (1 << 25)); + base[0] = 0x04; /* BRA.L */ + base[1] = count & 0xFF; + base[2] = count >> 8; + base[3] = count >> 16; + base[4] = 0; + frag->fr_fix += 4; + } + frag->fr_var = 1; + } else if (count > 0) { memcpy (base, nops[count], count); @@ -2466,11 +2634,11 @@ tc_gen_reloc (asection * sec ATTRIBUTE_UNUSED, fixS * fixp) fixp->fx_subsy = NULL; } - reloc[0] = XNEW (arelent); - reloc[0]->sym_ptr_ptr = XNEW (asymbol *); - * reloc[0]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); - reloc[0]->address = fixp->fx_frag->fr_address + fixp->fx_where; - reloc[0]->addend = fixp->fx_offset; + reloc[0] = notes_alloc (sizeof (arelent)); + reloc[0]->sym_ptr_ptr = notes_alloc (sizeof (asymbol *)); + *reloc[0]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); + reloc[0]->address = fixp->fx_frag->fr_address + fixp->fx_where; + reloc[0]->addend = fixp->fx_offset; if (fixp->fx_r_type == BFD_RELOC_RX_32_OP && fixp->fx_subsy) @@ -2487,54 +2655,54 @@ tc_gen_reloc (asection * sec ATTRIBUTE_UNUSED, fixS * fixp) switch (fixp->fx_r_type) { case BFD_RELOC_RX_DIFF: - reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); - - reloc[1] = XNEW (arelent); - reloc[1]->sym_ptr_ptr = XNEW (asymbol *); - * reloc[1]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy); - reloc[1]->address = fixp->fx_frag->fr_address + fixp->fx_where; - reloc[1]->addend = 0; - reloc[1]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); - - reloc[2] = XNEW (arelent); - reloc[2]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_OP_SUBTRACT); - reloc[2]->addend = 0; - reloc[2]->sym_ptr_ptr = reloc[1]->sym_ptr_ptr; - reloc[2]->address = fixp->fx_frag->fr_address + fixp->fx_where; - - reloc[3] = XNEW (arelent); + reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); + + reloc[1] = notes_alloc (sizeof (arelent)); + reloc[1]->sym_ptr_ptr = notes_alloc (sizeof (asymbol *)); + *reloc[1]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy); + reloc[1]->address = fixp->fx_frag->fr_address + fixp->fx_where; + reloc[1]->addend = 0; + reloc[1]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); + + reloc[2] = notes_alloc (sizeof (arelent)); + reloc[2]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_OP_SUBTRACT); + reloc[2]->addend = 0; + reloc[2]->sym_ptr_ptr = reloc[1]->sym_ptr_ptr; + reloc[2]->address = fixp->fx_frag->fr_address + fixp->fx_where; + + reloc[3] = notes_alloc (sizeof (arelent)); switch (fixp->fx_size) { case 1: - reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS8); + reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS8); break; case 2: if (!is_opcode && target_big_endian) - reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS16_REV); + reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS16_REV); else if (is_opcode) - reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS16UL); + reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS16UL); else - reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS16); + reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS16); break; case 4: if (!is_opcode && target_big_endian) - reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS32_REV); + reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS32_REV); else - reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS32); + reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS32); break; } - reloc[3]->addend = 0; + reloc[3]->addend = 0; reloc[3]->sym_ptr_ptr = reloc[1]->sym_ptr_ptr; - reloc[3]->address = fixp->fx_frag->fr_address + fixp->fx_where; + reloc[3]->address = fixp->fx_frag->fr_address + fixp->fx_where; reloc[4] = NULL; break; case BFD_RELOC_RX_GPRELL: - reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); + reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); - reloc[1] = XNEW (arelent); - reloc[1]->sym_ptr_ptr = XNEW (asymbol *); + reloc[1] = notes_alloc (sizeof (arelent)); + reloc[1]->sym_ptr_ptr = notes_alloc (sizeof (asymbol *)); if (gp_symbol == NULL) { if (symbol_table_frozen) @@ -2550,31 +2718,31 @@ tc_gen_reloc (asection * sec ATTRIBUTE_UNUSED, fixS * fixp) else gp_symbol = symbol_get_bfdsym (symbol_find_or_make ("__gp")); } - * reloc[1]->sym_ptr_ptr = gp_symbol; - reloc[1]->address = fixp->fx_frag->fr_address + fixp->fx_where; - reloc[1]->addend = 0; - reloc[1]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); - - reloc[2] = XNEW (arelent); - reloc[2]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_OP_SUBTRACT); - reloc[2]->addend = 0; + *reloc[1]->sym_ptr_ptr = gp_symbol; + reloc[1]->address = fixp->fx_frag->fr_address + fixp->fx_where; + reloc[1]->addend = 0; + reloc[1]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); + + reloc[2] = notes_alloc (sizeof (arelent)); + reloc[2]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_OP_SUBTRACT); + reloc[2]->addend = 0; reloc[2]->sym_ptr_ptr = reloc[1]->sym_ptr_ptr; - reloc[2]->address = fixp->fx_frag->fr_address + fixp->fx_where; + reloc[2]->address = fixp->fx_frag->fr_address + fixp->fx_where; - reloc[3] = XNEW (arelent); - reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS16UL); - reloc[3]->addend = 0; + reloc[3] = notes_alloc (sizeof (arelent)); + reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS16UL); + reloc[3]->addend = 0; reloc[3]->sym_ptr_ptr = reloc[1]->sym_ptr_ptr; - reloc[3]->address = fixp->fx_frag->fr_address + fixp->fx_where; + reloc[3]->address = fixp->fx_frag->fr_address + fixp->fx_where; reloc[4] = NULL; break; case BFD_RELOC_RX_GPRELW: - reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); + reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); - reloc[1] = XNEW (arelent); - reloc[1]->sym_ptr_ptr = XNEW (asymbol *); + reloc[1] = notes_alloc (sizeof (arelent)); + reloc[1]->sym_ptr_ptr = notes_alloc (sizeof (asymbol *)); if (gp_symbol == NULL) { if (symbol_table_frozen) @@ -2590,31 +2758,31 @@ tc_gen_reloc (asection * sec ATTRIBUTE_UNUSED, fixS * fixp) else gp_symbol = symbol_get_bfdsym (symbol_find_or_make ("__gp")); } - * reloc[1]->sym_ptr_ptr = gp_symbol; - reloc[1]->address = fixp->fx_frag->fr_address + fixp->fx_where; - reloc[1]->addend = 0; - reloc[1]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); - - reloc[2] = XNEW (arelent); - reloc[2]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_OP_SUBTRACT); - reloc[2]->addend = 0; + *reloc[1]->sym_ptr_ptr = gp_symbol; + reloc[1]->address = fixp->fx_frag->fr_address + fixp->fx_where; + reloc[1]->addend = 0; + reloc[1]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); + + reloc[2] = notes_alloc (sizeof (arelent)); + reloc[2]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_OP_SUBTRACT); + reloc[2]->addend = 0; reloc[2]->sym_ptr_ptr = reloc[1]->sym_ptr_ptr; - reloc[2]->address = fixp->fx_frag->fr_address + fixp->fx_where; + reloc[2]->address = fixp->fx_frag->fr_address + fixp->fx_where; - reloc[3] = XNEW (arelent); - reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS16UW); - reloc[3]->addend = 0; + reloc[3] = notes_alloc (sizeof (arelent)); + reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS16UW); + reloc[3]->addend = 0; reloc[3]->sym_ptr_ptr = reloc[1]->sym_ptr_ptr; - reloc[3]->address = fixp->fx_frag->fr_address + fixp->fx_where; + reloc[3]->address = fixp->fx_frag->fr_address + fixp->fx_where; reloc[4] = NULL; break; case BFD_RELOC_RX_GPRELB: - reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); + reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); - reloc[1] = XNEW (arelent); - reloc[1]->sym_ptr_ptr = XNEW (asymbol *); + reloc[1] = notes_alloc (sizeof (arelent)); + reloc[1]->sym_ptr_ptr = notes_alloc (sizeof (asymbol *)); if (gp_symbol == NULL) { if (symbol_table_frozen) @@ -2630,40 +2798,40 @@ tc_gen_reloc (asection * sec ATTRIBUTE_UNUSED, fixS * fixp) else gp_symbol = symbol_get_bfdsym (symbol_find_or_make ("__gp")); } - * reloc[1]->sym_ptr_ptr = gp_symbol; - reloc[1]->address = fixp->fx_frag->fr_address + fixp->fx_where; - reloc[1]->addend = 0; - reloc[1]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); - - reloc[2] = XNEW (arelent); - reloc[2]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_OP_SUBTRACT); - reloc[2]->addend = 0; + *reloc[1]->sym_ptr_ptr = gp_symbol; + reloc[1]->address = fixp->fx_frag->fr_address + fixp->fx_where; + reloc[1]->addend = 0; + reloc[1]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); + + reloc[2] = notes_alloc (sizeof (arelent)); + reloc[2]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_OP_SUBTRACT); + reloc[2]->addend = 0; reloc[2]->sym_ptr_ptr = reloc[1]->sym_ptr_ptr; - reloc[2]->address = fixp->fx_frag->fr_address + fixp->fx_where; + reloc[2]->address = fixp->fx_frag->fr_address + fixp->fx_where; - reloc[3] = XNEW (arelent); - reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS16U); - reloc[3]->addend = 0; + reloc[3] = notes_alloc (sizeof (arelent)); + reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS16U); + reloc[3]->addend = 0; reloc[3]->sym_ptr_ptr = reloc[1]->sym_ptr_ptr; - reloc[3]->address = fixp->fx_frag->fr_address + fixp->fx_where; + reloc[3]->address = fixp->fx_frag->fr_address + fixp->fx_where; reloc[4] = NULL; break; case BFD_RELOC_RX_NEG32: - reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); + reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); - reloc[1] = XNEW (arelent); - reloc[1]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_OP_NEG); - reloc[1]->addend = 0; + reloc[1] = notes_alloc (sizeof (arelent)); + reloc[1]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_OP_NEG); + reloc[1]->addend = 0; reloc[1]->sym_ptr_ptr = reloc[0]->sym_ptr_ptr; - reloc[1]->address = fixp->fx_frag->fr_address + fixp->fx_where; + reloc[1]->address = fixp->fx_frag->fr_address + fixp->fx_where; - reloc[2] = XNEW (arelent); - reloc[2]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS32); - reloc[2]->addend = 0; + reloc[2] = notes_alloc (sizeof (arelent)); + reloc[2]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS32); + reloc[2]->addend = 0; reloc[2]->sym_ptr_ptr = reloc[0]->sym_ptr_ptr; - reloc[2]->address = fixp->fx_frag->fr_address + fixp->fx_where; + reloc[2]->address = fixp->fx_frag->fr_address + fixp->fx_where; reloc[3] = NULL; break; diff --git a/include/dis-asm.h b/include/dis-asm.h index 3bdecd37a81f..321e16520553 100644 --- a/include/dis-asm.h +++ b/include/dis-asm.h @@ -368,7 +368,10 @@ extern int print_insn_mep (bfd_vma, disassemble_info *); extern int print_insn_s12z (bfd_vma, disassemble_info *); extern int print_insn_sh (bfd_vma, disassemble_info *); extern int print_insn_sparc (bfd_vma, disassemble_info *); -extern int print_insn_rx (bfd_vma, disassemble_info *); +extern int print_insn_rx (bfd_vma, disassemble_info *); +extern int print_insn_rxv2 (bfd_vma, disassemble_info *); +extern int print_insn_rxv3 (bfd_vma, disassemble_info *); +extern int print_insn_rxv3_dfpu (bfd_vma, disassemble_info *); extern int print_insn_rl78 (bfd_vma, disassemble_info *); extern int print_insn_rl78_g10 (bfd_vma, disassemble_info *); extern int print_insn_rl78_g13 (bfd_vma, disassemble_info *); diff --git a/include/elf/rx.h b/include/elf/rx.h index 1832b2730345..1195016c8fe4 100644 --- a/include/elf/rx.h +++ b/include/elf/rx.h @@ -1,5 +1,5 @@ /* RX ELF support for BFD. - Copyright (C) 2008-2024 Free Software Foundation, Inc. + Copyright (C) 2008-2025 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -123,8 +123,11 @@ END_RELOC_NUMBERS (R_RX_max) #define E_FLAG_RX_SINSNS_YES (1 << 7) /* Set if string instructions are used in the binary. */ #define E_FLAG_RX_SINSNS_NO 0 /* Bit-5 if this binary must not be linked with a string instruction using binary. */ #define E_FLAG_RX_SINSNS_MASK (3 << 6) /* Mask of bits used to determine string instruction use. */ -#define E_FLAG_RX_V2 (1 << 8) /* RX v2 instructions */ -#define E_FLAG_RX_V3 (1 << 9) /* RX v3 instructions */ +#define E_FLAG_RX_V1 (1 << 4) /* RX v1 instructions */ +#define E_FLAG_RX_V2 (1 << 5) /* RX v2 instructions */ +#define E_FLAG_RX_V3 (1 << 8) /* RX v3 instructions */ +#define E_FLAG_RX_V3_DFPU (1 << 9) /* instructions with DFPU (only for RX v3)*/ +#define E_FLAG_RX_V_MASK (19 << 4) /* Mask of bits used to determine ISA */ /* These define the addend field of R_RX_RH_RELAX relocations. */ #define RX_RELAXA_IMM6 0x00000010 /* Imm8/16/24/32 at bit offset 6. */ @@ -133,7 +136,7 @@ END_RELOC_NUMBERS (R_RX_max) #define RX_RELAXA_DSP6 0x00000080 /* Dsp0/8/16 at bit offset 6. */ #define RX_RELAXA_DSP14 0x00000100 /* Dsp0/8/16 at bit offset 14. */ #define RX_RELAXA_BRA 0x00000200 /* Any type of branch (must be decoded). */ -#define RX_RELAXA_RNUM 0x0000000f /* Number of associated relocations. */ +#define RX_RELAXA_RNUM 0x0000000f /* Number of associated relocations. */ /* These mark the place where alignment is requested, and the place where the filler bytes end. */ #define RX_RELAXA_ALIGN 0x10000000 /* Start alignment; the remaining bits are the alignment value. */ #define RX_RELAXA_ELIGN 0x20000000 /* End alignment; the remaining bits are the alignment value. */ diff --git a/include/opcode/rx.h b/include/opcode/rx.h index 834ead724c06..910c92f5ebd8 100644 --- a/include/opcode/rx.h +++ b/include/opcode/rx.h @@ -1,5 +1,5 @@ /* Opcode decoder for the Renesas RX - Copyright (C) 2008-2024 Free Software Foundation, Inc. + Copyright (C) 2008-2025 Free Software Foundation, Inc. Written by DJ Delorie This file is part of GDB, the GNU Debugger and GAS, the GNU Assembler. @@ -22,6 +22,7 @@ /* The RX decoder in libopcodes is used by the simulator, gdb's analyzer, and the disassembler. Given an opcode data source, it decodes the next opcode into the following structures. */ +#include "dis-asm.h" #ifdef __cplusplus extern "C" { @@ -250,7 +251,7 @@ typedef struct char * syntax; RX_Size size; /* By convention, these are destination, source1, source2. */ - RX_Opcode_Operand op[3]; + RX_Opcode_Operand op[5]; /* The logic here is: newflags = (oldflags & ~(int)flags_0) | flags_1 | (op_flags & flags_s) @@ -273,7 +274,7 @@ typedef struct Register numbers 0..15 are general registers. 16..31 are control registers. 32..47 are condition codes. */ -int rx_decode_opcode (unsigned long, RX_Opcode_Decoded *, int (*)(void *), void *); +int rx_decode_opcode (unsigned long, RX_Opcode_Decoded *, int (*)(void *), void *, unsigned long); #ifdef __cplusplus } diff --git a/include/sim/sim-rx.h b/include/sim/sim-rx.h index a950b26ad4ea..60998eaa3bfd 100644 --- a/include/sim/sim-rx.h +++ b/include/sim/sim-rx.h @@ -1,6 +1,6 @@ /* sim-rx.h --- interface between RX simulator and GDB. - Copyright (C) 2008-2024 Free Software Foundation, Inc. + Copyright (C) 2008-2025 Free Software Foundation, Inc. Contributed by Red Hat. @@ -49,7 +49,29 @@ enum sim_rx_regnum sim_rx_bpc_regnum, sim_rx_fintv_regnum, sim_rx_fpsw_regnum, - sim_rx_acc_regnum, + sim_rx_acc0_regnum, + sim_rx_acc1_regnum, + sim_rx_extb_regnum, + sim_rx_dr0_regnum, + sim_rx_dr1_regnum, + sim_rx_dr2_regnum, + sim_rx_dr3_regnum, + sim_rx_dr4_regnum, + sim_rx_dr5_regnum, + sim_rx_dr6_regnum, + sim_rx_dr7_regnum, + sim_rx_dr8_regnum, + sim_rx_dr9_regnum, + sim_rx_dr10_regnum, + sim_rx_dr11_regnum, + sim_rx_dr12_regnum, + sim_rx_dr13_regnum, + sim_rx_dr14_regnum, + sim_rx_dr15_regnum, + sim_rx_dpsw_regnum, + sim_rx_dcmr_regnum, + sim_rx_decnt_regnum, + sim_rx_depc_regnum, sim_rx_num_regs }; diff --git a/ld/configure.tgt b/ld/configure.tgt index f937f78b876a..e4ba8b0ed612 100644 --- a/ld/configure.tgt +++ b/ld/configure.tgt @@ -56,6 +56,7 @@ if test "${ac_default_ld_warn_rwx_segments}" = unset; then hppa*-*-* | \ mips*-*-* | \ microblaze*-*-* | \ + rx*-*-* | \ sparc*-*-* | \ v850*-*-*) ac_default_ld_warn_rwx_segments=0 diff --git a/opcodes/disassemble.c b/opcodes/disassemble.c index 347f28e06a68..a93fd5f94b68 100644 --- a/opcodes/disassemble.c +++ b/opcodes/disassemble.c @@ -401,6 +401,13 @@ disassembler (enum bfd_architecture a, #endif #ifdef ARCH_rx case bfd_arch_rx: + if (bfd_get_mach (abfd) == bfd_mach_rx_v3_dfpu) + disassemble = print_insn_rxv3_dfpu; + else if (bfd_get_mach (abfd) == bfd_mach_rx_v3) + disassemble = print_insn_rxv3; + else if (bfd_get_mach (abfd) == bfd_mach_rx_v2) + disassemble = print_insn_rxv2; + else disassemble = print_insn_rx; break; #endif diff --git a/opcodes/rx-decode.c b/opcodes/rx-decode.c index 13b9af549dec..1ffb333d5e5a 100644 --- a/opcodes/rx-decode.c +++ b/opcodes/rx-decode.c @@ -1,7 +1,7 @@ /* DO NOT EDIT! -*- buffer-read-only: t -*- vi:set ro: */ #line 1 "rx-decode.opc" /* -*- c -*- */ -/* Copyright (C) 2012-2024 Free Software Foundation, Inc. +/* Copyright (C) 2012-2025 Free Software Foundation, Inc. Contributed by Red Hat. Written by DJ Delorie. @@ -94,9 +94,9 @@ static int _ld[2] = rx->op[n].size = s ) /* This is for the BWL and BW bitfields. */ -static int SCALE[] = { 1, 2, 4, 0 }; +static int SCALE[4] = { 1, 2, 4, 0 }; /* This is for the prefix size enum. */ -static int PSCALE[] = { 4, 1, 1, 1, 2, 2, 2, 3, 4, 8 }; +static int PSCALE[RX_MAX_SIZE] = { 4, 1, 1, 1, 2, 2, 2, 3, 4, 4, 0 }; #define GET_SCALE(_indx) ((unsigned)(_indx) < ARRAY_SIZE (SCALE) ? SCALE[(_indx)] : 0) #define GET_PSCALE(_indx) ((unsigned)(_indx) < ARRAY_SIZE (PSCALE) ? PSCALE[(_indx)] : 0) @@ -290,7 +290,8 @@ int rx_decode_opcode (unsigned long pc AU, RX_Opcode_Decoded * rx, int (* getbyte)(void *), - void * ptr) + void * ptr, + unsigned long machine) { LocalData lds, * ld = &lds; unsigned char op[20] = {0}; @@ -320,7 +321,7 @@ rx_decode_opcode (unsigned long pc AU, op[0]); } SYNTAX("brk"); -#line 1050 "rx-decode.opc" +#line 1090 "rx-decode.opc" ID(brk); } @@ -335,7 +336,7 @@ rx_decode_opcode (unsigned long pc AU, op[0]); } SYNTAX("dbt"); -#line 1053 "rx-decode.opc" +#line 1093 "rx-decode.opc" ID(dbt); } @@ -350,7 +351,7 @@ rx_decode_opcode (unsigned long pc AU, op[0]); } SYNTAX("rts"); -#line 831 "rx-decode.opc" +#line 832 "rx-decode.opc" ID(rts); /*----------------------------------------------------------------------*/ @@ -368,7 +369,7 @@ rx_decode_opcode (unsigned long pc AU, op[0]); } SYNTAX("nop"); -#line 837 "rx-decode.opc" +#line 838 "rx-decode.opc" ID(nop); /*----------------------------------------------------------------------*/ @@ -386,7 +387,7 @@ rx_decode_opcode (unsigned long pc AU, op[0]); } SYNTAX("bra.a %a0"); -#line 809 "rx-decode.opc" +#line 810 "rx-decode.opc" ID(branch); DC(pc + IMMex(3)); } @@ -401,7 +402,7 @@ rx_decode_opcode (unsigned long pc AU, op[0]); } SYNTAX("bsr.a %a0"); -#line 825 "rx-decode.opc" +#line 826 "rx-decode.opc" ID(jsr); DC(pc + IMMex(3)); } @@ -418,13 +419,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_1: { /** 0000 0110 mx00 00ss rsrc rdst sub %2%S2, %1 */ -#line 567 "rx-decode.opc" +#line 568 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 567 "rx-decode.opc" +#line 568 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 567 "rx-decode.opc" +#line 568 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 567 "rx-decode.opc" +#line 568 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -437,7 +438,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("sub %2%S2, %1"); -#line 567 "rx-decode.opc" +#line 568 "rx-decode.opc" ID(sub); S2Pm(ss, rsrc, mx); SR(rdst); DR(rdst); F_OSZC; } @@ -479,13 +480,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_2: { /** 0000 0110 mx00 01ss rsrc rdst cmp %2%S2, %1 */ -#line 555 "rx-decode.opc" +#line 556 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 555 "rx-decode.opc" +#line 556 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 555 "rx-decode.opc" +#line 556 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 555 "rx-decode.opc" +#line 556 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -498,7 +499,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("cmp %2%S2, %1"); -#line 555 "rx-decode.opc" +#line 556 "rx-decode.opc" ID(sub); S2Pm(ss, rsrc, mx); SR(rdst); F_OSZC; /*----------------------------------------------------------------------*/ @@ -543,13 +544,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_3: { /** 0000 0110 mx00 10ss rsrc rdst add %1%S1, %0 */ -#line 531 "rx-decode.opc" +#line 532 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 531 "rx-decode.opc" +#line 532 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 531 "rx-decode.opc" +#line 532 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 531 "rx-decode.opc" +#line 532 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -562,7 +563,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("add %1%S1, %0"); -#line 531 "rx-decode.opc" +#line 532 "rx-decode.opc" ID(add); SPm(ss, rsrc, mx); DR(rdst); F_OSZC; } @@ -604,13 +605,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_4: { /** 0000 0110 mx00 11ss rsrc rdst mul %1%S1, %0 */ -#line 674 "rx-decode.opc" +#line 675 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 674 "rx-decode.opc" +#line 675 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 674 "rx-decode.opc" +#line 675 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 674 "rx-decode.opc" +#line 675 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -623,7 +624,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("mul %1%S1, %0"); -#line 674 "rx-decode.opc" +#line 675 "rx-decode.opc" ID(mul); SPm(ss, rsrc, mx); DR(rdst); F_____; } @@ -665,13 +666,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_5: { /** 0000 0110 mx01 00ss rsrc rdst and %1%S1, %0 */ -#line 444 "rx-decode.opc" +#line 445 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 444 "rx-decode.opc" +#line 445 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 444 "rx-decode.opc" +#line 445 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 444 "rx-decode.opc" +#line 445 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -684,7 +685,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("and %1%S1, %0"); -#line 444 "rx-decode.opc" +#line 445 "rx-decode.opc" ID(and); SPm(ss, rsrc, mx); DR(rdst); F__SZ_; } @@ -726,13 +727,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_6: { /** 0000 0110 mx01 01ss rsrc rdst or %1%S1, %0 */ -#line 462 "rx-decode.opc" +#line 463 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 462 "rx-decode.opc" +#line 463 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 462 "rx-decode.opc" +#line 463 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 462 "rx-decode.opc" +#line 463 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -745,7 +746,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("or %1%S1, %0"); -#line 462 "rx-decode.opc" +#line 463 "rx-decode.opc" ID(or); SPm(ss, rsrc, mx); DR(rdst); F__SZ_; } @@ -791,13 +792,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_7: { /** 0000 0110 mx10 00sp 0000 0000 rsrc rdst sbb %1%S1, %0 */ -#line 580 "rx-decode.opc" +#line 581 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 580 "rx-decode.opc" +#line 581 "rx-decode.opc" int sp AU = op[1] & 0x03; -#line 580 "rx-decode.opc" +#line 581 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; -#line 580 "rx-decode.opc" +#line 581 "rx-decode.opc" int rdst AU = op[3] & 0x0f; if (trace) { @@ -810,7 +811,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("sbb %1%S1, %0"); -#line 580 "rx-decode.opc" +#line 581 "rx-decode.opc" ID(sbb); SPm(sp, rsrc, mx); DR(rdst); F_OSZC; /*----------------------------------------------------------------------*/ @@ -828,13 +829,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_8: { /** 0000 0110 mx10 00ss 0000 0100 rsrc rdst max %1%S1, %0 */ -#line 619 "rx-decode.opc" +#line 620 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 619 "rx-decode.opc" +#line 620 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 619 "rx-decode.opc" +#line 620 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; -#line 619 "rx-decode.opc" +#line 620 "rx-decode.opc" int rdst AU = op[3] & 0x0f; if (trace) { @@ -847,7 +848,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("max %1%S1, %0"); -#line 619 "rx-decode.opc" +#line 620 "rx-decode.opc" ID(max); SPm(ss, rsrc, mx); DR(rdst); /*----------------------------------------------------------------------*/ @@ -865,13 +866,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_9: { /** 0000 0110 mx10 00ss 0000 0101 rsrc rdst min %1%S1, %0 */ -#line 631 "rx-decode.opc" +#line 632 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 631 "rx-decode.opc" +#line 632 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 631 "rx-decode.opc" +#line 632 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; -#line 631 "rx-decode.opc" +#line 632 "rx-decode.opc" int rdst AU = op[3] & 0x0f; if (trace) { @@ -884,7 +885,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("min %1%S1, %0"); -#line 631 "rx-decode.opc" +#line 632 "rx-decode.opc" ID(min); SPm(ss, rsrc, mx); DR(rdst); /*----------------------------------------------------------------------*/ @@ -902,13 +903,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_10: { /** 0000 0110 mx10 00ss 0000 0110 rsrc rdst emul %1%S1, %0 */ -#line 689 "rx-decode.opc" +#line 690 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 689 "rx-decode.opc" +#line 690 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 689 "rx-decode.opc" +#line 690 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; -#line 689 "rx-decode.opc" +#line 690 "rx-decode.opc" int rdst AU = op[3] & 0x0f; if (trace) { @@ -921,7 +922,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("emul %1%S1, %0"); -#line 689 "rx-decode.opc" +#line 690 "rx-decode.opc" ID(emul); SPm(ss, rsrc, mx); DR(rdst); /*----------------------------------------------------------------------*/ @@ -939,13 +940,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_11: { /** 0000 0110 mx10 00ss 0000 0111 rsrc rdst emulu %1%S1, %0 */ -#line 701 "rx-decode.opc" +#line 702 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 701 "rx-decode.opc" +#line 702 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 701 "rx-decode.opc" +#line 702 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; -#line 701 "rx-decode.opc" +#line 702 "rx-decode.opc" int rdst AU = op[3] & 0x0f; if (trace) { @@ -958,7 +959,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("emulu %1%S1, %0"); -#line 701 "rx-decode.opc" +#line 702 "rx-decode.opc" ID(emulu); SPm(ss, rsrc, mx); DR(rdst); /*----------------------------------------------------------------------*/ @@ -976,13 +977,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_12: { /** 0000 0110 mx10 00ss 0000 1000 rsrc rdst div %1%S1, %0 */ -#line 713 "rx-decode.opc" +#line 714 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 713 "rx-decode.opc" +#line 714 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 713 "rx-decode.opc" +#line 714 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; -#line 713 "rx-decode.opc" +#line 714 "rx-decode.opc" int rdst AU = op[3] & 0x0f; if (trace) { @@ -995,7 +996,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("div %1%S1, %0"); -#line 713 "rx-decode.opc" +#line 714 "rx-decode.opc" ID(div); SPm(ss, rsrc, mx); DR(rdst); F_O___; /*----------------------------------------------------------------------*/ @@ -1013,13 +1014,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_13: { /** 0000 0110 mx10 00ss 0000 1001 rsrc rdst divu %1%S1, %0 */ -#line 725 "rx-decode.opc" +#line 726 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 725 "rx-decode.opc" +#line 726 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 725 "rx-decode.opc" +#line 726 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; -#line 725 "rx-decode.opc" +#line 726 "rx-decode.opc" int rdst AU = op[3] & 0x0f; if (trace) { @@ -1032,7 +1033,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("divu %1%S1, %0"); -#line 725 "rx-decode.opc" +#line 726 "rx-decode.opc" ID(divu); SPm(ss, rsrc, mx); DR(rdst); F_O___; /*----------------------------------------------------------------------*/ @@ -1050,13 +1051,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_14: { /** 0000 0110 mx10 00ss 0000 1100 rsrc rdst tst %1%S1, %2 */ -#line 498 "rx-decode.opc" +#line 499 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 498 "rx-decode.opc" +#line 499 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 498 "rx-decode.opc" +#line 499 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; -#line 498 "rx-decode.opc" +#line 499 "rx-decode.opc" int rdst AU = op[3] & 0x0f; if (trace) { @@ -1069,7 +1070,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("tst %1%S1, %2"); -#line 498 "rx-decode.opc" +#line 499 "rx-decode.opc" ID(and); SPm(ss, rsrc, mx); S2R(rdst); F__SZ_; /*----------------------------------------------------------------------*/ @@ -1087,13 +1088,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_15: { /** 0000 0110 mx10 00ss 0000 1101 rsrc rdst xor %1%S1, %0 */ -#line 477 "rx-decode.opc" +#line 478 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 477 "rx-decode.opc" +#line 478 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 477 "rx-decode.opc" +#line 478 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; -#line 477 "rx-decode.opc" +#line 478 "rx-decode.opc" int rdst AU = op[3] & 0x0f; if (trace) { @@ -1106,7 +1107,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("xor %1%S1, %0"); -#line 477 "rx-decode.opc" +#line 478 "rx-decode.opc" ID(xor); SPm(ss, rsrc, mx); DR(rdst); F__SZ_; /*----------------------------------------------------------------------*/ @@ -1124,13 +1125,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_16: { /** 0000 0110 mx10 00ss 0001 0000 rsrc rdst xchg %1%S1, %0 */ -#line 411 "rx-decode.opc" +#line 412 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 411 "rx-decode.opc" +#line 412 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 411 "rx-decode.opc" +#line 412 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; -#line 411 "rx-decode.opc" +#line 412 "rx-decode.opc" int rdst AU = op[3] & 0x0f; if (trace) { @@ -1143,7 +1144,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("xchg %1%S1, %0"); -#line 411 "rx-decode.opc" +#line 412 "rx-decode.opc" ID(xchg); DR(rdst); SPm(ss, rsrc, mx); /*----------------------------------------------------------------------*/ @@ -1161,13 +1162,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_17: { /** 0000 0110 mx10 00sd 0001 0001 rsrc rdst itof %1%S1, %0 */ -#line 954 "rx-decode.opc" +#line 955 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 954 "rx-decode.opc" +#line 955 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 954 "rx-decode.opc" +#line 955 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; -#line 954 "rx-decode.opc" +#line 955 "rx-decode.opc" int rdst AU = op[3] & 0x0f; if (trace) { @@ -1180,7 +1181,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("itof %1%S1, %0"); -#line 954 "rx-decode.opc" +#line 955 "rx-decode.opc" ID(itof); DR (rdst); SPm(sd, rsrc, mx); F__SZ_; /*----------------------------------------------------------------------*/ @@ -1198,13 +1199,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_18: { /** 0000 0110 mx10 00sd 0001 0101 rsrc rdst utof %1%S1, %0 */ -#line 1140 "rx-decode.opc" +#line 1180 "rx-decode.opc" int mx AU = (op[1] >> 6) & 0x03; -#line 1140 "rx-decode.opc" +#line 1180 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 1140 "rx-decode.opc" +#line 1180 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; -#line 1140 "rx-decode.opc" +#line 1180 "rx-decode.opc" int rdst AU = op[3] & 0x0f; if (trace) { @@ -1217,7 +1218,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("utof %1%S1, %0"); -#line 1140 "rx-decode.opc" +#line 1180 "rx-decode.opc" ID(utof); DR (rdst); SPm(sd, rsrc, mx); F__SZ_; /*----------------------------------------------------------------------*/ @@ -2488,11 +2489,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_19: { /** 0000 0110 1010 00ss 0000 0010 rsrc rdst adc %1%S1, %0 */ -#line 519 "rx-decode.opc" +#line 520 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 519 "rx-decode.opc" +#line 520 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; -#line 519 "rx-decode.opc" +#line 520 "rx-decode.opc" int rdst AU = op[3] & 0x0f; if (trace) { @@ -2504,7 +2505,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("adc %1%S1, %0"); -#line 519 "rx-decode.opc" +#line 520 "rx-decode.opc" ID(adc); SPm(ss, rsrc, 2); DR(rdst); F_OSZC; /*----------------------------------------------------------------------*/ @@ -3677,7 +3678,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x0f: { /** 0000 1dsp bra.s %a0 */ -#line 800 "rx-decode.opc" +#line 801 "rx-decode.opc" int dsp AU = op[0] & 0x07; if (trace) { @@ -3687,7 +3688,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" dsp = 0x%x\n", dsp); } SYNTAX("bra.s %a0"); -#line 800 "rx-decode.opc" +#line 801 "rx-decode.opc" ID(branch); DC(pc + dsp3map[dsp]); } @@ -3710,9 +3711,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x1f: { /** 0001 n dsp b%1.s %a0 */ -#line 790 "rx-decode.opc" +#line 791 "rx-decode.opc" int n AU = (op[0] >> 3) & 0x01; -#line 790 "rx-decode.opc" +#line 791 "rx-decode.opc" int dsp AU = op[0] & 0x07; if (trace) { @@ -3723,7 +3724,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" dsp = 0x%x\n", dsp); } SYNTAX("b%1.s %a0"); -#line 790 "rx-decode.opc" +#line 791 "rx-decode.opc" ID(branch); Scc(n); DC(pc + dsp3map[dsp]); } @@ -3745,7 +3746,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x2f: { /** 0010 cond b%1.b %a0 */ -#line 793 "rx-decode.opc" +#line 794 "rx-decode.opc" int cond AU = op[0] & 0x0f; if (trace) { @@ -3755,7 +3756,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" cond = 0x%x\n", cond); } SYNTAX("b%1.b %a0"); -#line 793 "rx-decode.opc" +#line 794 "rx-decode.opc" ID(branch); Scc(cond); DC(pc + IMMex (1)); } @@ -3770,7 +3771,7 @@ rx_decode_opcode (unsigned long pc AU, op[0]); } SYNTAX("bra.b %a0"); -#line 803 "rx-decode.opc" +#line 804 "rx-decode.opc" ID(branch); DC(pc + IMMex(1)); } @@ -3785,7 +3786,7 @@ rx_decode_opcode (unsigned long pc AU, op[0]); } SYNTAX("bra.w %a0"); -#line 806 "rx-decode.opc" +#line 807 "rx-decode.opc" ID(branch); DC(pc + IMMex(2)); } @@ -3800,7 +3801,7 @@ rx_decode_opcode (unsigned long pc AU, op[0]); } SYNTAX("bsr.w %a0"); -#line 822 "rx-decode.opc" +#line 823 "rx-decode.opc" ID(jsr); DC(pc + IMMex(2)); } @@ -3809,7 +3810,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x3b: { /** 0011 101c b%1.w %a0 */ -#line 796 "rx-decode.opc" +#line 797 "rx-decode.opc" int c AU = op[0] & 0x01; if (trace) { @@ -3819,7 +3820,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" c = 0x%x\n", c); } SYNTAX("b%1.w %a0"); -#line 796 "rx-decode.opc" +#line 797 "rx-decode.opc" ID(branch); Scc(c); DC(pc + IMMex (2)); @@ -3833,13 +3834,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_20: { /** 0011 11sz d dst sppp mov%s #%1, %0 */ -#line 332 "rx-decode.opc" +#line 333 "rx-decode.opc" int sz AU = op[0] & 0x03; -#line 332 "rx-decode.opc" +#line 333 "rx-decode.opc" int d AU = (op[1] >> 7) & 0x01; -#line 332 "rx-decode.opc" +#line 333 "rx-decode.opc" int dst AU = (op[1] >> 4) & 0x07; -#line 332 "rx-decode.opc" +#line 333 "rx-decode.opc" int sppp AU = op[1] & 0x0f; if (trace) { @@ -3852,7 +3853,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" sppp = 0x%x\n", sppp); } SYNTAX("mov%s #%1, %0"); -#line 332 "rx-decode.opc" +#line 333 "rx-decode.opc" ID(mov); sBWL (sz); DIs(dst, d*16+sppp, sz); SC(IMM(1)); F_____; } @@ -3884,9 +3885,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0011 1111 rega regb rtsd #%1, %2-%0 */ -#line 429 "rx-decode.opc" +#line 430 "rx-decode.opc" int rega AU = (op[1] >> 4) & 0x0f; -#line 429 "rx-decode.opc" +#line 430 "rx-decode.opc" int regb AU = op[1] & 0x0f; if (trace) { @@ -3897,7 +3898,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" regb = 0x%x\n", regb); } SYNTAX("rtsd #%1, %2-%0"); -#line 429 "rx-decode.opc" +#line 430 "rx-decode.opc" ID(rtsd); SC(IMM(1) * 4); S2R(rega); DR(regb); /*----------------------------------------------------------------------*/ @@ -3915,11 +3916,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_21: { /** 0100 00ss rsrc rdst sub %2%S2, %1 */ -#line 564 "rx-decode.opc" +#line 565 "rx-decode.opc" int ss AU = op[0] & 0x03; -#line 564 "rx-decode.opc" +#line 565 "rx-decode.opc" int rsrc AU = (op[1] >> 4) & 0x0f; -#line 564 "rx-decode.opc" +#line 565 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -3931,7 +3932,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("sub %2%S2, %1"); -#line 564 "rx-decode.opc" +#line 565 "rx-decode.opc" ID(sub); S2P(ss, rsrc); SR(rdst); DR(rdst); F_OSZC; } @@ -3973,11 +3974,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_22: { /** 0100 01ss rsrc rdst cmp %2%S2, %1 */ -#line 552 "rx-decode.opc" +#line 553 "rx-decode.opc" int ss AU = op[0] & 0x03; -#line 552 "rx-decode.opc" +#line 553 "rx-decode.opc" int rsrc AU = (op[1] >> 4) & 0x0f; -#line 552 "rx-decode.opc" +#line 553 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -3989,7 +3990,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("cmp %2%S2, %1"); -#line 552 "rx-decode.opc" +#line 553 "rx-decode.opc" ID(sub); S2P(ss, rsrc); SR(rdst); F_OSZC; } @@ -4031,11 +4032,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_23: { /** 0100 10ss rsrc rdst add %1%S1, %0 */ -#line 528 "rx-decode.opc" +#line 529 "rx-decode.opc" int ss AU = op[0] & 0x03; -#line 528 "rx-decode.opc" +#line 529 "rx-decode.opc" int rsrc AU = (op[1] >> 4) & 0x0f; -#line 528 "rx-decode.opc" +#line 529 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4047,7 +4048,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("add %1%S1, %0"); -#line 528 "rx-decode.opc" +#line 529 "rx-decode.opc" ID(add); SP(ss, rsrc); DR(rdst); F_OSZC; } @@ -4089,11 +4090,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_24: { /** 0100 11ss rsrc rdst mul %1%S1, %0 */ -#line 671 "rx-decode.opc" +#line 672 "rx-decode.opc" int ss AU = op[0] & 0x03; -#line 671 "rx-decode.opc" +#line 672 "rx-decode.opc" int rsrc AU = (op[1] >> 4) & 0x0f; -#line 671 "rx-decode.opc" +#line 672 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4105,7 +4106,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("mul %1%S1, %0"); -#line 671 "rx-decode.opc" +#line 672 "rx-decode.opc" ID(mul); SP(ss, rsrc); DR(rdst); F_____; } @@ -4147,11 +4148,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_25: { /** 0101 00ss rsrc rdst and %1%S1, %0 */ -#line 441 "rx-decode.opc" +#line 442 "rx-decode.opc" int ss AU = op[0] & 0x03; -#line 441 "rx-decode.opc" +#line 442 "rx-decode.opc" int rsrc AU = (op[1] >> 4) & 0x0f; -#line 441 "rx-decode.opc" +#line 442 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4163,7 +4164,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("and %1%S1, %0"); -#line 441 "rx-decode.opc" +#line 442 "rx-decode.opc" ID(and); SP(ss, rsrc); DR(rdst); F__SZ_; } @@ -4205,11 +4206,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_26: { /** 0101 01ss rsrc rdst or %1%S1, %0 */ -#line 459 "rx-decode.opc" +#line 460 "rx-decode.opc" int ss AU = op[0] & 0x03; -#line 459 "rx-decode.opc" +#line 460 "rx-decode.opc" int rsrc AU = (op[1] >> 4) & 0x0f; -#line 459 "rx-decode.opc" +#line 460 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4221,7 +4222,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("or %1%S1, %0"); -#line 459 "rx-decode.opc" +#line 460 "rx-decode.opc" ID(or); SP(ss, rsrc); DR(rdst); F__SZ_; } @@ -4263,13 +4264,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_27: { /** 0101 1 s ss rsrc rdst movu%s %1, %0 */ -#line 380 "rx-decode.opc" +#line 381 "rx-decode.opc" int s AU = (op[0] >> 2) & 0x01; -#line 380 "rx-decode.opc" +#line 381 "rx-decode.opc" int ss AU = op[0] & 0x03; -#line 380 "rx-decode.opc" +#line 381 "rx-decode.opc" int rsrc AU = (op[1] >> 4) & 0x0f; -#line 380 "rx-decode.opc" +#line 381 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4282,7 +4283,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("movu%s %1, %0"); -#line 380 "rx-decode.opc" +#line 381 "rx-decode.opc" ID(mov); uBW(s); SD(ss, rsrc, s); DR(rdst); F_____; } @@ -4359,9 +4360,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0110 0000 immm rdst sub #%2, %0 */ -#line 561 "rx-decode.opc" +#line 562 "rx-decode.opc" int immm AU = (op[1] >> 4) & 0x0f; -#line 561 "rx-decode.opc" +#line 562 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4372,7 +4373,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("sub #%2, %0"); -#line 561 "rx-decode.opc" +#line 562 "rx-decode.opc" ID(sub); S2C(immm); SR(rdst); DR(rdst); F_OSZC; } @@ -4386,9 +4387,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0110 0001 immm rdst cmp #%2, %1 */ -#line 543 "rx-decode.opc" +#line 544 "rx-decode.opc" int immm AU = (op[1] >> 4) & 0x0f; -#line 543 "rx-decode.opc" +#line 544 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4399,7 +4400,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("cmp #%2, %1"); -#line 543 "rx-decode.opc" +#line 544 "rx-decode.opc" ID(sub); S2C(immm); SR(rdst); F_OSZC; } @@ -4413,9 +4414,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0110 0010 immm rdst add #%1, %0 */ -#line 525 "rx-decode.opc" +#line 526 "rx-decode.opc" int immm AU = (op[1] >> 4) & 0x0f; -#line 525 "rx-decode.opc" +#line 526 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4426,7 +4427,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("add #%1, %0"); -#line 525 "rx-decode.opc" +#line 526 "rx-decode.opc" ID(add); SC(immm); DR(rdst); F_OSZC; } @@ -4440,9 +4441,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0110 0011 immm rdst mul #%1, %0 */ -#line 637 "rx-decode.opc" +#line 638 "rx-decode.opc" int immm AU = (op[1] >> 4) & 0x0f; -#line 637 "rx-decode.opc" +#line 638 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4453,7 +4454,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("mul #%1, %0"); -#line 637 "rx-decode.opc" +#line 638 "rx-decode.opc" if (immm == 1 && rdst == 0) { ID(nop2); @@ -4476,9 +4477,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0110 0100 immm rdst and #%1, %0 */ -#line 435 "rx-decode.opc" +#line 436 "rx-decode.opc" int immm AU = (op[1] >> 4) & 0x0f; -#line 435 "rx-decode.opc" +#line 436 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4489,7 +4490,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("and #%1, %0"); -#line 435 "rx-decode.opc" +#line 436 "rx-decode.opc" ID(and); SC(immm); DR(rdst); F__SZ_; } @@ -4503,9 +4504,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0110 0101 immm rdst or #%1, %0 */ -#line 453 "rx-decode.opc" +#line 454 "rx-decode.opc" int immm AU = (op[1] >> 4) & 0x0f; -#line 453 "rx-decode.opc" +#line 454 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4516,7 +4517,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("or #%1, %0"); -#line 453 "rx-decode.opc" +#line 454 "rx-decode.opc" ID(or); SC(immm); DR(rdst); F__SZ_; } @@ -4530,9 +4531,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0110 0110 immm rdst mov%s #%1, %0 */ -#line 329 "rx-decode.opc" +#line 330 "rx-decode.opc" int immm AU = (op[1] >> 4) & 0x0f; -#line 329 "rx-decode.opc" +#line 330 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4543,7 +4544,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("mov%s #%1, %0"); -#line 329 "rx-decode.opc" +#line 330 "rx-decode.opc" ID(mov); DR(rdst); SC(immm); F_____; } @@ -4560,7 +4561,7 @@ rx_decode_opcode (unsigned long pc AU, op[0]); } SYNTAX("rtsd #%1"); -#line 426 "rx-decode.opc" +#line 427 "rx-decode.opc" ID(rtsd); SC(IMM(1) * 4); } @@ -4573,11 +4574,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_28: { /** 0110 100i mmmm rdst shlr #%2, %0 */ -#line 751 "rx-decode.opc" +#line 752 "rx-decode.opc" int i AU = op[0] & 0x01; -#line 751 "rx-decode.opc" +#line 752 "rx-decode.opc" int mmmm AU = (op[1] >> 4) & 0x0f; -#line 751 "rx-decode.opc" +#line 752 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4589,7 +4590,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("shlr #%2, %0"); -#line 751 "rx-decode.opc" +#line 752 "rx-decode.opc" ID(shlr); S2C(i*16+mmmm); SR(rdst); DR(rdst); F__SZC; } @@ -4613,11 +4614,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_29: { /** 0110 101i mmmm rdst shar #%2, %0 */ -#line 741 "rx-decode.opc" +#line 742 "rx-decode.opc" int i AU = op[0] & 0x01; -#line 741 "rx-decode.opc" +#line 742 "rx-decode.opc" int mmmm AU = (op[1] >> 4) & 0x0f; -#line 741 "rx-decode.opc" +#line 742 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4629,7 +4630,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("shar #%2, %0"); -#line 741 "rx-decode.opc" +#line 742 "rx-decode.opc" ID(shar); S2C(i*16+mmmm); SR(rdst); DR(rdst); F_0SZC; } @@ -4653,11 +4654,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_30: { /** 0110 110i mmmm rdst shll #%2, %0 */ -#line 731 "rx-decode.opc" +#line 732 "rx-decode.opc" int i AU = op[0] & 0x01; -#line 731 "rx-decode.opc" +#line 732 "rx-decode.opc" int mmmm AU = (op[1] >> 4) & 0x0f; -#line 731 "rx-decode.opc" +#line 732 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4669,7 +4670,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("shll #%2, %0"); -#line 731 "rx-decode.opc" +#line 732 "rx-decode.opc" ID(shll); S2C(i*16+mmmm); SR(rdst); DR(rdst); F_OSZC; } @@ -4692,9 +4693,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0110 1110 dsta dstb pushm %1-%2 */ -#line 393 "rx-decode.opc" +#line 394 "rx-decode.opc" int dsta AU = (op[1] >> 4) & 0x0f; -#line 393 "rx-decode.opc" +#line 394 "rx-decode.opc" int dstb AU = op[1] & 0x0f; if (trace) { @@ -4705,7 +4706,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" dstb = 0x%x\n", dstb); } SYNTAX("pushm %1-%2"); -#line 393 "rx-decode.opc" +#line 394 "rx-decode.opc" ID(pushm); SR(dsta); S2R(dstb); F_____; } @@ -4719,9 +4720,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0110 1111 dsta dstb popm %1-%2 */ -#line 390 "rx-decode.opc" +#line 391 "rx-decode.opc" int dsta AU = (op[1] >> 4) & 0x0f; -#line 390 "rx-decode.opc" +#line 391 "rx-decode.opc" int dstb AU = op[1] & 0x0f; if (trace) { @@ -4732,7 +4733,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" dstb = 0x%x\n", dstb); } SYNTAX("popm %1-%2"); -#line 390 "rx-decode.opc" +#line 391 "rx-decode.opc" ID(popm); SR(dsta); S2R(dstb); F_____; } @@ -4747,11 +4748,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_31: { /** 0111 00im rsrc rdst add #%1, %2, %0 */ -#line 534 "rx-decode.opc" +#line 535 "rx-decode.opc" int im AU = op[0] & 0x03; -#line 534 "rx-decode.opc" +#line 535 "rx-decode.opc" int rsrc AU = (op[1] >> 4) & 0x0f; -#line 534 "rx-decode.opc" +#line 535 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4763,7 +4764,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("add #%1, %2, %0"); -#line 534 "rx-decode.opc" +#line 535 "rx-decode.opc" ID(add); SC(IMMex(im)); S2R(rsrc); DR(rdst); F_OSZC; } @@ -4805,9 +4806,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_32: { /** 0111 01im 0000 rsrc cmp #%2, %1%S1 */ -#line 546 "rx-decode.opc" +#line 547 "rx-decode.opc" int im AU = op[0] & 0x03; -#line 546 "rx-decode.opc" +#line 547 "rx-decode.opc" int rsrc AU = op[1] & 0x0f; if (trace) { @@ -4818,7 +4819,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("cmp #%2, %1%S1"); -#line 546 "rx-decode.opc" +#line 547 "rx-decode.opc" ID(sub); SR(rsrc); S2C(IMMex(im)); F_OSZC; } @@ -4827,9 +4828,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_33: { /** 0111 01im 0001rdst mul #%1, %0 */ -#line 649 "rx-decode.opc" +#line 650 "rx-decode.opc" int im AU = op[0] & 0x03; -#line 649 "rx-decode.opc" +#line 650 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4840,7 +4841,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("mul #%1, %0"); -#line 649 "rx-decode.opc" +#line 650 "rx-decode.opc" int val = IMMex(im); if (val == 1 && rdst == 0) { @@ -4868,9 +4869,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_34: { /** 0111 01im 0010 rdst and #%1, %0 */ -#line 438 "rx-decode.opc" +#line 439 "rx-decode.opc" int im AU = op[0] & 0x03; -#line 438 "rx-decode.opc" +#line 439 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4881,7 +4882,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("and #%1, %0"); -#line 438 "rx-decode.opc" +#line 439 "rx-decode.opc" ID(and); SC(IMMex(im)); DR(rdst); F__SZ_; } @@ -4890,9 +4891,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_35: { /** 0111 01im 0011 rdst or #%1, %0 */ -#line 456 "rx-decode.opc" +#line 457 "rx-decode.opc" int im AU = op[0] & 0x03; -#line 456 "rx-decode.opc" +#line 457 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -4903,7 +4904,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("or #%1, %0"); -#line 456 "rx-decode.opc" +#line 457 "rx-decode.opc" ID(or); SC(IMMex(im)); DR(rdst); F__SZ_; } @@ -5005,7 +5006,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x4f: { /** 0111 0101 0100 rdst mov%s #%1, %0 */ -#line 310 "rx-decode.opc" +#line 311 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -5015,7 +5016,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("mov%s #%1, %0"); -#line 310 "rx-decode.opc" +#line 311 "rx-decode.opc" ID(mov); DR(rdst); SC(IMM (1)); F_____; } @@ -5038,7 +5039,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x5f: { /** 0111 0101 0101 rsrc cmp #%2, %1 */ -#line 549 "rx-decode.opc" +#line 550 "rx-decode.opc" int rsrc AU = op[1] & 0x0f; if (trace) { @@ -5048,7 +5049,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("cmp #%2, %1"); -#line 549 "rx-decode.opc" +#line 550 "rx-decode.opc" ID(sub); SR(rsrc); S2C(IMM(1)); F_OSZC; } @@ -5063,7 +5064,7 @@ rx_decode_opcode (unsigned long pc AU, op[0], op[1]); } SYNTAX("int #%1"); -#line 1056 "rx-decode.opc" +#line 1096 "rx-decode.opc" ID(int); SC(IMM(1)); } @@ -5075,7 +5076,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0111 0101 0111 0000 0000 immm mvtipl #%1 */ -#line 1023 "rx-decode.opc" +#line 1024 "rx-decode.opc" int immm AU = op[2] & 0x0f; if (trace) { @@ -5085,7 +5086,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" immm = 0x%x\n", immm); } SYNTAX("mvtipl #%1"); -#line 1023 "rx-decode.opc" +#line 1024 "rx-decode.opc" ID(mvtipl); SC(immm); } @@ -5107,7 +5108,7 @@ rx_decode_opcode (unsigned long pc AU, op[0], op[1], op[2]); } SYNTAX("mvfdr"); -#line 1229 "rx-decode.opc" +#line 1269 "rx-decode.opc" ID(mvfdr); F_____; } @@ -5122,9 +5123,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0111 0101 1010 0000 rdst rnum dpushm.l %1-%2 */ -#line 1223 "rx-decode.opc" +#line 1263 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; -#line 1223 "rx-decode.opc" +#line 1263 "rx-decode.opc" int rnum AU = op[2] & 0x0f; if (trace) { @@ -5135,7 +5136,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rnum = 0x%x\n", rnum); } SYNTAX("dpushm.l %1-%2"); -#line 1223 "rx-decode.opc" +#line 1263 "rx-decode.opc" ID(dpushm); SCR(rdst); S2CR(rdst + rnum); F_____; } @@ -5149,9 +5150,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0111 0101 1010 1000 rdst rnum dpopm.l %1-%2 */ -#line 1217 "rx-decode.opc" +#line 1257 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; -#line 1217 "rx-decode.opc" +#line 1257 "rx-decode.opc" int rnum AU = op[2] & 0x0f; if (trace) { @@ -5162,7 +5163,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rnum = 0x%x\n", rnum); } SYNTAX("dpopm.l %1-%2"); -#line 1217 "rx-decode.opc" +#line 1257 "rx-decode.opc" ID(dpopm); SCR(rdst); S2CR(rdst + rnum); F_____; } @@ -5176,9 +5177,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0111 0101 1011 0000 rdst rnum dpushm.d %1-%2 */ -#line 1220 "rx-decode.opc" +#line 1260 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; -#line 1220 "rx-decode.opc" +#line 1260 "rx-decode.opc" int rnum AU = op[2] & 0x0f; if (trace) { @@ -5189,7 +5190,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rnum = 0x%x\n", rnum); } SYNTAX("dpushm.d %1-%2"); -#line 1220 "rx-decode.opc" +#line 1260 "rx-decode.opc" ID(dpushm); SDR(rdst); S2DR(rdst + rnum); F_____; } @@ -5203,9 +5204,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0111 0101 1011 1000 rdst rnum dpopm.d %1-%2 */ -#line 1214 "rx-decode.opc" +#line 1254 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; -#line 1214 "rx-decode.opc" +#line 1254 "rx-decode.opc" int rnum AU = op[2] & 0x0f; if (trace) { @@ -5216,7 +5217,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rnum = 0x%x\n", rnum); } SYNTAX("dpopm.d %1-%2"); -#line 1214 "rx-decode.opc" +#line 1254 "rx-decode.opc" ID(dpopm); SDR(rdst); S2DR(rdst + rnum); F_____; } @@ -5314,11 +5315,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_36: { /** 0111 0110 1001 0000 srcb 0000 rdst srca dadd %1, %2, %0 */ -#line 1238 "rx-decode.opc" +#line 1278 "rx-decode.opc" int srcb AU = (op[2] >> 4) & 0x0f; -#line 1238 "rx-decode.opc" +#line 1278 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; -#line 1238 "rx-decode.opc" +#line 1278 "rx-decode.opc" int srca AU = op[3] & 0x0f; if (trace) { @@ -5330,7 +5331,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srca = 0x%x\n", srca); } SYNTAX("dadd %1, %2, %0"); -#line 1238 "rx-decode.opc" +#line 1278 "rx-decode.opc" ID(dadd); DDR(rdst); SDR(srca); S2DR(srcb); F_____; } @@ -5345,11 +5346,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_37: { /** 0111 0110 1001 0000 srcb 0001 rdst srca dsub %1, %2, %0 */ -#line 1259 "rx-decode.opc" +#line 1299 "rx-decode.opc" int srcb AU = (op[2] >> 4) & 0x0f; -#line 1259 "rx-decode.opc" +#line 1299 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; -#line 1259 "rx-decode.opc" +#line 1299 "rx-decode.opc" int srca AU = op[3] & 0x0f; if (trace) { @@ -5361,7 +5362,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srca = 0x%x\n", srca); } SYNTAX("dsub %1, %2, %0"); -#line 1259 "rx-decode.opc" +#line 1299 "rx-decode.opc" ID(dsub); DDR(rdst); SDR(srca); S2DR(srcb); F_____; } @@ -5376,11 +5377,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_38: { /** 0111 0110 1001 0000 srcb 0010 rdst srca dmul %1, %2, %0 */ -#line 1247 "rx-decode.opc" +#line 1287 "rx-decode.opc" int srcb AU = (op[2] >> 4) & 0x0f; -#line 1247 "rx-decode.opc" +#line 1287 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; -#line 1247 "rx-decode.opc" +#line 1287 "rx-decode.opc" int srca AU = op[3] & 0x0f; if (trace) { @@ -5392,7 +5393,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srca = 0x%x\n", srca); } SYNTAX("dmul %1, %2, %0"); -#line 1247 "rx-decode.opc" +#line 1287 "rx-decode.opc" ID(dmul); DDR(rdst); SDR(srca); S2DR(srcb); F_____; } @@ -5407,11 +5408,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_39: { /** 0111 0110 1001 0000 srcb 0101 rdst srca ddiv %1, %2, %0 */ -#line 1244 "rx-decode.opc" +#line 1284 "rx-decode.opc" int srcb AU = (op[2] >> 4) & 0x0f; -#line 1244 "rx-decode.opc" +#line 1284 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; -#line 1244 "rx-decode.opc" +#line 1284 "rx-decode.opc" int srca AU = op[3] & 0x0f; if (trace) { @@ -5423,7 +5424,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srca = 0x%x\n", srca); } SYNTAX("ddiv %1, %2, %0"); -#line 1244 "rx-decode.opc" +#line 1284 "rx-decode.opc" ID(ddiv); DDR(rdst); SDR(srca); S2DR(srcb); F_____; } @@ -5438,11 +5439,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_40: { /** 0111 0110 1001 0000 srcb 1000 cond srca dcmp%0 %1, %2 */ -#line 1241 "rx-decode.opc" +#line 1281 "rx-decode.opc" int srcb AU = (op[2] >> 4) & 0x0f; -#line 1241 "rx-decode.opc" +#line 1281 "rx-decode.opc" int cond AU = (op[3] >> 4) & 0x0f; -#line 1241 "rx-decode.opc" +#line 1281 "rx-decode.opc" int srca AU = op[3] & 0x0f; if (trace) { @@ -5454,7 +5455,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srca = 0x%x\n", srca); } SYNTAX("dcmp%0 %1, %2"); -#line 1241 "rx-decode.opc" +#line 1281 "rx-decode.opc" ID(dcmp); DCND(cond); SDR(srca); S2DR(srcb); F_____; } @@ -5469,9 +5470,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_41: { /** 0111 0110 1001 0000 rsrc 1100 rdst 0000 dmov.d %1, %0 */ -#line 1179 "rx-decode.opc" +#line 1219 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1179 "rx-decode.opc" +#line 1219 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; if (trace) { @@ -5482,7 +5483,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("dmov.d %1, %0"); -#line 1179 "rx-decode.opc" +#line 1219 "rx-decode.opc" ID(dmov); DDR(rdst); SDR(rsrc); F_____; } @@ -5491,9 +5492,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_42: { /** 0111 0110 1001 0000 rsrc 1100 rdst 0001 dabs %1, %0 */ -#line 1235 "rx-decode.opc" +#line 1275 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1235 "rx-decode.opc" +#line 1275 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; if (trace) { @@ -5504,7 +5505,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("dabs %1, %0"); -#line 1235 "rx-decode.opc" +#line 1275 "rx-decode.opc" ID(dabs); DDR(rdst); SDR(rsrc); F_____; } @@ -5513,9 +5514,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_43: { /** 0111 0110 1001 0000 rsrc 1100 rdst 0010 dneg %1, %0 */ -#line 1250 "rx-decode.opc" +#line 1290 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1250 "rx-decode.opc" +#line 1290 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; if (trace) { @@ -5526,7 +5527,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("dneg %1, %0"); -#line 1250 "rx-decode.opc" +#line 1290 "rx-decode.opc" ID(dneg); DDR(rdst); SDR(rsrc); F_____; } @@ -5542,9 +5543,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_44: { /** 0111 0110 1001 0000 rsrc 1101 rdst 0000 dsqrt %1, %0 */ -#line 1256 "rx-decode.opc" +#line 1296 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1256 "rx-decode.opc" +#line 1296 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; if (trace) { @@ -5555,7 +5556,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("dsqrt %1, %0"); -#line 1256 "rx-decode.opc" +#line 1296 "rx-decode.opc" ID(dsqrt); DDR(rdst); SDR(rsrc); F_____; } @@ -5564,9 +5565,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_45: { /** 0111 0110 1001 0000 rsrc 1101 rdst 1000 dtoi %1, %0 */ -#line 1265 "rx-decode.opc" +#line 1305 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1265 "rx-decode.opc" +#line 1305 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; if (trace) { @@ -5577,7 +5578,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("dtoi %1, %0"); -#line 1265 "rx-decode.opc" +#line 1305 "rx-decode.opc" ID(dtoi); DDR(rdst); SDR(rsrc); F_____; } @@ -5586,9 +5587,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_46: { /** 0111 0110 1001 0000 rsrc 1101 rdst 1001 dtou %1, %0 */ -#line 1268 "rx-decode.opc" +#line 1308 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1268 "rx-decode.opc" +#line 1308 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; if (trace) { @@ -5599,7 +5600,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("dtou %1, %0"); -#line 1268 "rx-decode.opc" +#line 1308 "rx-decode.opc" ID(dtou); DDR(rdst); SDR(rsrc); F_____; } @@ -5608,9 +5609,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_47: { /** 0111 0110 1001 0000 rsrc 1101 rdst 1100 dtof %1, %0 */ -#line 1262 "rx-decode.opc" +#line 1302 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1262 "rx-decode.opc" +#line 1302 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; if (trace) { @@ -5621,7 +5622,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("dtof %1, %0"); -#line 1262 "rx-decode.opc" +#line 1302 "rx-decode.opc" ID(dtof); DDR(rdst); SDR(rsrc); F_____; } @@ -5630,9 +5631,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_48: { /** 0111 0110 1001 0000 rsrc 1101 rdst 1101 dround %1, %0 */ -#line 1253 "rx-decode.opc" +#line 1293 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1253 "rx-decode.opc" +#line 1293 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; if (trace) { @@ -5643,7 +5644,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("dround %1, %0"); -#line 1253 "rx-decode.opc" +#line 1293 "rx-decode.opc" ID(dround); DDR(rdst); SDR(rsrc); F_____; } @@ -6929,11 +6930,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_49: { /** 0111 100b ittt rdst bset #%1, %0 */ -#line 968 "rx-decode.opc" +#line 969 "rx-decode.opc" int b AU = op[0] & 0x01; -#line 968 "rx-decode.opc" +#line 969 "rx-decode.opc" int ittt AU = (op[1] >> 4) & 0x0f; -#line 968 "rx-decode.opc" +#line 969 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -6945,7 +6946,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("bset #%1, %0"); -#line 968 "rx-decode.opc" +#line 969 "rx-decode.opc" ID(bset); BWL(LSIZE); SC(b*16+ittt); DR(rdst); F_____; @@ -6970,11 +6971,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_50: { /** 0111 101b ittt rdst bclr #%1, %0 */ -#line 980 "rx-decode.opc" +#line 981 "rx-decode.opc" int b AU = op[0] & 0x01; -#line 980 "rx-decode.opc" +#line 981 "rx-decode.opc" int ittt AU = (op[1] >> 4) & 0x0f; -#line 980 "rx-decode.opc" +#line 981 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -6986,7 +6987,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("bclr #%1, %0"); -#line 980 "rx-decode.opc" +#line 981 "rx-decode.opc" ID(bclr); BWL(LSIZE); SC(b*16+ittt); DR(rdst); F_____; @@ -7011,11 +7012,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_51: { /** 0111 110b ittt rdst btst #%2, %1 */ -#line 992 "rx-decode.opc" +#line 993 "rx-decode.opc" int b AU = op[0] & 0x01; -#line 992 "rx-decode.opc" +#line 993 "rx-decode.opc" int ittt AU = (op[1] >> 4) & 0x0f; -#line 992 "rx-decode.opc" +#line 993 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -7027,7 +7028,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("btst #%2, %1"); -#line 992 "rx-decode.opc" +#line 993 "rx-decode.opc" ID(btst); BWL(LSIZE); S2C(b*16+ittt); SR(rdst); F___ZC; @@ -7051,7 +7052,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 0111 1110 0000 rdst not %0 */ -#line 483 "rx-decode.opc" +#line 484 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -7061,7 +7062,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("not %0"); -#line 483 "rx-decode.opc" +#line 484 "rx-decode.opc" ID(xor); DR(rdst); SR(rdst); S2C(~0); F__SZ_; } @@ -7069,7 +7070,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x10: { /** 0111 1110 0001 rdst neg %0 */ -#line 504 "rx-decode.opc" +#line 505 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -7079,7 +7080,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("neg %0"); -#line 504 "rx-decode.opc" +#line 505 "rx-decode.opc" ID(sub); DR(rdst); SC(0); S2R(rdst); F_OSZC; } @@ -7087,7 +7088,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x20: { /** 0111 1110 0010 rdst abs %0 */ -#line 586 "rx-decode.opc" +#line 587 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -7097,7 +7098,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("abs %0"); -#line 586 "rx-decode.opc" +#line 587 "rx-decode.opc" ID(abs); DR(rdst); SR(rdst); F_OSZ_; } @@ -7105,7 +7106,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x30: { /** 0111 1110 0011 rdst sat %0 */ -#line 906 "rx-decode.opc" +#line 907 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -7115,7 +7116,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("sat %0"); -#line 906 "rx-decode.opc" +#line 907 "rx-decode.opc" ID(sat); DR (rdst); } @@ -7123,7 +7124,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x40: { /** 0111 1110 0100 rdst rorc %0 */ -#line 766 "rx-decode.opc" +#line 767 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -7133,7 +7134,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("rorc %0"); -#line 766 "rx-decode.opc" +#line 767 "rx-decode.opc" ID(rorc); DR(rdst); F__SZC; } @@ -7141,7 +7142,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x50: { /** 0111 1110 0101 rdst rolc %0 */ -#line 763 "rx-decode.opc" +#line 764 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -7151,7 +7152,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("rolc %0"); -#line 763 "rx-decode.opc" +#line 764 "rx-decode.opc" ID(rolc); DR(rdst); F__SZC; } @@ -7161,9 +7162,9 @@ rx_decode_opcode (unsigned long pc AU, case 0xa0: { /** 0111 1110 10sz rsrc push%s %1 */ -#line 399 "rx-decode.opc" +#line 400 "rx-decode.opc" int sz AU = (op[1] >> 4) & 0x03; -#line 399 "rx-decode.opc" +#line 400 "rx-decode.opc" int rsrc AU = op[1] & 0x0f; if (trace) { @@ -7174,7 +7175,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("push%s %1"); -#line 399 "rx-decode.opc" +#line 400 "rx-decode.opc" ID(mov); BWL(sz); OP(0, RX_Operand_Predec, 0, 0); SR(rsrc); F_____; } @@ -7182,7 +7183,7 @@ rx_decode_opcode (unsigned long pc AU, case 0xb0: { /** 0111 1110 1011 rdst pop %0 */ -#line 396 "rx-decode.opc" +#line 397 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -7192,7 +7193,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("pop %0"); -#line 396 "rx-decode.opc" +#line 397 "rx-decode.opc" ID(mov); OP(1, RX_Operand_Postinc, 0, 0); DR(rdst); F_____; } @@ -7201,7 +7202,7 @@ rx_decode_opcode (unsigned long pc AU, case 0xd0: { /** 0111 1110 110 crsrc pushc %1 */ -#line 1029 "rx-decode.opc" +#line 1038 "rx-decode.opc" int crsrc AU = op[1] & 0x1f; if (trace) { @@ -7211,8 +7212,16 @@ rx_decode_opcode (unsigned long pc AU, printf (" crsrc = 0x%x\n", crsrc); } SYNTAX("pushc %1"); -#line 1029 "rx-decode.opc" +#line 1038 "rx-decode.opc" + if (crsrc > 0xD || (crsrc > 0xC && machine == bfd_mach_rx)) + { + /* fake a non existent control reg in order not to mess up decoding */ + ID(mov); OP(0, RX_Operand_Predec, 0, 0); SR(40); + } + else + { ID(mov); OP(0, RX_Operand_Predec, 0, 0); SR(crsrc + 16); + } } break; @@ -7220,7 +7229,7 @@ rx_decode_opcode (unsigned long pc AU, case 0xf0: { /** 0111 1110 111 crdst popc %0 */ -#line 1026 "rx-decode.opc" +#line 1027 "rx-decode.opc" int crdst AU = op[1] & 0x1f; if (trace) { @@ -7230,8 +7239,16 @@ rx_decode_opcode (unsigned long pc AU, printf (" crdst = 0x%x\n", crdst); } SYNTAX("popc %0"); -#line 1026 "rx-decode.opc" +#line 1027 "rx-decode.opc" + if ((crdst == 1) || (crdst > 0xD || (crdst > 0xC && machine == bfd_mach_rx))) + { + /* fake a non existent control reg in order not to mess up decoding */ + ID(mov); OP(1, RX_Operand_Postinc, 0, 0); DR(40); + } + else + { ID(mov); OP(1, RX_Operand_Postinc, 0, 0); DR(crdst + 16); + } } break; @@ -7260,7 +7277,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x0f: { /** 0111 1111 0000 rsrc jmp %0 */ -#line 816 "rx-decode.opc" +#line 817 "rx-decode.opc" int rsrc AU = op[1] & 0x0f; if (trace) { @@ -7270,7 +7287,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("jmp %0"); -#line 816 "rx-decode.opc" +#line 817 "rx-decode.opc" ID(branch); DR(rsrc); } @@ -7293,7 +7310,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x1f: { /** 0111 1111 0001 rsrc jsr %0 */ -#line 819 "rx-decode.opc" +#line 820 "rx-decode.opc" int rsrc AU = op[1] & 0x0f; if (trace) { @@ -7303,7 +7320,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("jsr %0"); -#line 819 "rx-decode.opc" +#line 820 "rx-decode.opc" ID(jsr); DR(rsrc); } @@ -7326,7 +7343,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x4f: { /** 0111 1111 0100 rsrc bra.l %0 */ -#line 812 "rx-decode.opc" +#line 813 "rx-decode.opc" int rsrc AU = op[1] & 0x0f; if (trace) { @@ -7336,7 +7353,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("bra.l %0"); -#line 812 "rx-decode.opc" +#line 813 "rx-decode.opc" ID(branchrel); DR(rsrc); @@ -7360,7 +7377,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x5f: { /** 0111 1111 0101 rsrc bsr.l %0 */ -#line 828 "rx-decode.opc" +#line 829 "rx-decode.opc" int rsrc AU = op[1] & 0x0f; if (trace) { @@ -7370,7 +7387,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("bsr.l %0"); -#line 828 "rx-decode.opc" +#line 829 "rx-decode.opc" ID(jsrrel); DR(rsrc); } @@ -7380,7 +7397,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x82: { /** 0111 1111 1000 00sz suntil%s */ -#line 852 "rx-decode.opc" +#line 853 "rx-decode.opc" int sz AU = op[1] & 0x03; if (trace) { @@ -7390,7 +7407,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" sz = 0x%x\n", sz); } SYNTAX("suntil%s"); -#line 852 "rx-decode.opc" +#line 853 "rx-decode.opc" ID(suntil); BWL(sz); F___ZC; } @@ -7405,7 +7422,7 @@ rx_decode_opcode (unsigned long pc AU, op[0], op[1]); } SYNTAX("scmpu"); -#line 843 "rx-decode.opc" +#line 844 "rx-decode.opc" ID(scmpu); F___ZC; } @@ -7415,7 +7432,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x86: { /** 0111 1111 1000 01sz swhile%s */ -#line 855 "rx-decode.opc" +#line 856 "rx-decode.opc" int sz AU = op[1] & 0x03; if (trace) { @@ -7425,7 +7442,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" sz = 0x%x\n", sz); } SYNTAX("swhile%s"); -#line 855 "rx-decode.opc" +#line 856 "rx-decode.opc" ID(swhile); BWL(sz); F___ZC; } @@ -7440,7 +7457,7 @@ rx_decode_opcode (unsigned long pc AU, op[0], op[1]); } SYNTAX("smovu"); -#line 846 "rx-decode.opc" +#line 847 "rx-decode.opc" ID(smovu); } @@ -7450,7 +7467,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x8a: { /** 0111 1111 1000 10sz sstr%s */ -#line 861 "rx-decode.opc" +#line 862 "rx-decode.opc" int sz AU = op[1] & 0x03; if (trace) { @@ -7460,7 +7477,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" sz = 0x%x\n", sz); } SYNTAX("sstr%s"); -#line 861 "rx-decode.opc" +#line 862 "rx-decode.opc" ID(sstr); BWL(sz); /*----------------------------------------------------------------------*/ @@ -7478,7 +7495,7 @@ rx_decode_opcode (unsigned long pc AU, op[0], op[1]); } SYNTAX("smovb"); -#line 849 "rx-decode.opc" +#line 850 "rx-decode.opc" ID(smovb); } @@ -7488,7 +7505,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x8e: { /** 0111 1111 1000 11sz rmpa%s */ -#line 867 "rx-decode.opc" +#line 868 "rx-decode.opc" int sz AU = op[1] & 0x03; if (trace) { @@ -7498,7 +7515,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" sz = 0x%x\n", sz); } SYNTAX("rmpa%s"); -#line 867 "rx-decode.opc" +#line 868 "rx-decode.opc" ID(rmpa); BWL(sz); F_OS__; /*----------------------------------------------------------------------*/ @@ -7516,7 +7533,7 @@ rx_decode_opcode (unsigned long pc AU, op[0], op[1]); } SYNTAX("smovf"); -#line 858 "rx-decode.opc" +#line 859 "rx-decode.opc" ID(smovf); } @@ -7531,7 +7548,7 @@ rx_decode_opcode (unsigned long pc AU, op[0], op[1]); } SYNTAX("satr"); -#line 909 "rx-decode.opc" +#line 910 "rx-decode.opc" ID(satr); /*----------------------------------------------------------------------*/ @@ -7549,7 +7566,7 @@ rx_decode_opcode (unsigned long pc AU, op[0], op[1]); } SYNTAX("rtfi"); -#line 1044 "rx-decode.opc" +#line 1084 "rx-decode.opc" ID(rtfi); } @@ -7564,7 +7581,7 @@ rx_decode_opcode (unsigned long pc AU, op[0], op[1]); } SYNTAX("rte"); -#line 1047 "rx-decode.opc" +#line 1087 "rx-decode.opc" ID(rte); } @@ -7579,7 +7596,7 @@ rx_decode_opcode (unsigned long pc AU, op[0], op[1]); } SYNTAX("wait"); -#line 1059 "rx-decode.opc" +#line 1099 "rx-decode.opc" ID(wait); /*----------------------------------------------------------------------*/ @@ -7605,7 +7622,7 @@ rx_decode_opcode (unsigned long pc AU, case 0xaf: { /** 0111 1111 1010 rdst setpsw %0 */ -#line 1020 "rx-decode.opc" +#line 1021 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -7615,7 +7632,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("setpsw %0"); -#line 1020 "rx-decode.opc" +#line 1021 "rx-decode.opc" ID(setpsw); DF(rdst); } @@ -7638,7 +7655,7 @@ rx_decode_opcode (unsigned long pc AU, case 0xbf: { /** 0111 1111 1011 rdst clrpsw %0 */ -#line 1017 "rx-decode.opc" +#line 1018 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -7648,7 +7665,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("clrpsw %0"); -#line 1017 "rx-decode.opc" +#line 1018 "rx-decode.opc" ID(clrpsw); DF(rdst); } @@ -7664,17 +7681,17 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_52: { /** 10sz 0dsp a dst b src mov%s %1, %0 */ -#line 357 "rx-decode.opc" +#line 358 "rx-decode.opc" int sz AU = (op[0] >> 4) & 0x03; -#line 357 "rx-decode.opc" +#line 358 "rx-decode.opc" int dsp AU = op[0] & 0x07; -#line 357 "rx-decode.opc" +#line 358 "rx-decode.opc" int a AU = (op[1] >> 7) & 0x01; -#line 357 "rx-decode.opc" +#line 358 "rx-decode.opc" int dst AU = (op[1] >> 4) & 0x07; -#line 357 "rx-decode.opc" +#line 358 "rx-decode.opc" int b AU = (op[1] >> 3) & 0x01; -#line 357 "rx-decode.opc" +#line 358 "rx-decode.opc" int src AU = op[1] & 0x07; if (trace) { @@ -7689,7 +7706,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" src = 0x%x\n", src); } SYNTAX("mov%s %1, %0"); -#line 357 "rx-decode.opc" +#line 358 "rx-decode.opc" ID(mov); sBWL(sz); DIs(dst, dsp*4+a*2+b, sz); SR(src); F_____; } @@ -7767,17 +7784,17 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_53: { /** 10sz 1dsp a src b dst mov%s %1, %0 */ -#line 354 "rx-decode.opc" +#line 355 "rx-decode.opc" int sz AU = (op[0] >> 4) & 0x03; -#line 354 "rx-decode.opc" +#line 355 "rx-decode.opc" int dsp AU = op[0] & 0x07; -#line 354 "rx-decode.opc" +#line 355 "rx-decode.opc" int a AU = (op[1] >> 7) & 0x01; -#line 354 "rx-decode.opc" +#line 355 "rx-decode.opc" int src AU = (op[1] >> 4) & 0x07; -#line 354 "rx-decode.opc" +#line 355 "rx-decode.opc" int b AU = (op[1] >> 3) & 0x01; -#line 354 "rx-decode.opc" +#line 355 "rx-decode.opc" int dst AU = op[1] & 0x07; if (trace) { @@ -7792,7 +7809,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" dst = 0x%x\n", dst); } SYNTAX("mov%s %1, %0"); -#line 354 "rx-decode.opc" +#line 355 "rx-decode.opc" ID(mov); sBWL(sz); DR(dst); SIs(src, dsp*4+a*2+b, sz); F_____; } @@ -8158,17 +8175,17 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_54: { /** 1011 w dsp a src b dst movu%s %1, %0 */ -#line 377 "rx-decode.opc" +#line 378 "rx-decode.opc" int w AU = (op[0] >> 3) & 0x01; -#line 377 "rx-decode.opc" +#line 378 "rx-decode.opc" int dsp AU = op[0] & 0x07; -#line 377 "rx-decode.opc" +#line 378 "rx-decode.opc" int a AU = (op[1] >> 7) & 0x01; -#line 377 "rx-decode.opc" +#line 378 "rx-decode.opc" int src AU = (op[1] >> 4) & 0x07; -#line 377 "rx-decode.opc" +#line 378 "rx-decode.opc" int b AU = (op[1] >> 3) & 0x01; -#line 377 "rx-decode.opc" +#line 378 "rx-decode.opc" int dst AU = op[1] & 0x07; if (trace) { @@ -8183,7 +8200,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" dst = 0x%x\n", dst); } SYNTAX("movu%s %1, %0"); -#line 377 "rx-decode.opc" +#line 378 "rx-decode.opc" ID(mov); uBW(w); DR(dst); SIs(src, dsp*4+a*2+b, w); F_____; } @@ -8333,15 +8350,15 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_55: { /** 11sz sd ss rsrc rdst mov%s %1, %0 */ -#line 335 "rx-decode.opc" +#line 336 "rx-decode.opc" int sz AU = (op[0] >> 4) & 0x03; -#line 335 "rx-decode.opc" +#line 336 "rx-decode.opc" int sd AU = (op[0] >> 2) & 0x03; -#line 335 "rx-decode.opc" +#line 336 "rx-decode.opc" int ss AU = op[0] & 0x03; -#line 335 "rx-decode.opc" +#line 336 "rx-decode.opc" int rsrc AU = (op[1] >> 4) & 0x0f; -#line 335 "rx-decode.opc" +#line 336 "rx-decode.opc" int rdst AU = op[1] & 0x0f; if (trace) { @@ -8355,7 +8372,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("mov%s %1, %0"); -#line 335 "rx-decode.opc" +#line 336 "rx-decode.opc" if (sd == 3 && ss == 3 && sz == 2 && rsrc == 0 && rdst == 0) { ID(nop2); @@ -8809,11 +8826,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_56: { /** 1111 00sd rdst 0bit bset #%1, %0%S0 */ -#line 960 "rx-decode.opc" +#line 961 "rx-decode.opc" int sd AU = op[0] & 0x03; -#line 960 "rx-decode.opc" +#line 961 "rx-decode.opc" int rdst AU = (op[1] >> 4) & 0x0f; -#line 960 "rx-decode.opc" +#line 961 "rx-decode.opc" int bit AU = op[1] & 0x07; if (trace) { @@ -8825,7 +8842,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" bit = 0x%x\n", bit); } SYNTAX("bset #%1, %0%S0"); -#line 960 "rx-decode.opc" +#line 961 "rx-decode.opc" ID(bset); BWL(BSIZE); SC(bit); DD(sd, rdst, BSIZE); F_____; } @@ -8834,11 +8851,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_57: { /** 1111 00sd rdst 1bit bclr #%1, %0%S0 */ -#line 972 "rx-decode.opc" +#line 973 "rx-decode.opc" int sd AU = op[0] & 0x03; -#line 972 "rx-decode.opc" +#line 973 "rx-decode.opc" int rdst AU = (op[1] >> 4) & 0x0f; -#line 972 "rx-decode.opc" +#line 973 "rx-decode.opc" int bit AU = op[1] & 0x07; if (trace) { @@ -8850,7 +8867,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" bit = 0x%x\n", bit); } SYNTAX("bclr #%1, %0%S0"); -#line 972 "rx-decode.opc" +#line 973 "rx-decode.opc" ID(bclr); BWL(BSIZE); SC(bit); DD(sd, rdst, BSIZE); F_____; } @@ -8902,11 +8919,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_58: { /** 1111 01sd rdst 0bit btst #%2, %1%S1 */ -#line 984 "rx-decode.opc" +#line 985 "rx-decode.opc" int sd AU = op[0] & 0x03; -#line 984 "rx-decode.opc" +#line 985 "rx-decode.opc" int rdst AU = (op[1] >> 4) & 0x0f; -#line 984 "rx-decode.opc" +#line 985 "rx-decode.opc" int bit AU = op[1] & 0x07; if (trace) { @@ -8918,7 +8935,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" bit = 0x%x\n", bit); } SYNTAX("btst #%2, %1%S1"); -#line 984 "rx-decode.opc" +#line 985 "rx-decode.opc" ID(btst); BWL(BSIZE); S2C(bit); SD(sd, rdst, BSIZE); F___ZC; } @@ -8927,11 +8944,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_59: { /** 1111 01ss rsrc 10sz push%s %1 */ -#line 402 "rx-decode.opc" +#line 403 "rx-decode.opc" int ss AU = op[0] & 0x03; -#line 402 "rx-decode.opc" +#line 403 "rx-decode.opc" int rsrc AU = (op[1] >> 4) & 0x0f; -#line 402 "rx-decode.opc" +#line 403 "rx-decode.opc" int sz AU = op[1] & 0x03; if (trace) { @@ -8943,7 +8960,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" sz = 0x%x\n", sz); } SYNTAX("push%s %1"); -#line 402 "rx-decode.opc" +#line 403 "rx-decode.opc" ID(mov); BWL(sz); OP(0, RX_Operand_Predec, 0, 0); SD(ss, rsrc, sz); F_____; /*----------------------------------------------------------------------*/ @@ -9004,13 +9021,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_60: { /** 1111 10sd rdst im sz mov%s #%1, %0 */ -#line 313 "rx-decode.opc" +#line 314 "rx-decode.opc" int sd AU = op[0] & 0x03; -#line 313 "rx-decode.opc" +#line 314 "rx-decode.opc" int rdst AU = (op[1] >> 4) & 0x0f; -#line 313 "rx-decode.opc" +#line 314 "rx-decode.opc" int im AU = (op[1] >> 2) & 0x03; -#line 313 "rx-decode.opc" +#line 314 "rx-decode.opc" int sz AU = op[1] & 0x03; if (trace) { @@ -9023,7 +9040,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" sz = 0x%x\n", sz); } SYNTAX("mov%s #%1, %0"); -#line 313 "rx-decode.opc" +#line 314 "rx-decode.opc" ID(mov); DD(sd, rdst, sz); if ((im == 1 && sz == 0) || (im == 2 && sz == 1) @@ -9248,7 +9265,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1001 0000 0011 rdst 0000 dmov.l #%1, %0 */ -#line 1211 "rx-decode.opc" +#line 1251 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; if (trace) { @@ -9258,7 +9275,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("dmov.l #%1, %0"); -#line 1211 "rx-decode.opc" +#line 1251 "rx-decode.opc" ID(dmov); DDRL(rdst); SC(IMMex(0)); F_____; } @@ -9267,9 +9284,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x03: { /** 1111 1001 0000 0011 rdst 001s dmov%s #%1, %0 */ -#line 1208 "rx-decode.opc" +#line 1248 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; -#line 1208 "rx-decode.opc" +#line 1248 "rx-decode.opc" int s AU = op[2] & 0x01; if (trace) { @@ -9280,7 +9297,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" s = 0x%x\n", s); } SYNTAX("dmov%s #%1, %0"); -#line 1208 "rx-decode.opc" +#line 1248 "rx-decode.opc" ID(dmov); DDRH(rdst); DL(s); SC(IMMex(0)); F_____; } @@ -9320,9 +9337,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1100 0000 0011 rsrc rdst sbb %1, %0 */ -#line 576 "rx-decode.opc" +#line 577 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 576 "rx-decode.opc" +#line 577 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -9333,7 +9350,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("sbb %1, %0"); -#line 576 "rx-decode.opc" +#line 577 "rx-decode.opc" ID(sbb); SR (rsrc); DR(rdst); F_OSZC; /* FIXME: only supports .L */ @@ -9348,9 +9365,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1100 0000 0111 rsrc rdst neg %2, %0 */ -#line 507 "rx-decode.opc" +#line 508 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 507 "rx-decode.opc" +#line 508 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -9361,7 +9378,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("neg %2, %0"); -#line 507 "rx-decode.opc" +#line 508 "rx-decode.opc" ID(sub); DR(rdst); SC(0); S2R(rsrc); F_OSZC; /*----------------------------------------------------------------------*/ @@ -9378,9 +9395,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1100 0000 1011 rsrc rdst adc %1, %0 */ -#line 516 "rx-decode.opc" +#line 517 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 516 "rx-decode.opc" +#line 517 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -9391,7 +9408,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("adc %1, %0"); -#line 516 "rx-decode.opc" +#line 517 "rx-decode.opc" ID(adc); SR(rsrc); DR(rdst); F_OSZC; } @@ -9405,9 +9422,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1100 0000 1111 rsrc rdst abs %1, %0 */ -#line 589 "rx-decode.opc" +#line 590 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 589 "rx-decode.opc" +#line 590 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -9418,7 +9435,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("abs %1, %0"); -#line 589 "rx-decode.opc" +#line 590 "rx-decode.opc" ID(abs); DR(rdst); SR(rsrc); F_OSZ_; /*----------------------------------------------------------------------*/ @@ -9436,11 +9453,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_61: { /** 1111 1100 0001 00ss rsrc rdst max %1%S1, %0 */ -#line 608 "rx-decode.opc" +#line 609 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 608 "rx-decode.opc" +#line 609 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 608 "rx-decode.opc" +#line 609 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -9452,7 +9469,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("max %1%S1, %0"); -#line 608 "rx-decode.opc" +#line 609 "rx-decode.opc" if (ss == 3 && rsrc == 0 && rdst == 0) { ID(nop3); @@ -9502,11 +9519,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_62: { /** 1111 1100 0001 01ss rsrc rdst min %1%S1, %0 */ -#line 628 "rx-decode.opc" +#line 629 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 628 "rx-decode.opc" +#line 629 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 628 "rx-decode.opc" +#line 629 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -9518,7 +9535,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("min %1%S1, %0"); -#line 628 "rx-decode.opc" +#line 629 "rx-decode.opc" ID(min); SP(ss, rsrc); DR(rdst); } @@ -9560,11 +9577,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_63: { /** 1111 1100 0001 10ss rsrc rdst emul %1%S1, %0 */ -#line 686 "rx-decode.opc" +#line 687 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 686 "rx-decode.opc" +#line 687 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 686 "rx-decode.opc" +#line 687 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -9576,7 +9593,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("emul %1%S1, %0"); -#line 686 "rx-decode.opc" +#line 687 "rx-decode.opc" ID(emul); SP(ss, rsrc); DR(rdst); } @@ -9618,11 +9635,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_64: { /** 1111 1100 0001 11ss rsrc rdst emulu %1%S1, %0 */ -#line 698 "rx-decode.opc" +#line 699 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 698 "rx-decode.opc" +#line 699 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 698 "rx-decode.opc" +#line 699 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -9634,7 +9651,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("emulu %1%S1, %0"); -#line 698 "rx-decode.opc" +#line 699 "rx-decode.opc" ID(emulu); SP(ss, rsrc); DR(rdst); } @@ -9676,11 +9693,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_65: { /** 1111 1100 0010 00ss rsrc rdst div %1%S1, %0 */ -#line 710 "rx-decode.opc" +#line 711 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 710 "rx-decode.opc" +#line 711 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 710 "rx-decode.opc" +#line 711 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -9692,7 +9709,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("div %1%S1, %0"); -#line 710 "rx-decode.opc" +#line 711 "rx-decode.opc" ID(div); SP(ss, rsrc); DR(rdst); F_O___; } @@ -9734,11 +9751,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_66: { /** 1111 1100 0010 01ss rsrc rdst divu %1%S1, %0 */ -#line 722 "rx-decode.opc" +#line 723 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 722 "rx-decode.opc" +#line 723 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 722 "rx-decode.opc" +#line 723 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -9750,7 +9767,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("divu %1%S1, %0"); -#line 722 "rx-decode.opc" +#line 723 "rx-decode.opc" ID(divu); SP(ss, rsrc); DR(rdst); F_O___; } @@ -9792,11 +9809,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_67: { /** 1111 1100 0011 00ss rsrc rdst tst %1%S1, %2 */ -#line 495 "rx-decode.opc" +#line 496 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 495 "rx-decode.opc" +#line 496 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 495 "rx-decode.opc" +#line 496 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -9808,7 +9825,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("tst %1%S1, %2"); -#line 495 "rx-decode.opc" +#line 496 "rx-decode.opc" ID(and); SP(ss, rsrc); S2R(rdst); F__SZ_; } @@ -9850,11 +9867,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_68: { /** 1111 1100 0011 01ss rsrc rdst xor %1%S1, %0 */ -#line 474 "rx-decode.opc" +#line 475 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 474 "rx-decode.opc" +#line 475 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 474 "rx-decode.opc" +#line 475 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -9866,7 +9883,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("xor %1%S1, %0"); -#line 474 "rx-decode.opc" +#line 475 "rx-decode.opc" ID(xor); SP(ss, rsrc); DR(rdst); F__SZ_; } @@ -9907,9 +9924,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1100 0011 1011 rsrc rdst not %1, %0 */ -#line 486 "rx-decode.opc" +#line 487 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 486 "rx-decode.opc" +#line 487 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -9920,7 +9937,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("not %1, %0"); -#line 486 "rx-decode.opc" +#line 487 "rx-decode.opc" ID(xor); DR(rdst); SR(rsrc); S2C(~0); F__SZ_; /*----------------------------------------------------------------------*/ @@ -9938,11 +9955,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_69: { /** 1111 1100 0100 00ss rsrc rdst xchg %1%S1, %0 */ -#line 408 "rx-decode.opc" +#line 409 "rx-decode.opc" int ss AU = op[1] & 0x03; -#line 408 "rx-decode.opc" +#line 409 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 408 "rx-decode.opc" +#line 409 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -9954,7 +9971,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("xchg %1%S1, %0"); -#line 408 "rx-decode.opc" +#line 409 "rx-decode.opc" ID(xchg); DR(rdst); SP(ss, rsrc); } @@ -9996,11 +10013,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_70: { /** 1111 1100 0100 01sd rsrc rdst itof %1%S1, %0 */ -#line 951 "rx-decode.opc" +#line 952 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 951 "rx-decode.opc" +#line 952 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 951 "rx-decode.opc" +#line 952 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -10012,7 +10029,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("itof %1%S1, %0"); -#line 951 "rx-decode.opc" +#line 952 "rx-decode.opc" ID(itof); DR (rdst); SP(sd, rsrc); F__SZ_; } @@ -10053,9 +10070,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1100 0100 1011 rsrc rdst stz %1, %0 */ -#line 1077 "rx-decode.opc" +#line 1117 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1077 "rx-decode.opc" +#line 1117 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -10066,7 +10083,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("stz %1, %0"); -#line 1077 "rx-decode.opc" +#line 1117 "rx-decode.opc" ID(stcc); SR(rsrc); DR(rdst); S2cc(RXC_z); } @@ -10080,9 +10097,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1100 0100 1111 rsrc rdst stnz %1, %0 */ -#line 1080 "rx-decode.opc" +#line 1120 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1080 "rx-decode.opc" +#line 1120 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -10093,7 +10110,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("stnz %1, %0"); -#line 1080 "rx-decode.opc" +#line 1120 "rx-decode.opc" ID(stcc); SR(rsrc); DR(rdst); S2cc(RXC_nz); } @@ -10108,11 +10125,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_71: { /** 1111 1100 0101 01sd rsrc rdst utof %1%S1, %0 */ -#line 1137 "rx-decode.opc" +#line 1177 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 1137 "rx-decode.opc" +#line 1177 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1137 "rx-decode.opc" +#line 1177 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -10124,7 +10141,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("utof %1%S1, %0"); -#line 1137 "rx-decode.opc" +#line 1177 "rx-decode.opc" ID(utof); DR (rdst); SP(sd, rsrc); F__SZ_; } @@ -10165,9 +10182,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1100 0101 1010 rsrc rdst bfmovz %bf */ -#line 1152 "rx-decode.opc" +#line 1192 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1152 "rx-decode.opc" +#line 1192 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -10178,7 +10195,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("bfmovz %bf"); -#line 1152 "rx-decode.opc" +#line 1192 "rx-decode.opc" ID(bfmovz); DR(rdst); SR(rsrc); S2C(IMM(2)); F_____; } @@ -10192,9 +10209,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1100 0101 1110 rsrc rdst bfmov %bf */ -#line 1149 "rx-decode.opc" +#line 1189 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1149 "rx-decode.opc" +#line 1189 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -10205,7 +10222,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("bfmov %bf"); -#line 1149 "rx-decode.opc" +#line 1189 "rx-decode.opc" ID(bfmov); DR(rdst); SR(rsrc); S2C(IMM(2)); F_____; } @@ -10220,11 +10237,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_72: { /** 1111 1100 0110 00sd rdst rsrc bset %1, %0%S0 */ -#line 963 "rx-decode.opc" +#line 964 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 963 "rx-decode.opc" +#line 964 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; -#line 963 "rx-decode.opc" +#line 964 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; if (trace) { @@ -10236,7 +10253,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("bset %1, %0%S0"); -#line 963 "rx-decode.opc" +#line 964 "rx-decode.opc" ID(bset); BWL(BSIZE); SR(rsrc); DD(sd, rdst, BSIZE); F_____; if (sd == 3) /* bset reg,reg */ BWL(LSIZE); @@ -10280,11 +10297,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_73: { /** 1111 1100 0110 01sd rdst rsrc bclr %1, %0%S0 */ -#line 975 "rx-decode.opc" +#line 976 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 975 "rx-decode.opc" +#line 976 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; -#line 975 "rx-decode.opc" +#line 976 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; if (trace) { @@ -10296,7 +10313,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("bclr %1, %0%S0"); -#line 975 "rx-decode.opc" +#line 976 "rx-decode.opc" ID(bclr); BWL(BSIZE); SR(rsrc); DD(sd, rdst, BSIZE); F_____; if (sd == 3) /* bset reg,reg */ BWL(LSIZE); @@ -10340,11 +10357,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_74: { /** 1111 1100 0110 10sd rdst rsrc btst %2, %1%S1 */ -#line 987 "rx-decode.opc" +#line 988 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 987 "rx-decode.opc" +#line 988 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; -#line 987 "rx-decode.opc" +#line 988 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; if (trace) { @@ -10356,7 +10373,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("btst %2, %1%S1"); -#line 987 "rx-decode.opc" +#line 988 "rx-decode.opc" ID(btst); BWL(BSIZE); S2R(rsrc); SD(sd, rdst, BSIZE); F___ZC; if (sd == 3) /* bset reg,reg */ BWL(LSIZE); @@ -10400,11 +10417,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_75: { /** 1111 1100 0110 11sd rdst rsrc bnot %1, %0%S0 */ -#line 999 "rx-decode.opc" +#line 1000 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 999 "rx-decode.opc" +#line 1000 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; -#line 999 "rx-decode.opc" +#line 1000 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; if (trace) { @@ -10416,7 +10433,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("bnot %1, %0%S0"); -#line 999 "rx-decode.opc" +#line 1000 "rx-decode.opc" ID(bnot); BWL(BSIZE); SR(rsrc); DD(sd, rdst, BSIZE); if (sd == 3) /* bset reg,reg */ BWL(LSIZE); @@ -10460,9 +10477,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_76: { /** 1111 1100 0111 10sz rdst 1000 dmov.d %1, %0 */ -#line 1185 "rx-decode.opc" +#line 1225 "rx-decode.opc" int sz AU = op[1] & 0x03; -#line 1185 "rx-decode.opc" +#line 1225 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; if (trace) { @@ -10473,7 +10490,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("dmov.d %1, %0"); -#line 1185 "rx-decode.opc" +#line 1225 "rx-decode.opc" int rsrc; rx_disp(0, sz, rdst, RX_Double, ld); rsrc = GETBYTE(); @@ -10516,11 +10533,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_77: { /** 1111 1100 1000 00sd rsrc rdst fsub %1%S1, %0 */ -#line 930 "rx-decode.opc" +#line 931 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 930 "rx-decode.opc" +#line 931 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 930 "rx-decode.opc" +#line 931 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -10532,7 +10549,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("fsub %1%S1, %0"); -#line 930 "rx-decode.opc" +#line 931 "rx-decode.opc" ID(fsub); DR(rdst); SD(sd, rsrc, LSIZE); F__SZ_; } @@ -10574,11 +10591,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_78: { /** 1111 1100 1000 01sd rsrc rdst fcmp %1%S1, %0 */ -#line 924 "rx-decode.opc" +#line 925 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 924 "rx-decode.opc" +#line 925 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 924 "rx-decode.opc" +#line 925 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -10590,7 +10607,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("fcmp %1%S1, %0"); -#line 924 "rx-decode.opc" +#line 925 "rx-decode.opc" ID(fcmp); DR(rdst); SD(sd, rsrc, LSIZE); F_OSZ_; } @@ -10632,11 +10649,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_79: { /** 1111 1100 1000 10sd rsrc rdst fadd %1%S1, %0 */ -#line 918 "rx-decode.opc" +#line 919 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 918 "rx-decode.opc" +#line 919 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 918 "rx-decode.opc" +#line 919 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -10648,7 +10665,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("fadd %1%S1, %0"); -#line 918 "rx-decode.opc" +#line 919 "rx-decode.opc" ID(fadd); DR(rdst); SD(sd, rsrc, LSIZE); F__SZ_; } @@ -10690,11 +10707,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_80: { /** 1111 1100 1000 11sd rsrc rdst fmul %1%S1, %0 */ -#line 939 "rx-decode.opc" +#line 940 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 939 "rx-decode.opc" +#line 940 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 939 "rx-decode.opc" +#line 940 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -10706,7 +10723,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("fmul %1%S1, %0"); -#line 939 "rx-decode.opc" +#line 940 "rx-decode.opc" ID(fmul); DR(rdst); SD(sd, rsrc, LSIZE); F__SZ_; } @@ -10748,11 +10765,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_81: { /** 1111 1100 1001 00sd rsrc rdst fdiv %1%S1, %0 */ -#line 945 "rx-decode.opc" +#line 946 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 945 "rx-decode.opc" +#line 946 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 945 "rx-decode.opc" +#line 946 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -10764,7 +10781,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("fdiv %1%S1, %0"); -#line 945 "rx-decode.opc" +#line 946 "rx-decode.opc" ID(fdiv); DR(rdst); SD(sd, rsrc, LSIZE); F__SZ_; } @@ -10806,11 +10823,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_82: { /** 1111 1100 1001 01sd rsrc rdst ftoi %1%S1, %0 */ -#line 933 "rx-decode.opc" +#line 934 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 933 "rx-decode.opc" +#line 934 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 933 "rx-decode.opc" +#line 934 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -10822,7 +10839,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("ftoi %1%S1, %0"); -#line 933 "rx-decode.opc" +#line 934 "rx-decode.opc" ID(ftoi); DR(rdst); SD(sd, rsrc, LSIZE); F__SZ_; } @@ -10864,11 +10881,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_83: { /** 1111 1100 1001 10sd rsrc rdst round %1%S1, %0 */ -#line 948 "rx-decode.opc" +#line 949 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 948 "rx-decode.opc" +#line 949 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 948 "rx-decode.opc" +#line 949 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -10880,7 +10897,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("round %1%S1, %0"); -#line 948 "rx-decode.opc" +#line 949 "rx-decode.opc" ID(round); DR(rdst); SD(sd, rsrc, LSIZE); F__SZ_; } @@ -10922,11 +10939,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_84: { /** 1111 1100 1010 00sd rsrc rdst fsqrt %1%S1, %0 */ -#line 1131 "rx-decode.opc" +#line 1171 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 1131 "rx-decode.opc" +#line 1171 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1131 "rx-decode.opc" +#line 1171 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -10938,7 +10955,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("fsqrt %1%S1, %0"); -#line 1131 "rx-decode.opc" +#line 1171 "rx-decode.opc" ID(fsqrt); DR(rdst); SD(sd, rsrc, LSIZE); F__SZ_; } @@ -10980,11 +10997,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_85: { /** 1111 1100 1010 01sd rsrc rdst ftou %1%S1, %0 */ -#line 1134 "rx-decode.opc" +#line 1174 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 1134 "rx-decode.opc" +#line 1174 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1134 "rx-decode.opc" +#line 1174 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -10996,7 +11013,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("ftou %1%S1, %0"); -#line 1134 "rx-decode.opc" +#line 1174 "rx-decode.opc" ID(ftou); DR(rdst); SD(sd, rsrc, LSIZE); F__SZ_; } @@ -11038,9 +11055,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_86: { /** 1111 1100 1100 10sz rsrc 1000 dmov.d %1, %0 */ -#line 1198 "rx-decode.opc" +#line 1238 "rx-decode.opc" int sz AU = op[1] & 0x03; -#line 1198 "rx-decode.opc" +#line 1238 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; if (trace) { @@ -11051,7 +11068,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("dmov.d %1, %0"); -#line 1198 "rx-decode.opc" +#line 1238 "rx-decode.opc" int rdst; rx_disp(1, sz, rsrc, RX_Double, ld); rdst = GETBYTE(); @@ -11094,13 +11111,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_87: { /** 1111 1100 1101 sz sd rdst cond sc%1%s %0 */ -#line 1065 "rx-decode.opc" +#line 1105 "rx-decode.opc" int sz AU = (op[1] >> 2) & 0x03; -#line 1065 "rx-decode.opc" +#line 1105 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 1065 "rx-decode.opc" +#line 1105 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; -#line 1065 "rx-decode.opc" +#line 1105 "rx-decode.opc" int cond AU = op[2] & 0x0f; if (trace) { @@ -11113,7 +11130,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" cond = 0x%x\n", cond); } SYNTAX("sc%1%s %0"); -#line 1065 "rx-decode.opc" +#line 1105 "rx-decode.opc" ID(sccnd); BWL(sz); DD (sd, rdst, sz); Scc(cond); /*----------------------------------------------------------------------*/ @@ -11244,13 +11261,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_88: { /** 1111 1100 111bit sd rdst cond bm%2 #%1, %0%S0 */ -#line 1008 "rx-decode.opc" +#line 1009 "rx-decode.opc" int bit AU = (op[1] >> 2) & 0x07; -#line 1008 "rx-decode.opc" +#line 1009 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 1008 "rx-decode.opc" +#line 1009 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; -#line 1008 "rx-decode.opc" +#line 1009 "rx-decode.opc" int cond AU = op[2] & 0x0f; if (trace) { @@ -11263,7 +11280,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" cond = 0x%x\n", cond); } SYNTAX("bm%2 #%1, %0%S0"); -#line 1008 "rx-decode.opc" +#line 1009 "rx-decode.opc" ID(bmcc); BWL(BSIZE); S2cc(cond); SC(bit); DD(sd, rdst, BSIZE); } @@ -11272,11 +11289,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_89: { /** 1111 1100 111bit sd rdst 1111 bnot #%1, %0%S0 */ -#line 996 "rx-decode.opc" +#line 997 "rx-decode.opc" int bit AU = (op[1] >> 2) & 0x07; -#line 996 "rx-decode.opc" +#line 997 "rx-decode.opc" int sd AU = op[1] & 0x03; -#line 996 "rx-decode.opc" +#line 997 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; if (trace) { @@ -11288,7 +11305,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("bnot #%1, %0%S0"); -#line 996 "rx-decode.opc" +#line 997 "rx-decode.opc" ID(bnot); BWL(BSIZE); SC(bit); DD(sd, rdst, BSIZE); } @@ -12116,11 +12133,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_90: { /** 1111 1101 0000 a000 srca srcb mulhi %1, %2, %0 */ -#line 873 "rx-decode.opc" +#line 874 "rx-decode.opc" int a AU = (op[1] >> 3) & 0x01; -#line 873 "rx-decode.opc" +#line 874 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 873 "rx-decode.opc" +#line 874 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -12132,7 +12149,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("mulhi %1, %2, %0"); -#line 873 "rx-decode.opc" +#line 874 "rx-decode.opc" ID(mulhi); DR(a+32); SR(srca); S2R(srcb); F_____; } @@ -12147,11 +12164,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_91: { /** 1111 1101 0000 a001 srca srcb mullo %1, %2, %0 */ -#line 876 "rx-decode.opc" +#line 877 "rx-decode.opc" int a AU = (op[1] >> 3) & 0x01; -#line 876 "rx-decode.opc" +#line 877 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 876 "rx-decode.opc" +#line 877 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -12163,7 +12180,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("mullo %1, %2, %0"); -#line 876 "rx-decode.opc" +#line 877 "rx-decode.opc" ID(mullo); DR(a+32); SR(srca); S2R(srcb); F_____; } @@ -12178,11 +12195,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_92: { /** 1111 1101 0000 a010 srca srcb mullh %1, %2, %0 */ -#line 1104 "rx-decode.opc" +#line 1144 "rx-decode.opc" int a AU = (op[1] >> 3) & 0x01; -#line 1104 "rx-decode.opc" +#line 1144 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 1104 "rx-decode.opc" +#line 1144 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -12194,7 +12211,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("mullh %1, %2, %0"); -#line 1104 "rx-decode.opc" +#line 1144 "rx-decode.opc" ID(mullh); DR(a+32); SR(srca); S2R(srcb); F_____; } @@ -12209,11 +12226,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_93: { /** 1111 1101 0000 a011 srca srcb emula %1, %2, %0 */ -#line 1089 "rx-decode.opc" +#line 1129 "rx-decode.opc" int a AU = (op[1] >> 3) & 0x01; -#line 1089 "rx-decode.opc" +#line 1129 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 1089 "rx-decode.opc" +#line 1129 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -12225,7 +12242,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("emula %1, %2, %0"); -#line 1089 "rx-decode.opc" +#line 1129 "rx-decode.opc" ID(emula); DR(a+32); SR(srca); S2R(srcb); F_____; } @@ -12240,11 +12257,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_94: { /** 1111 1101 0000 a100 srca srcb machi %1, %2, %0 */ -#line 879 "rx-decode.opc" +#line 880 "rx-decode.opc" int a AU = (op[1] >> 3) & 0x01; -#line 879 "rx-decode.opc" +#line 880 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 879 "rx-decode.opc" +#line 880 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -12256,7 +12273,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("machi %1, %2, %0"); -#line 879 "rx-decode.opc" +#line 880 "rx-decode.opc" ID(machi); DR(a+32); SR(srca); S2R(srcb); F_____; } @@ -12271,11 +12288,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_95: { /** 1111 1101 0000 a101 srca srcb maclo %1, %2, %0 */ -#line 882 "rx-decode.opc" +#line 883 "rx-decode.opc" int a AU = (op[1] >> 3) & 0x01; -#line 882 "rx-decode.opc" +#line 883 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 882 "rx-decode.opc" +#line 883 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -12287,7 +12304,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("maclo %1, %2, %0"); -#line 882 "rx-decode.opc" +#line 883 "rx-decode.opc" ID(maclo); DR(a+32); SR(srca); S2R(srcb); F_____; } @@ -12302,11 +12319,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_96: { /** 1111 1101 0000 a110 srca srcb maclh %1, %2, %0 */ -#line 1092 "rx-decode.opc" +#line 1132 "rx-decode.opc" int a AU = (op[1] >> 3) & 0x01; -#line 1092 "rx-decode.opc" +#line 1132 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 1092 "rx-decode.opc" +#line 1132 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -12318,7 +12335,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("maclh %1, %2, %0"); -#line 1092 "rx-decode.opc" +#line 1132 "rx-decode.opc" ID(maclh); DR(a+32); SR(srca); S2R(srcb); F_____; } @@ -12333,11 +12350,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_97: { /** 1111 1101 0000 a111 srca srcb emaca %1, %2, %0 */ -#line 1083 "rx-decode.opc" +#line 1123 "rx-decode.opc" int a AU = (op[1] >> 3) & 0x01; -#line 1083 "rx-decode.opc" +#line 1123 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 1083 "rx-decode.opc" +#line 1123 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -12349,7 +12366,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("emaca %1, %2, %0"); -#line 1083 "rx-decode.opc" +#line 1123 "rx-decode.opc" ID(emaca); DR(a+32); SR(srca); S2R(srcb); F_____; } @@ -12435,9 +12452,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1101 0001 0111 a000 rsrc mvtachi %1, %0 */ -#line 885 "rx-decode.opc" +#line 886 "rx-decode.opc" int a AU = (op[2] >> 7) & 0x01; -#line 885 "rx-decode.opc" +#line 886 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; if (trace) { @@ -12448,7 +12465,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("mvtachi %1, %0"); -#line 885 "rx-decode.opc" +#line 886 "rx-decode.opc" ID(mvtachi); DR(a+32); SR(rsrc); F_____; } @@ -12456,9 +12473,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x10: { /** 1111 1101 0001 0111 a001 rsrc mvtaclo %1, %0 */ -#line 888 "rx-decode.opc" +#line 889 "rx-decode.opc" int a AU = (op[2] >> 7) & 0x01; -#line 888 "rx-decode.opc" +#line 889 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; if (trace) { @@ -12469,7 +12486,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("mvtaclo %1, %0"); -#line 888 "rx-decode.opc" +#line 889 "rx-decode.opc" ID(mvtaclo); DR(a+32); SR(rsrc); F_____; } @@ -12477,9 +12494,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x30: { /** 1111 1101 0001 0111 a011 rsrc mvtacgu %1, %0 */ -#line 1110 "rx-decode.opc" +#line 1150 "rx-decode.opc" int a AU = (op[2] >> 7) & 0x01; -#line 1110 "rx-decode.opc" +#line 1150 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; if (trace) { @@ -12490,7 +12507,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("mvtacgu %1, %0"); -#line 1110 "rx-decode.opc" +#line 1150 "rx-decode.opc" ID(mvtacgu); SR(rsrc); DR(a+32); F_____; } @@ -12505,9 +12522,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1101 0001 1000 a00i 0000 racw #%1, %0 */ -#line 900 "rx-decode.opc" +#line 901 "rx-decode.opc" int a AU = (op[2] >> 7) & 0x01; -#line 900 "rx-decode.opc" +#line 901 "rx-decode.opc" int i AU = (op[2] >> 4) & 0x01; if (trace) { @@ -12518,7 +12535,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" i = 0x%x\n", i); } SYNTAX("racw #%1, %0"); -#line 900 "rx-decode.opc" +#line 901 "rx-decode.opc" ID(racw); SC(i+1); DR(a+32); F_____; /*----------------------------------------------------------------------*/ @@ -12529,9 +12546,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x40: { /** 1111 1101 0001 1000 a10i 0000 rdacw #%1, %0 */ -#line 1119 "rx-decode.opc" +#line 1159 "rx-decode.opc" int a AU = (op[2] >> 7) & 0x01; -#line 1119 "rx-decode.opc" +#line 1159 "rx-decode.opc" int i AU = (op[2] >> 4) & 0x01; if (trace) { @@ -12542,7 +12559,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" i = 0x%x\n", i); } SYNTAX("rdacw #%1, %0"); -#line 1119 "rx-decode.opc" +#line 1159 "rx-decode.opc" ID(rdacw); SC(i+1); DR(a+32); F_____; } @@ -12557,9 +12574,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1101 0001 1001 a00i 0000 racl #%1, %0 */ -#line 1113 "rx-decode.opc" +#line 1153 "rx-decode.opc" int a AU = (op[2] >> 7) & 0x01; -#line 1113 "rx-decode.opc" +#line 1153 "rx-decode.opc" int i AU = (op[2] >> 4) & 0x01; if (trace) { @@ -12570,7 +12587,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" i = 0x%x\n", i); } SYNTAX("racl #%1, %0"); -#line 1113 "rx-decode.opc" +#line 1153 "rx-decode.opc" ID(racl); SC(i+1); DR(a+32); F_____; } @@ -12578,9 +12595,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x40: { /** 1111 1101 0001 1001 a10i 0000 rdacl #%1, %0 */ -#line 1116 "rx-decode.opc" +#line 1156 "rx-decode.opc" int a AU = (op[2] >> 7) & 0x01; -#line 1116 "rx-decode.opc" +#line 1156 "rx-decode.opc" int i AU = (op[2] >> 4) & 0x01; if (trace) { @@ -12591,7 +12608,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" i = 0x%x\n", i); } SYNTAX("rdacl #%1, %0"); -#line 1116 "rx-decode.opc" +#line 1156 "rx-decode.opc" ID(rdacl); SC(i+1); DR(a+32); F_____; } @@ -12607,13 +12624,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_98: { /** 1111 1101 0001 111i a m00 rdst mvfachi #%2, %1, %0 */ -#line 891 "rx-decode.opc" +#line 892 "rx-decode.opc" int i AU = op[1] & 0x01; -#line 891 "rx-decode.opc" +#line 892 "rx-decode.opc" int a AU = (op[2] >> 7) & 0x01; -#line 891 "rx-decode.opc" +#line 892 "rx-decode.opc" int m AU = (op[2] >> 6) & 0x01; -#line 891 "rx-decode.opc" +#line 892 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -12626,7 +12643,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("mvfachi #%2, %1, %0"); -#line 891 "rx-decode.opc" +#line 892 "rx-decode.opc" ID(mvfachi); S2C(((i^1)<<1)|m); SR(a+32); DR(rdst); F_____; } @@ -12635,13 +12652,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_99: { /** 1111 1101 0001 111i a m01 rdst mvfaclo #%2, %1, %0 */ -#line 897 "rx-decode.opc" +#line 898 "rx-decode.opc" int i AU = op[1] & 0x01; -#line 897 "rx-decode.opc" +#line 898 "rx-decode.opc" int a AU = (op[2] >> 7) & 0x01; -#line 897 "rx-decode.opc" +#line 898 "rx-decode.opc" int m AU = (op[2] >> 6) & 0x01; -#line 897 "rx-decode.opc" +#line 898 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -12654,7 +12671,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("mvfaclo #%2, %1, %0"); -#line 897 "rx-decode.opc" +#line 898 "rx-decode.opc" ID(mvfaclo); S2C(((i^1)<<1)|m); SR(a+32); DR(rdst); F_____; } @@ -12663,13 +12680,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_100: { /** 1111 1101 0001 111i a m10 rdst mvfacmi #%2, %1, %0 */ -#line 894 "rx-decode.opc" +#line 895 "rx-decode.opc" int i AU = op[1] & 0x01; -#line 894 "rx-decode.opc" +#line 895 "rx-decode.opc" int a AU = (op[2] >> 7) & 0x01; -#line 894 "rx-decode.opc" +#line 895 "rx-decode.opc" int m AU = (op[2] >> 6) & 0x01; -#line 894 "rx-decode.opc" +#line 895 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -12682,7 +12699,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("mvfacmi #%2, %1, %0"); -#line 894 "rx-decode.opc" +#line 895 "rx-decode.opc" ID(mvfacmi); S2C(((i^1)<<1)|m); SR(a+32); DR(rdst); F_____; } @@ -12691,13 +12708,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_101: { /** 1111 1101 0001 111i a m11 rdst mvfacgu #%2, %1, %0 */ -#line 1107 "rx-decode.opc" +#line 1147 "rx-decode.opc" int i AU = op[1] & 0x01; -#line 1107 "rx-decode.opc" +#line 1147 "rx-decode.opc" int a AU = (op[2] >> 7) & 0x01; -#line 1107 "rx-decode.opc" +#line 1147 "rx-decode.opc" int m AU = (op[2] >> 6) & 0x01; -#line 1107 "rx-decode.opc" +#line 1147 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -12710,7 +12727,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("mvfacgu #%2, %1, %0"); -#line 1107 "rx-decode.opc" +#line 1147 "rx-decode.opc" ID(mvfacgu); S2C(((i^1)<<1)|m); SR(a+32); DR(rdst); F_____; } @@ -12743,13 +12760,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_102: { /** 1111 1101 0010 0p sz rdst rsrc mov%s %1, %0 */ -#line 369 "rx-decode.opc" +#line 370 "rx-decode.opc" int p AU = (op[1] >> 2) & 0x01; -#line 369 "rx-decode.opc" +#line 370 "rx-decode.opc" int sz AU = op[1] & 0x03; -#line 369 "rx-decode.opc" +#line 370 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; -#line 369 "rx-decode.opc" +#line 370 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; if (trace) { @@ -12762,7 +12779,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("mov%s %1, %0"); -#line 369 "rx-decode.opc" +#line 370 "rx-decode.opc" ID(mov); sBWL (sz); SR(rsrc); F_____; OP(0, p ? RX_Operand_Predec : RX_Operand_Postinc, rdst, 0); @@ -12822,9 +12839,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1101 0010 0111 rdst rsrc movco %1, [%0] */ -#line 1071 "rx-decode.opc" +#line 1111 "rx-decode.opc" int rdst AU = (op[2] >> 4) & 0x0f; -#line 1071 "rx-decode.opc" +#line 1111 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; if (trace) { @@ -12835,7 +12852,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("movco %1, [%0]"); -#line 1071 "rx-decode.opc" +#line 1111 "rx-decode.opc" ID(movco); SR(rsrc); DR(rdst); F_____; } @@ -12850,13 +12867,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_103: { /** 1111 1101 0010 1p sz rsrc rdst mov%s %1, %0 */ -#line 373 "rx-decode.opc" +#line 374 "rx-decode.opc" int p AU = (op[1] >> 2) & 0x01; -#line 373 "rx-decode.opc" +#line 374 "rx-decode.opc" int sz AU = op[1] & 0x03; -#line 373 "rx-decode.opc" +#line 374 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 373 "rx-decode.opc" +#line 374 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -12869,7 +12886,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("mov%s %1, %0"); -#line 373 "rx-decode.opc" +#line 374 "rx-decode.opc" ID(mov); sBWL (sz); DR(rdst); F_____; OP(1, p ? RX_Operand_Predec : RX_Operand_Postinc, rsrc, 0); @@ -12929,9 +12946,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1101 0010 1111 rsrc rdst movli [%1], %0 */ -#line 1074 "rx-decode.opc" +#line 1114 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1074 "rx-decode.opc" +#line 1114 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -12942,7 +12959,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("movli [%1], %0"); -#line 1074 "rx-decode.opc" +#line 1114 "rx-decode.opc" ID(movli); SR(rsrc); DR(rdst); F_____; } @@ -12957,13 +12974,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_104: { /** 1111 1101 0011 1p sz rsrc rdst movu%s %1, %0 */ -#line 383 "rx-decode.opc" +#line 384 "rx-decode.opc" int p AU = (op[1] >> 2) & 0x01; -#line 383 "rx-decode.opc" +#line 384 "rx-decode.opc" int sz AU = op[1] & 0x03; -#line 383 "rx-decode.opc" +#line 384 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 383 "rx-decode.opc" +#line 384 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -12976,7 +12993,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("movu%s %1, %0"); -#line 383 "rx-decode.opc" +#line 384 "rx-decode.opc" ID(mov); uBW (sz); DR(rdst); F_____; OP(1, p ? RX_Operand_Predec : RX_Operand_Postinc, rsrc, 0); @@ -13040,11 +13057,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_105: { /** 1111 1101 0100 a100 srca srcb msbhi %1, %2, %0 */ -#line 1095 "rx-decode.opc" +#line 1135 "rx-decode.opc" int a AU = (op[1] >> 3) & 0x01; -#line 1095 "rx-decode.opc" +#line 1135 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 1095 "rx-decode.opc" +#line 1135 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -13056,7 +13073,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("msbhi %1, %2, %0"); -#line 1095 "rx-decode.opc" +#line 1135 "rx-decode.opc" ID(msbhi); DR(a+32); SR(srca); S2R(srcb); F_____; } @@ -13071,11 +13088,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_106: { /** 1111 1101 0100 a101 srca srcb msblo %1, %2, %0 */ -#line 1101 "rx-decode.opc" +#line 1141 "rx-decode.opc" int a AU = (op[1] >> 3) & 0x01; -#line 1101 "rx-decode.opc" +#line 1141 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 1101 "rx-decode.opc" +#line 1141 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -13087,7 +13104,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("msblo %1, %2, %0"); -#line 1101 "rx-decode.opc" +#line 1141 "rx-decode.opc" ID(msblo); DR(a+32); SR(srca); S2R(srcb); F_____; } @@ -13102,11 +13119,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_107: { /** 1111 1101 0100 a110 srca srcb msblh %1, %2, %0 */ -#line 1098 "rx-decode.opc" +#line 1138 "rx-decode.opc" int a AU = (op[1] >> 3) & 0x01; -#line 1098 "rx-decode.opc" +#line 1138 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 1098 "rx-decode.opc" +#line 1138 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -13118,7 +13135,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("msblh %1, %2, %0"); -#line 1098 "rx-decode.opc" +#line 1138 "rx-decode.opc" ID(msblh); DR(a+32); SR(srca); S2R(srcb); F_____; } @@ -13133,11 +13150,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_108: { /** 1111 1101 0100 a111 srca srcb emsba %1, %2, %0 */ -#line 1086 "rx-decode.opc" +#line 1126 "rx-decode.opc" int a AU = (op[1] >> 3) & 0x01; -#line 1086 "rx-decode.opc" +#line 1126 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 1086 "rx-decode.opc" +#line 1126 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -13149,7 +13166,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("emsba %1, %2, %0"); -#line 1086 "rx-decode.opc" +#line 1126 "rx-decode.opc" ID(emsba); DR(a+32); SR(srca); S2R(srcb); F_____; } @@ -13199,9 +13216,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1101 0110 0000 rsrc rdst shlr %2, %0 */ -#line 754 "rx-decode.opc" +#line 755 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 754 "rx-decode.opc" +#line 755 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13212,7 +13229,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("shlr %2, %0"); -#line 754 "rx-decode.opc" +#line 755 "rx-decode.opc" ID(shlr); S2R(rsrc); SR(rdst); DR(rdst); F__SZC; } @@ -13226,9 +13243,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1101 0110 0001 rsrc rdst shar %2, %0 */ -#line 744 "rx-decode.opc" +#line 745 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 744 "rx-decode.opc" +#line 745 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13239,7 +13256,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("shar %2, %0"); -#line 744 "rx-decode.opc" +#line 745 "rx-decode.opc" ID(shar); S2R(rsrc); SR(rdst); DR(rdst); F_0SZC; } @@ -13253,9 +13270,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1101 0110 0010 rsrc rdst shll %2, %0 */ -#line 734 "rx-decode.opc" +#line 735 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 734 "rx-decode.opc" +#line 735 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13266,7 +13283,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("shll %2, %0"); -#line 734 "rx-decode.opc" +#line 735 "rx-decode.opc" ID(shll); S2R(rsrc); SR(rdst); DR(rdst); F_OSZC; } @@ -13280,9 +13297,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1101 0110 0100 rsrc rdst rotr %1, %0 */ -#line 778 "rx-decode.opc" +#line 779 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 778 "rx-decode.opc" +#line 779 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13293,7 +13310,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("rotr %1, %0"); -#line 778 "rx-decode.opc" +#line 779 "rx-decode.opc" ID(rotr); SR(rsrc); DR(rdst); F__SZC; } @@ -13307,9 +13324,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1101 0110 0101 rsrc rdst revw %1, %0 */ -#line 781 "rx-decode.opc" +#line 782 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 781 "rx-decode.opc" +#line 782 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13320,7 +13337,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("revw %1, %0"); -#line 781 "rx-decode.opc" +#line 782 "rx-decode.opc" ID(revw); SR(rsrc); DR(rdst); } @@ -13334,9 +13351,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1101 0110 0110 rsrc rdst rotl %1, %0 */ -#line 772 "rx-decode.opc" +#line 773 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 772 "rx-decode.opc" +#line 773 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13347,7 +13364,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("rotl %1, %0"); -#line 772 "rx-decode.opc" +#line 773 "rx-decode.opc" ID(rotl); SR(rsrc); DR(rdst); F__SZC; } @@ -13361,9 +13378,9 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1101 0110 0111 rsrc rdst revl %1, %0 */ -#line 784 "rx-decode.opc" +#line 785 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 784 "rx-decode.opc" +#line 785 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13374,7 +13391,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("revl %1, %0"); -#line 784 "rx-decode.opc" +#line 785 "rx-decode.opc" ID(revl); SR(rsrc); DR(rdst); /*----------------------------------------------------------------------*/ @@ -13392,24 +13409,32 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_109: { /** 1111 1101 0110 100c rsrc rdst mvtc %1, %0 */ -#line 1035 "rx-decode.opc" +#line 1060 "rx-decode.opc" int c AU = op[1] & 0x01; -#line 1035 "rx-decode.opc" +#line 1060 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1035 "rx-decode.opc" +#line 1060 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { printf ("\033[33m%s\033[0m %02x %02x %02x\n", - "/** 1111 1101 0110 100c rsrc rdst mvtc %1, %0 */", + "/** 1111 1101 0110 100c rsrc rdst mvtc %1, %0 */ ", op[0], op[1], op[2]); printf (" c = 0x%x,", c); printf (" rsrc = 0x%x,", rsrc); printf (" rdst = 0x%x\n", rdst); } SYNTAX("mvtc %1, %0"); -#line 1035 "rx-decode.opc" +#line 1060 "rx-decode.opc" + if (((c*16+rdst) == 1) || ((c*16+rdst) > 0xD || ((c*16+rdst) > 0xC && machine == bfd_mach_rx))) + { + /* fake a non existent control reg in order not to mess up decoding */ + ID(mov); SR(rsrc); DR(40); + } + else + { ID(mov); SR(rsrc); DR(c*16+rdst + 16); + } } break; @@ -13432,11 +13457,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_110: { /** 1111 1101 0110 101s rsrc rdst mvfc %1, %0 */ -#line 1038 "rx-decode.opc" +#line 1071 "rx-decode.opc" int s AU = op[1] & 0x01; -#line 1038 "rx-decode.opc" +#line 1071 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 1038 "rx-decode.opc" +#line 1071 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13448,9 +13473,16 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("mvfc %1, %0"); -#line 1038 "rx-decode.opc" +#line 1071 "rx-decode.opc" + if ((s*16+rsrc) > 0xD || ((s*16+rsrc) > 0xC && machine == bfd_mach_rx)) + { + /* fake a non existent control reg in order not to mess up decoding */ + ID(mov); SR(40); DR(rdst); + } + else + { ID(mov); SR((s*16+rsrc) + 16); DR(rdst); - + } /*----------------------------------------------------------------------*/ /* INTERRUPTS */ @@ -13475,11 +13507,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_111: { /** 1111 1101 0110 110i mmmm rdst rotr #%1, %0 */ -#line 775 "rx-decode.opc" +#line 776 "rx-decode.opc" int i AU = op[1] & 0x01; -#line 775 "rx-decode.opc" +#line 776 "rx-decode.opc" int mmmm AU = (op[2] >> 4) & 0x0f; -#line 775 "rx-decode.opc" +#line 776 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13491,7 +13523,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("rotr #%1, %0"); -#line 775 "rx-decode.opc" +#line 776 "rx-decode.opc" ID(rotr); SC(i*16+mmmm); DR(rdst); F__SZC; } @@ -13515,11 +13547,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_112: { /** 1111 1101 0110 111i mmmm rdst rotl #%1, %0 */ -#line 769 "rx-decode.opc" +#line 770 "rx-decode.opc" int i AU = op[1] & 0x01; -#line 769 "rx-decode.opc" +#line 770 "rx-decode.opc" int mmmm AU = (op[2] >> 4) & 0x0f; -#line 769 "rx-decode.opc" +#line 770 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13531,7 +13563,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("rotl #%1, %0"); -#line 769 "rx-decode.opc" +#line 770 "rx-decode.opc" ID(rotl); SC(i*16+mmmm); DR(rdst); F__SZC; } @@ -13555,9 +13587,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_113: { /** 1111 1101 0111 im00 0010rdst adc #%1, %0 */ -#line 513 "rx-decode.opc" +#line 514 "rx-decode.opc" int im AU = (op[1] >> 2) & 0x03; -#line 513 "rx-decode.opc" +#line 514 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13568,7 +13600,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("adc #%1, %0"); -#line 513 "rx-decode.opc" +#line 514 "rx-decode.opc" ID(adc); SC(IMMex(im)); DR(rdst); F_OSZC; } @@ -13577,9 +13609,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_114: { /** 1111 1101 0111 im00 0100rdst max #%1, %0 */ -#line 595 "rx-decode.opc" +#line 596 "rx-decode.opc" int im AU = (op[1] >> 2) & 0x03; -#line 595 "rx-decode.opc" +#line 596 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13590,7 +13622,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("max #%1, %0"); -#line 595 "rx-decode.opc" +#line 596 "rx-decode.opc" int val = IMMex (im); if (im == 0 && (unsigned) val == 0x80000000 && rdst == 0) { @@ -13609,9 +13641,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_115: { /** 1111 1101 0111 im00 0101rdst min #%1, %0 */ -#line 625 "rx-decode.opc" +#line 626 "rx-decode.opc" int im AU = (op[1] >> 2) & 0x03; -#line 625 "rx-decode.opc" +#line 626 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13622,7 +13654,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("min #%1, %0"); -#line 625 "rx-decode.opc" +#line 626 "rx-decode.opc" ID(min); DR(rdst); SC(IMMex(im)); } @@ -13631,9 +13663,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_116: { /** 1111 1101 0111 im00 0110rdst emul #%1, %0 */ -#line 683 "rx-decode.opc" +#line 684 "rx-decode.opc" int im AU = (op[1] >> 2) & 0x03; -#line 683 "rx-decode.opc" +#line 684 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13644,7 +13676,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("emul #%1, %0"); -#line 683 "rx-decode.opc" +#line 684 "rx-decode.opc" ID(emul); DR(rdst); SC(IMMex(im)); } @@ -13653,9 +13685,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_117: { /** 1111 1101 0111 im00 0111rdst emulu #%1, %0 */ -#line 695 "rx-decode.opc" +#line 696 "rx-decode.opc" int im AU = (op[1] >> 2) & 0x03; -#line 695 "rx-decode.opc" +#line 696 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13666,7 +13698,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("emulu #%1, %0"); -#line 695 "rx-decode.opc" +#line 696 "rx-decode.opc" ID(emulu); DR(rdst); SC(IMMex(im)); } @@ -13675,9 +13707,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_118: { /** 1111 1101 0111 im00 1000rdst div #%1, %0 */ -#line 707 "rx-decode.opc" +#line 708 "rx-decode.opc" int im AU = (op[1] >> 2) & 0x03; -#line 707 "rx-decode.opc" +#line 708 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13688,7 +13720,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("div #%1, %0"); -#line 707 "rx-decode.opc" +#line 708 "rx-decode.opc" ID(div); DR(rdst); SC(IMMex(im)); F_O___; } @@ -13697,9 +13729,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_119: { /** 1111 1101 0111 im00 1001rdst divu #%1, %0 */ -#line 719 "rx-decode.opc" +#line 720 "rx-decode.opc" int im AU = (op[1] >> 2) & 0x03; -#line 719 "rx-decode.opc" +#line 720 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13710,7 +13742,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("divu #%1, %0"); -#line 719 "rx-decode.opc" +#line 720 "rx-decode.opc" ID(divu); DR(rdst); SC(IMMex(im)); F_O___; } @@ -13719,9 +13751,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_120: { /** 1111 1101 0111 im00 1100rdst tst #%1, %2 */ -#line 492 "rx-decode.opc" +#line 493 "rx-decode.opc" int im AU = (op[1] >> 2) & 0x03; -#line 492 "rx-decode.opc" +#line 493 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13732,7 +13764,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("tst #%1, %2"); -#line 492 "rx-decode.opc" +#line 493 "rx-decode.opc" ID(and); SC(IMMex(im)); S2R(rdst); F__SZ_; } @@ -13741,9 +13773,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_121: { /** 1111 1101 0111 im00 1101rdst xor #%1, %0 */ -#line 471 "rx-decode.opc" +#line 472 "rx-decode.opc" int im AU = (op[1] >> 2) & 0x03; -#line 471 "rx-decode.opc" +#line 472 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13754,7 +13786,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("xor #%1, %0"); -#line 471 "rx-decode.opc" +#line 472 "rx-decode.opc" ID(xor); SC(IMMex(im)); DR(rdst); F__SZ_; } @@ -13763,9 +13795,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_122: { /** 1111 1101 0111 im00 1110rdst stz #%1, %0 */ -#line 417 "rx-decode.opc" +#line 418 "rx-decode.opc" int im AU = (op[1] >> 2) & 0x03; -#line 417 "rx-decode.opc" +#line 418 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13776,7 +13808,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("stz #%1, %0"); -#line 417 "rx-decode.opc" +#line 418 "rx-decode.opc" ID(stcc); SC(IMMex(im)); DR(rdst); S2cc(RXC_z); } @@ -13785,9 +13817,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_123: { /** 1111 1101 0111 im00 1111rdst stnz #%1, %0 */ -#line 420 "rx-decode.opc" +#line 421 "rx-decode.opc" int im AU = (op[1] >> 2) & 0x03; -#line 420 "rx-decode.opc" +#line 421 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13798,7 +13830,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("stnz #%1, %0"); -#line 420 "rx-decode.opc" +#line 421 "rx-decode.opc" ID(stcc); SC(IMMex(im)); DR(rdst); S2cc(RXC_nz); /*----------------------------------------------------------------------*/ @@ -13816,7 +13848,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: { /** 1111 1101 0111 0010 0000 rdst fsub #%1, %0 */ -#line 927 "rx-decode.opc" +#line 928 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13826,7 +13858,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("fsub #%1, %0"); -#line 927 "rx-decode.opc" +#line 928 "rx-decode.opc" ID(fsub); DR(rdst); SC(IMM(0)); F__SZ_; } @@ -13834,7 +13866,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x10: { /** 1111 1101 0111 0010 0001 rdst fcmp #%1, %0 */ -#line 921 "rx-decode.opc" +#line 922 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13844,7 +13876,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("fcmp #%1, %0"); -#line 921 "rx-decode.opc" +#line 922 "rx-decode.opc" ID(fcmp); DR(rdst); SC(IMM(0)); F_OSZ_; } @@ -13852,7 +13884,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x20: { /** 1111 1101 0111 0010 0010 rdst fadd #%1, %0 */ -#line 915 "rx-decode.opc" +#line 916 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13862,7 +13894,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("fadd #%1, %0"); -#line 915 "rx-decode.opc" +#line 916 "rx-decode.opc" ID(fadd); DR(rdst); SC(IMM(0)); F__SZ_; } @@ -13870,7 +13902,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x30: { /** 1111 1101 0111 0010 0011 rdst fmul #%1, %0 */ -#line 936 "rx-decode.opc" +#line 937 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13880,7 +13912,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("fmul #%1, %0"); -#line 936 "rx-decode.opc" +#line 937 "rx-decode.opc" ID(fmul); DR(rdst); SC(IMM(0)); F__SZ_; } @@ -13888,7 +13920,7 @@ rx_decode_opcode (unsigned long pc AU, case 0x40: { /** 1111 1101 0111 0010 0100 rdst fdiv #%1, %0 */ -#line 942 "rx-decode.opc" +#line 943 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -13898,7 +13930,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("fdiv #%1, %0"); -#line 942 "rx-decode.opc" +#line 943 "rx-decode.opc" ID(fdiv); DR(rdst); SC(IMM(0)); F__SZ_; } @@ -13913,22 +13945,33 @@ rx_decode_opcode (unsigned long pc AU, case 0x00: op_semantics_124: { - /** 1111 1101 0111 im11 000crdst mvtc #%1, %0 */ -#line 1032 "rx-decode.opc" + /** 1111 1101 0111 im11 000c rdst mvtc #%1, %0 */ +#line 1049 "rx-decode.opc" int im AU = (op[1] >> 2) & 0x03; -#line 1032 "rx-decode.opc" - int crdst AU = op[2] & 0x1f; +#line 1049 "rx-decode.opc" + int c AU = (op[2] >> 4) & 0x01; +#line 1049 "rx-decode.opc" + int rdst AU = op[2] & 0x0f; if (trace) { printf ("\033[33m%s\033[0m %02x %02x %02x\n", - "/** 1111 1101 0111 im11 000crdst mvtc #%1, %0 */", + "/** 1111 1101 0111 im11 000c rdst mvtc #%1, %0 */ ", op[0], op[1], op[2]); printf (" im = 0x%x,", im); - printf (" crdst = 0x%x\n", crdst); + printf (" c = 0x%x,", c); + printf (" rdst = 0x%x\n", rdst); } SYNTAX("mvtc #%1, %0"); -#line 1032 "rx-decode.opc" - ID(mov); SC(IMMex(im)); DR(crdst + 16); +#line 1049 "rx-decode.opc" + if (((c*16+rdst) == 1) || ((c*16+rdst) > 0xD || ((c*16+rdst) > 0xC && machine == bfd_mach_rx))) + { + /* fake a non existent control reg in order not to mess up decoding */ + ID(mov); SC(IMMex(im)); DR(40); + } + else + { + ID(mov); SC(IMMex(im)); DR(c*16+rdst + 16); + } } break; @@ -13987,9 +14030,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_125: { /** 1111 1101 0111 0101 1000 rdst rsrc 0000 dmov.l %1, %0 */ -#line 1176 "rx-decode.opc" +#line 1216 "rx-decode.opc" int rdst AU = op[2] & 0x0f; -#line 1176 "rx-decode.opc" +#line 1216 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; if (trace) { @@ -14000,7 +14043,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("dmov.l %1, %0"); -#line 1176 "rx-decode.opc" +#line 1216 "rx-decode.opc" ID(dmov); DR(rdst); SDRL(rsrc); F_____; } @@ -14009,9 +14052,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_126: { /** 1111 1101 0111 0101 1000 rdst rsrc 0010 dmov.l %1, %0 */ -#line 1173 "rx-decode.opc" +#line 1213 "rx-decode.opc" int rdst AU = op[2] & 0x0f; -#line 1173 "rx-decode.opc" +#line 1213 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; if (trace) { @@ -14022,7 +14065,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("dmov.l %1, %0"); -#line 1173 "rx-decode.opc" +#line 1213 "rx-decode.opc" ID(dmov); DR(rdst); SDRH(rsrc); F_____; } @@ -14031,9 +14074,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_127: { /** 1111 1101 0111 0101 1000 rdst rsrc 0100 mvfdc %1, %0 */ -#line 1226 "rx-decode.opc" +#line 1266 "rx-decode.opc" int rdst AU = op[2] & 0x0f; -#line 1226 "rx-decode.opc" +#line 1266 "rx-decode.opc" int rsrc AU = (op[3] >> 4) & 0x0f; if (trace) { @@ -14044,7 +14087,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("mvfdc %1, %0"); -#line 1226 "rx-decode.opc" +#line 1266 "rx-decode.opc" ID(mvfdc); DR(rdst); SCR(rsrc); F_____; } @@ -14307,7 +14350,7 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_128: { /** 1111 1101 0111 0110 1100 rsrc 0000 0000 save %1 */ -#line 1161 "rx-decode.opc" +#line 1201 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; if (trace) { @@ -14317,7 +14360,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("save %1"); -#line 1161 "rx-decode.opc" +#line 1201 "rx-decode.opc" ID(save); SR(rsrc); F_____; } @@ -14483,7 +14526,7 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_129: { /** 1111 1101 0111 0110 1101 rsrc 0000 0000 rstr %1 */ -#line 1155 "rx-decode.opc" +#line 1195 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; if (trace) { @@ -14493,7 +14536,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rsrc = 0x%x\n", rsrc); } SYNTAX("rstr %1"); -#line 1155 "rx-decode.opc" +#line 1195 "rx-decode.opc" ID(rstr); SR(rsrc); F_____; } @@ -14661,7 +14704,7 @@ rx_decode_opcode (unsigned long pc AU, op[0], op[1], op[2]); } SYNTAX("save #%1"); -#line 1164 "rx-decode.opc" +#line 1204 "rx-decode.opc" ID(save); SC(IMM(1)); F_____; } @@ -14676,7 +14719,7 @@ rx_decode_opcode (unsigned long pc AU, op[0], op[1], op[2]); } SYNTAX("rstr #%1"); -#line 1158 "rx-decode.opc" +#line 1198 "rx-decode.opc" ID(rstr); SC(IMM(1)); F_____; } @@ -14730,9 +14773,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_130: { /** 1111 1101 0111 0111 1000 rsrc rdst 0000 dmov.l %1, %0 */ -#line 1170 "rx-decode.opc" +#line 1210 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; -#line 1170 "rx-decode.opc" +#line 1210 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; if (trace) { @@ -14743,7 +14786,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("dmov.l %1, %0"); -#line 1170 "rx-decode.opc" +#line 1210 "rx-decode.opc" ID(dmov); DDRL(rdst); SR(rsrc); F_____; } @@ -14753,11 +14796,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_131: { /** 1111 1101 0111 0111 1000 rsrc rdst 001s dmov%s %1, %0 */ -#line 1167 "rx-decode.opc" +#line 1207 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; -#line 1167 "rx-decode.opc" +#line 1207 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; -#line 1167 "rx-decode.opc" +#line 1207 "rx-decode.opc" int s AU = op[3] & 0x01; if (trace) { @@ -14769,7 +14812,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" s = 0x%x\n", s); } SYNTAX("dmov%s %1, %0"); -#line 1167 "rx-decode.opc" +#line 1207 "rx-decode.opc" ID(dmov); DDRH(rdst); SR(rsrc); DL(s); F_____; } @@ -14777,22 +14820,22 @@ rx_decode_opcode (unsigned long pc AU, case 0x04: op_semantics_132: { - /** 1111 1101 0111 0111 1000 rdst rsrc 0100 mvtdc %1, %0 */ -#line 1232 "rx-decode.opc" - int rdst AU = op[2] & 0x0f; -#line 1232 "rx-decode.opc" - int rsrc AU = (op[3] >> 4) & 0x0f; + /** 1111 1101 0111 0111 1000 rsrc rdst 0100 mvtdc %1, %0 */ +#line 1272 "rx-decode.opc" + int rsrc AU = op[2] & 0x0f; +#line 1272 "rx-decode.opc" + int rdst AU = (op[3] >> 4) & 0x0f; if (trace) { printf ("\033[33m%s\033[0m %02x %02x %02x %02x\n", - "/** 1111 1101 0111 0111 1000 rdst rsrc 0100 mvtdc %1, %0 */", + "/** 1111 1101 0111 0111 1000 rsrc rdst 0100 mvtdc %1, %0 */", op[0], op[1], op[2], op[3]); - printf (" rdst = 0x%x,", rdst); - printf (" rsrc = 0x%x\n", rsrc); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); } SYNTAX("mvtdc %1, %0"); -#line 1232 "rx-decode.opc" - ID(mvtdc); DCR(rdst); SR(rsrc); F_____; +#line 1272 "rx-decode.opc" + ID(mvtdc); SR(rsrc); DCR(rdst); F_____; } break; @@ -14800,9 +14843,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_133: { /** 1111 1101 0111 0111 1000 rsrc rdst 1001 itod %1, %0 */ -#line 1274 "rx-decode.opc" +#line 1314 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; -#line 1274 "rx-decode.opc" +#line 1314 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; if (trace) { @@ -14813,7 +14856,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("itod %1, %0"); -#line 1274 "rx-decode.opc" +#line 1314 "rx-decode.opc" ID(itod); DDR(rdst); SR(rsrc); F_____; } @@ -14822,9 +14865,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_134: { /** 1111 1101 0111 0111 1000 rsrc rdst 1010 ftod %1, %0 */ -#line 1271 "rx-decode.opc" +#line 1311 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; -#line 1271 "rx-decode.opc" +#line 1311 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; if (trace) { @@ -14835,7 +14878,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("ftod %1, %0"); -#line 1271 "rx-decode.opc" +#line 1311 "rx-decode.opc" ID(ftod); DDR(rdst); SR(rsrc); F_____; } @@ -14844,9 +14887,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_135: { /** 1111 1101 0111 0111 1000 rsrc rdst 1101 utod %1, %0 */ -#line 1277 "rx-decode.opc" +#line 1317 "rx-decode.opc" int rsrc AU = op[2] & 0x0f; -#line 1277 "rx-decode.opc" +#line 1317 "rx-decode.opc" int rdst AU = (op[3] >> 4) & 0x0f; if (trace) { @@ -14857,7 +14900,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("utod %1, %0"); -#line 1277 "rx-decode.opc" +#line 1317 "rx-decode.opc" ID(dsqrt); DDR(rdst); SR(rsrc); F_____; } @@ -15366,11 +15409,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_136: { /** 1111 1101 100immmm rsrc rdst shlr #%2, %1, %0 */ -#line 757 "rx-decode.opc" +#line 758 "rx-decode.opc" int immmm AU = op[1] & 0x1f; -#line 757 "rx-decode.opc" +#line 758 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 757 "rx-decode.opc" +#line 758 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -15382,7 +15425,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("shlr #%2, %1, %0"); -#line 757 "rx-decode.opc" +#line 758 "rx-decode.opc" ID(shlr); S2C(immmm); SR(rsrc); DR(rdst); F__SZC; /*----------------------------------------------------------------------*/ @@ -15679,11 +15722,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_137: { /** 1111 1101 101immmm rsrc rdst shar #%2, %1, %0 */ -#line 747 "rx-decode.opc" +#line 748 "rx-decode.opc" int immmm AU = op[1] & 0x1f; -#line 747 "rx-decode.opc" +#line 748 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 747 "rx-decode.opc" +#line 748 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -15695,7 +15738,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("shar #%2, %1, %0"); -#line 747 "rx-decode.opc" +#line 748 "rx-decode.opc" ID(shar); S2C(immmm); SR(rsrc); DR(rdst); F_0SZC; @@ -15990,11 +16033,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_138: { /** 1111 1101 110immmm rsrc rdst shll #%2, %1, %0 */ -#line 737 "rx-decode.opc" +#line 738 "rx-decode.opc" int immmm AU = op[1] & 0x1f; -#line 737 "rx-decode.opc" +#line 738 "rx-decode.opc" int rsrc AU = (op[2] >> 4) & 0x0f; -#line 737 "rx-decode.opc" +#line 738 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -16006,7 +16049,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("shll #%2, %1, %0"); -#line 737 "rx-decode.opc" +#line 738 "rx-decode.opc" ID(shll); S2C(immmm); SR(rsrc); DR(rdst); F_OSZC; @@ -16315,11 +16358,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_139: { /** 1111 1101 111 bittt cond rdst bm%2 #%1, %0%S0 */ -#line 1011 "rx-decode.opc" +#line 1012 "rx-decode.opc" int bittt AU = op[1] & 0x1f; -#line 1011 "rx-decode.opc" +#line 1012 "rx-decode.opc" int cond AU = (op[2] >> 4) & 0x0f; -#line 1011 "rx-decode.opc" +#line 1012 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -16331,7 +16374,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("bm%2 #%1, %0%S0"); -#line 1011 "rx-decode.opc" +#line 1012 "rx-decode.opc" ID(bmcc); BWL(LSIZE); S2cc(cond); SC(bittt); DR(rdst); /*----------------------------------------------------------------------*/ @@ -16343,9 +16386,9 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_140: { /** 1111 1101 111bittt 1111 rdst bnot #%1, %0 */ -#line 1004 "rx-decode.opc" +#line 1005 "rx-decode.opc" int bittt AU = op[1] & 0x1f; -#line 1004 "rx-decode.opc" +#line 1005 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -16356,7 +16399,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("bnot #%1, %0"); -#line 1004 "rx-decode.opc" +#line 1005 "rx-decode.opc" ID(bnot); BWL(LSIZE); SC(bittt); DR(rdst); @@ -17185,13 +17228,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_141: { /** 1111 1110 00sz isrc bsrc rdst mov%s %0, [%1, %2] */ -#line 363 "rx-decode.opc" +#line 364 "rx-decode.opc" int sz AU = (op[1] >> 4) & 0x03; -#line 363 "rx-decode.opc" +#line 364 "rx-decode.opc" int isrc AU = op[1] & 0x0f; -#line 363 "rx-decode.opc" +#line 364 "rx-decode.opc" int bsrc AU = (op[2] >> 4) & 0x0f; -#line 363 "rx-decode.opc" +#line 364 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -17204,7 +17247,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("mov%s %0, [%1, %2]"); -#line 363 "rx-decode.opc" +#line 364 "rx-decode.opc" ID(movbir); sBWL(sz); DR(rdst); SRR(isrc); S2R(bsrc); F_____; } @@ -17642,13 +17685,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_142: { /** 1111 1110 01sz isrc bsrc rdst mov%s [%1, %2], %0 */ -#line 360 "rx-decode.opc" +#line 361 "rx-decode.opc" int sz AU = (op[1] >> 4) & 0x03; -#line 360 "rx-decode.opc" +#line 361 "rx-decode.opc" int isrc AU = op[1] & 0x0f; -#line 360 "rx-decode.opc" +#line 361 "rx-decode.opc" int bsrc AU = (op[2] >> 4) & 0x0f; -#line 360 "rx-decode.opc" +#line 361 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -17661,7 +17704,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("mov%s [%1, %2], %0"); -#line 360 "rx-decode.opc" +#line 361 "rx-decode.opc" ID(movbi); sBWL(sz); DR(rdst); SRR(isrc); S2R(bsrc); F_____; } @@ -18099,13 +18142,13 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_143: { /** 1111 1110 11sz isrc bsrc rdst movu%s [%1, %2], %0 */ -#line 366 "rx-decode.opc" +#line 367 "rx-decode.opc" int sz AU = (op[1] >> 4) & 0x03; -#line 366 "rx-decode.opc" +#line 367 "rx-decode.opc" int isrc AU = op[1] & 0x0f; -#line 366 "rx-decode.opc" +#line 367 "rx-decode.opc" int bsrc AU = (op[2] >> 4) & 0x0f; -#line 366 "rx-decode.opc" +#line 367 "rx-decode.opc" int rdst AU = op[2] & 0x0f; if (trace) { @@ -18118,7 +18161,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" rdst = 0x%x\n", rdst); } SYNTAX("movu%s [%1, %2], %0"); -#line 366 "rx-decode.opc" +#line 367 "rx-decode.opc" ID(movbi); uBW(sz); DR(rdst); SRR(isrc); S2R(bsrc); F_____; } @@ -18563,11 +18606,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_144: { /** 1111 1111 0000 rdst srca srcb sub %2, %1, %0 */ -#line 570 "rx-decode.opc" +#line 571 "rx-decode.opc" int rdst AU = op[1] & 0x0f; -#line 570 "rx-decode.opc" +#line 571 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 570 "rx-decode.opc" +#line 571 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -18579,7 +18622,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("sub %2, %1, %0"); -#line 570 "rx-decode.opc" +#line 571 "rx-decode.opc" ID(sub); DR(rdst); SR(srcb); S2R(srca); F_OSZC; /*----------------------------------------------------------------------*/ @@ -18732,11 +18775,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_145: { /** 1111 1111 0010 rdst srca srcb add %2, %1, %0 */ -#line 537 "rx-decode.opc" +#line 538 "rx-decode.opc" int rdst AU = op[1] & 0x0f; -#line 537 "rx-decode.opc" +#line 538 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 537 "rx-decode.opc" +#line 538 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -18748,7 +18791,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("add %2, %1, %0"); -#line 537 "rx-decode.opc" +#line 538 "rx-decode.opc" ID(add); DR(rdst); SR(srcb); S2R(srca); F_OSZC; /*----------------------------------------------------------------------*/ @@ -18901,11 +18944,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_146: { /** 1111 1111 0011 rdst srca srcb mul %2, %1, %0 */ -#line 677 "rx-decode.opc" +#line 678 "rx-decode.opc" int rdst AU = op[1] & 0x0f; -#line 677 "rx-decode.opc" +#line 678 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 677 "rx-decode.opc" +#line 678 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -18917,7 +18960,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("mul %2, %1, %0"); -#line 677 "rx-decode.opc" +#line 678 "rx-decode.opc" ID(mul); DR(rdst); SR(srcb); S2R(srca); F_____; /*----------------------------------------------------------------------*/ @@ -19070,11 +19113,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_147: { /** 1111 1111 0100 rdst srca srcb and %2, %1, %0 */ -#line 447 "rx-decode.opc" +#line 448 "rx-decode.opc" int rdst AU = op[1] & 0x0f; -#line 447 "rx-decode.opc" +#line 448 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 447 "rx-decode.opc" +#line 448 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -19086,7 +19129,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("and %2, %1, %0"); -#line 447 "rx-decode.opc" +#line 448 "rx-decode.opc" ID(and); DR(rdst); SR(srcb); S2R(srca); F__SZ_; /*----------------------------------------------------------------------*/ @@ -19239,11 +19282,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_148: { /** 1111 1111 0101 rdst srca srcb or %2, %1, %0 */ -#line 465 "rx-decode.opc" +#line 466 "rx-decode.opc" int rdst AU = op[1] & 0x0f; -#line 465 "rx-decode.opc" +#line 466 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 465 "rx-decode.opc" +#line 466 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -19255,7 +19298,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("or %2, %1, %0"); -#line 465 "rx-decode.opc" +#line 466 "rx-decode.opc" ID(or); DR(rdst); SR(srcb); S2R(srca); F__SZ_; /*----------------------------------------------------------------------*/ @@ -19408,11 +19451,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_149: { /** 1111 1111 0110 rdst srca srcb xor %2, %1, %0 */ -#line 1146 "rx-decode.opc" +#line 1186 "rx-decode.opc" int rdst AU = op[1] & 0x0f; -#line 1146 "rx-decode.opc" +#line 1186 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 1146 "rx-decode.opc" +#line 1186 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -19424,7 +19467,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("xor %2, %1, %0"); -#line 1146 "rx-decode.opc" +#line 1186 "rx-decode.opc" ID(xor); DR(rdst); SR(srcb); S2R(srca); F__SZ_; } @@ -19574,11 +19617,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_150: { /** 1111 1111 1000 rdst srca srcb fsub %2, %1, %0 */ -#line 1125 "rx-decode.opc" +#line 1165 "rx-decode.opc" int rdst AU = op[1] & 0x0f; -#line 1125 "rx-decode.opc" +#line 1165 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 1125 "rx-decode.opc" +#line 1165 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -19590,7 +19633,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("fsub %2, %1, %0"); -#line 1125 "rx-decode.opc" +#line 1165 "rx-decode.opc" ID(fsub); DR(rdst); SR(srcb); S2R(srca); F__SZ_; } @@ -19740,11 +19783,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_151: { /** 1111 1111 1010 rdst srca srcb fadd %2, %1, %0 */ -#line 1122 "rx-decode.opc" +#line 1162 "rx-decode.opc" int rdst AU = op[1] & 0x0f; -#line 1122 "rx-decode.opc" +#line 1162 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 1122 "rx-decode.opc" +#line 1162 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -19756,7 +19799,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("fadd %2, %1, %0"); -#line 1122 "rx-decode.opc" +#line 1162 "rx-decode.opc" ID(fadd); DR(rdst); SR(srcb); S2R(srca); F__SZ_; } @@ -19906,11 +19949,11 @@ rx_decode_opcode (unsigned long pc AU, op_semantics_152: { /** 1111 1111 1011 rdst srca srcb fmul %2, %1, %0 */ -#line 1128 "rx-decode.opc" +#line 1168 "rx-decode.opc" int rdst AU = op[1] & 0x0f; -#line 1128 "rx-decode.opc" +#line 1168 "rx-decode.opc" int srca AU = (op[2] >> 4) & 0x0f; -#line 1128 "rx-decode.opc" +#line 1168 "rx-decode.opc" int srcb AU = op[2] & 0x0f; if (trace) { @@ -19922,7 +19965,7 @@ rx_decode_opcode (unsigned long pc AU, printf (" srcb = 0x%x\n", srcb); } SYNTAX("fmul %2, %1, %0"); -#line 1128 "rx-decode.opc" +#line 1168 "rx-decode.opc" ID(fmul); DR(rdst); SR(srcb); S2R(srca); F__SZ_; } @@ -20069,7 +20112,7 @@ rx_decode_opcode (unsigned long pc AU, break; default: UNSUPPORTED(); break; } -#line 1280 "rx-decode.opc" +#line 1320 "rx-decode.opc" return rx->n_bytes; } diff --git a/opcodes/rx-decode.opc b/opcodes/rx-decode.opc index 084a13f4b0e0..5b61e2b6de31 100644 --- a/opcodes/rx-decode.opc +++ b/opcodes/rx-decode.opc @@ -1,5 +1,5 @@ /* -*- c -*- */ -/* Copyright (C) 2012-2024 Free Software Foundation, Inc. +/* Copyright (C) 2012-2025 Free Software Foundation, Inc. Contributed by Red Hat. Written by DJ Delorie. @@ -92,9 +92,9 @@ static int _ld[2] = rx->op[n].size = s ) /* This is for the BWL and BW bitfields. */ -static int SCALE[] = { 1, 2, 4, 0 }; +static int SCALE[4] = { 1, 2, 4, 0 }; /* This is for the prefix size enum. */ -static int PSCALE[] = { 4, 1, 1, 1, 2, 2, 2, 3, 4, 8 }; +static int PSCALE[RX_MAX_SIZE] = { 4, 1, 1, 1, 2, 2, 2, 3, 4, 4, 0 }; #define GET_SCALE(_indx) ((unsigned)(_indx) < ARRAY_SIZE (SCALE) ? SCALE[(_indx)] : 0) #define GET_PSCALE(_indx) ((unsigned)(_indx) < ARRAY_SIZE (PSCALE) ? PSCALE[(_indx)] : 0) @@ -288,7 +288,8 @@ int rx_decode_opcode (unsigned long pc AU, RX_Opcode_Decoded * rx, int (* getbyte)(void *), - void * ptr) + void * ptr, + unsigned long machine) { LocalData lds, * ld = &lds; unsigned char op[20] = {0}; @@ -1023,20 +1024,59 @@ rx_decode_opcode (unsigned long pc AU, ID(mvtipl); SC(immm); /** 0111 1110 111 crdst popc %0 */ +if ((crdst == 1) || (crdst > 0xD || (crdst > 0xC && machine == bfd_mach_rx))) +{ + /* fake a non existent control reg in order not to mess up decoding */ + ID(mov); OP(1, RX_Operand_Postinc, 0, 0); DR(40); +} +else +{ ID(mov); OP(1, RX_Operand_Postinc, 0, 0); DR(crdst + 16); +} /** 0111 1110 110 crsrc pushc %1 */ + if (crsrc > 0xD || (crsrc > 0xC && machine == bfd_mach_rx)) + { + /* fake a non existent control reg in order not to mess up decoding */ + ID(mov); OP(0, RX_Operand_Predec, 0, 0); SR(40); + } + else + { ID(mov); OP(0, RX_Operand_Predec, 0, 0); SR(crsrc + 16); + } -/** 1111 1101 0111 im11 000crdst mvtc #%1, %0 */ - ID(mov); SC(IMMex(im)); DR(crdst + 16); +/** 1111 1101 0111 im11 000c rdst mvtc #%1, %0 */ +if (((c*16+rdst) == 1) || ((c*16+rdst) > 0xD || ((c*16+rdst) > 0xC && machine == bfd_mach_rx))) +{ + /* fake a non existent control reg in order not to mess up decoding */ + ID(mov); SC(IMMex(im)); DR(40); +} +else +{ + ID(mov); SC(IMMex(im)); DR(c*16+rdst + 16); +} /** 1111 1101 0110 100c rsrc rdst mvtc %1, %0 */ +if (((c*16+rdst) == 1) || ((c*16+rdst) > 0xD || ((c*16+rdst) > 0xC && machine == bfd_mach_rx))) +{ + /* fake a non existent control reg in order not to mess up decoding */ + ID(mov); SR(rsrc); DR(40); +} +else +{ ID(mov); SR(rsrc); DR(c*16+rdst + 16); +} /** 1111 1101 0110 101s rsrc rdst mvfc %1, %0 */ +if ((s*16+rsrc) > 0xD || ((s*16+rsrc) > 0xC && machine == bfd_mach_rx)) +{ + /* fake a non existent control reg in order not to mess up decoding */ + ID(mov); SR(40); DR(rdst); +} +else +{ ID(mov); SR((s*16+rsrc) + 16); DR(rdst); - +} /*----------------------------------------------------------------------*/ /* INTERRUPTS */ @@ -1228,8 +1268,8 @@ rx_decode_opcode (unsigned long pc AU, /** 0111 0101 1001 0000 0001 1011 mvfdr */ ID(mvfdr); F_____; -/** 1111 1101 0111 0111 1000 rdst rsrc 0100 mvtdc %1, %0 */ - ID(mvtdc); DCR(rdst); SR(rsrc); F_____; +/** 1111 1101 0111 0111 1000 rsrc rdst 0100 mvtdc %1, %0 */ + ID(mvtdc); SR(rsrc); DCR(rdst); F_____; /** 0111 0110 1001 0000 rsrc 1100 rdst 0001 dabs %1, %0 */ ID(dabs); DDR(rdst); SDR(rsrc); F_____; diff --git a/opcodes/rx-dis.c b/opcodes/rx-dis.c index f9d6e77f72a8..b86160a9ced2 100644 --- a/opcodes/rx-dis.c +++ b/opcodes/rx-dis.c @@ -1,5 +1,5 @@ /* Disassembler code for Renesas RX. - Copyright (C) 2008-2024 Free Software Foundation, Inc. + Copyright (C) 2008-2025 Free Software Foundation, Inc. Contributed by Red Hat. Written by DJ Delorie. @@ -212,8 +212,8 @@ get_size_name (unsigned int size) } -int -print_insn_rx (bfd_vma addr, disassemble_info * dis) +static int +print_insn_rx_internal (bfd_vma addr, disassemble_info * dis, unsigned long machine) { int rv; RX_Data rx_data; @@ -231,7 +231,7 @@ print_insn_rx (bfd_vma addr, disassemble_info * dis) return -1; } - rv = rx_decode_opcode (addr, &opcode, rx_get_byte, &rx_data); + rv = rx_decode_opcode (addr, &opcode, rx_get_byte, &rx_data, machine); dis->bytes_per_line = 10; @@ -250,12 +250,12 @@ print_insn_rx (bfd_vma addr, disassemble_info * dis) PR (PS, ".byte "); rx_data.dis->read_memory_func (rx_data.pc - rv, buf, rv, rx_data.dis); - + for (i = 0 ; i < rv; i++) PR (PS, "0x%02x ", buf[i]); return rv; } - + for (s = opcode.syntax; *s; s++) { if (*s != '%') @@ -303,13 +303,12 @@ print_insn_rx (bfd_vma addr, disassemble_info * dis) { int imm = opcode.op[2].addend; int slsb, dlsb, width; - dlsb = (imm >> 5) & 0x1f; slsb = (imm & 0x1f); - slsb = (slsb >= 0x10?(slsb ^ 0x1f) + 1:slsb); slsb = dlsb - slsb; - slsb = (slsb < 0?-slsb:slsb); + slsb = (slsb < 0?32+slsb:slsb); width = ((imm >> 10) & 0x1f) - dlsb; + width = (width < 0?32+width:width); PR (PS, "#%d, #%d, #%d, %s, %s", slsb, dlsb, width, get_register_name (opcode.op[1].reg), @@ -385,3 +384,29 @@ print_insn_rx (bfd_vma addr, disassemble_info * dis) return rv; } + +/* this info is available also in info.bfd_arch_info->mach, +unfortunately we can't modify that when we overwrite the machine using -rx-force-isa=... */ +int +print_insn_rx (bfd_vma addr, disassemble_info * dis) +{ + return print_insn_rx_internal(addr, dis, bfd_mach_rx); +} + +int +print_insn_rxv2 (bfd_vma addr, disassemble_info * dis) +{ + return print_insn_rx_internal(addr, dis, bfd_mach_rx_v2); +} + +int +print_insn_rxv3 (bfd_vma addr, disassemble_info * dis) +{ + return print_insn_rx_internal(addr, dis, bfd_mach_rx_v3); +} + +int +print_insn_rxv3_dfpu (bfd_vma addr, disassemble_info * dis) +{ + return print_insn_rx_internal(addr, dis, bfd_mach_rx_v3_dfpu); +}